LAOXU 发表于 2024-1-25 19:42:59

MDU32C 定型流片了吗?

模拟小数乘法程序(浮点乘除用):



// 模拟小数乘法
               MOV      A,R7
               PUSH   ACC
               MOV      A,R6
               PUSH   ACC
               MOV      A,R3
               PUSH   ACC
               MOV      A,R2
               PUSH   ACC
               MOV      A,R5
               PUSH   ACC
               MOV      A,R4
               PUSH   ACC
               MOV      A,R1
               PUSH   ACC
               MOV      A,R0
               PUSH   ACC

                   CLR                A
                   MOV      R0,A
                   MOV      R1,A
                   MOV      R4,A
                   MOV      R5,A
//                   LCALL      MUL32   // R2R3 * R6R7 --> R4R5R6R7
//                   LCALL      ADD32   // R4R5 --> DPH1,DPL1
                   MOV      R0,SP
                   MOV      A,@R0
                   MOV      R2,A
                   DEC                R0
                   MOV      A,@R0
                   MOV      R3,A
                   DEC                R0
                   DEC                R0
                   DEC                R0
                   DEC                R0
                   MOV      A,@R0
                   MOV      R6,A
                   DEC                R0
                   MOV      A,@R0
                   MOV      R7,A
                   CLR                A
                   MOV      R0,A
                   MOV      R1,A
                   MOV      R4,A
                   MOV      R5,A
//                   LCALL      MUL32   // R0R1 * R6R7 --> R4R5R6R7
//                   LCALL      ADD32   // R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1

                   DEC                R0
                   DEC                R0
                   MOV      A,@R0
                   MOV      R2,A
                   DEC                R0
                   MOV      A,@R0
                   MOV      R3,A
                   DEC                R0
                   MOV      A,@R0
                   MOV      R6,A
                   DEC                R0
                   MOV      A,@R0
                   MOV      R7,A
                   CLR                A
                   MOV      R0,A
                   MOV      R1,A
                   MOV      R4,A
                   MOV      R5,A
//                   LCALL      MUL32   // R2R3 * R4R5 --> R4R5R6R7
//                   LCALL      ADD32   // R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1

                   POP                ACC
                   MOV      R2,A
                   POP                ACC
                   MOV      R3,A
                   POP                ACC
                   MOV      R6,A
                   POP                ACC
                   MOV      R7,A
                   MOV      A,SP
                   ADD                A,#-4
                   MOV      SP,A
                   CLR                A
                   MOV      R0,A
                   MOV      R1,A
                   MOV      R4,A
                   MOV      R5,A
//                   LCALL      MUL32   // R0R1 * R4R5 --> R4R5R6R7
//                   LCALL      ADD32   // R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7




神农鼎 发表于 2024-5-2 18:27:19

MDU32C
STC8H2K32U-45I-LQFP32 已微信小商城上架销售
本坛网友,全部【免费+包邮 送】
深圳国芯人工智能有限公司-产品_STC8G系列 (stcai.com)















LAOXU 发表于 2024-1-25 19:59:31

其中 数次 16位 * 16位 = 32位 相乘, 再叠加 --> 寄存器 暂存,程序片段 还没加入.

程序超长, 效率低下, 分析原因:

1. 模拟小数运算, 只能用 整数 16位 * 16位 = 32位 相乘(取高 16位)

2. 32位 运算占用 整个 R0-R7寄存器, 重入函数的临时变量, 只能放在 SP堆栈中, 51不支持堆栈变量, 故执行效率低.

3. 如有可能, 请考虑增加一条 小数 32位 * 32位 = 32位 乘法指令, 代替以上一大堆 模拟小数运算程序.

4. 算术左移右移, 最末移出位, 如有可能, 请放在 Cy中, 便于级联, 四舍五入等操作.

神农鼎 发表于 2024-1-25 20:15:40

STC8H2K32U-45MHz-LQFP32 + MDU32C 已启动流片流程,不想改了
否则又要等 2个月

LAOXU 发表于 2024-1-26 02:56:01

以后有机会改吧,搞个 增强型 MDU32C+版本.

LAOXU 发表于 2024-1-26 08:03:00

优化了一下 模拟小数乘法, 感觉还行, 可重入函数, 占用 4级堆栈, 到时 样片到手, 测试对比一下与标准浮点库的速度之比.


// 模拟小数乘法        R0R1R2R3 * R4R5R6R7 --> R4R5R6R7
/*                  R2R3 * R6R7 -->         R4R5R6R7 , R4R5 --> DPH1,DPL1
                  R2R3 * R4R5 -->   R4R5R6R7_0_0 , R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1
                  R0R1 * R6R7 -->   R4R5R6R7_0_0 , R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1
                  R0R1 * R4R5 --> R4R5R6R7_0_0_0_0 , R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7

                        R4R5R6R7 规格化 --> R5R6R7,DPL1 , 指数DPL --> R4
*/
             MOV      B,R1
             MOV      DPH,R0
             MOV      A,R7
             PUSH   ACC
             MOV      A,R6
             PUSH   ACC
             MOV      A,R5
             PUSH   ACC
             MOV      A,R4
             PUSH   ACC

                   CLR                A
                   MOV      R0,A
                   MOV      R1,A
                   MOV      R4,A
                   MOV      R5,A
//                   LCALL        MUL32   // R2R3 * R6R7 --> R4R5R6R7
                   MOV      DPH1,R4          // R4R5 --> DPH1,DPL1
                   MOV      DPL1,R5

                   MOV                R0,SP
                   MOV      A,@R0
                   MOV      R6,A
                   DEC                R0
                   MOV      A,@R0
                   MOV      R7,A
                   CLR                A
                   MOV      R0,A
;                   MOV      R1,A
                   MOV      R4,A
                   MOV      R5,A
//                   LCALL        MUL32   // R2R3 * R4R5 --> R4R5R6R7
                   MOV      R2,DPH1          // DPH1,DPL1 --> R0R1R2R3
                   MOV      R3,DPL1
//                   LCALL        ADD32   // R4R5R6R7 + DPH1,DPL1 --> DPH,B,DPH1,DPL1
             MOV      R2,DPH
             MOV      R3,B
                   MOV      DPH,R4
                   MOV      B,R5
                   MOV      DPH1,R6
                   MOV      DPL1,R7

                   MOV                R0,SP
                   DEC                R0
                   DEC                R0
                   MOV      A,@R0
                   MOV      R6,A
                   DEC                R0
                   MOV      A,@R0
                   MOV      R7,A
                   CLR                A
                   MOV      R0,A
;                   MOV      R1,A
                   MOV      R4,A
                   MOV      R5,A
//                   LCALL        MUL32   // R0R1 * R6R7 --> R4R5R6R7
                   MOV      R0,DPH
                   MOV      R1,B
                   XCH      R2,DPH1   // 原 R2R3 --> DPH1,DPL1
                   XCH      R3,DPL1
//                   LCALL        ADD32   // R4R5R6R7 + DPH,B,DPH1,DPL1 --> DPH1,DPL1
                   XCH      R6,DPH1   // DPH1,DPL1 --> R6R7(原R2R3)
                   XCH      R7,DPL1          

                   POP                ACC
                   MOV      R2,A
                   POP                ACC
                   MOV      R3,A
                   POP                ACC
                   POP                ACC
//                   LCALL        MUL32   // R0R1 * R4R5 --> R4R5R6R7
//                   LCALL        ADD32   // R4R5R6R7 + DPH1,DPL1 --> R4R5R6R7

//                   LCALL        RSLA32          // R4R5R6R7 规格化 --> R5R6R7,DPL1 , 指数DPL --> R4

                   MOV      C,F0        // 标准浮点数返回, 加入符号
         MOV      A,DPL       
             RRC      A
             XCH      A,R4
             MOV      ACC.7,C
             XCH      A,R5
             XCH      A,R6
             XCH      A,R7
             MOV      DPL,A
                   RET

神农鼎 发表于 2024-1-26 12:10:55

猜测,老许要的, 就是一個
32bX32b=64b的完整乘法器, 如果沒有这种乘法器,
他就必须拆解成 4 个 16bX16b=32b 的乘法,
要命的是还要到处找地方暂存结果、并且做移位累加。


我们目前MDU32C的乘法器功能是 32bX32b=32b, 结果"高"的ˇ32b 被丢弃了 !
料想, 应该也不合其使用。




神农鼎 发表于 2024-1-26 12:13:15

事实上, 在 MDU32C 中,
我们原本有做完整的, 只因为要配合 Keil-C51 ,
所以我们把它又拿掉了 !

LAOXU 发表于 2024-1-26 14:18:00

神农鼎 发表于 2024-1-26 12:10
猜测,老许要的, 就是一個
32bX32b=64b的完整乘法器, 如果沒有这种乘法器,
他就必须拆解成 4 個 16bX16b=3 ...

当时也提过, 32bX32b=64b, 结果"高"的ˇ32b 不能丢弃, 小数乘法(浮点数)要用 !!!

神农鼎 发表于 2024-1-26 14:20:56

要放到 【R0/R1/R2/R3】, 但 KEIL C51 经常会优化这优化那,可能会冲突;
只能再增加条指令 放【R0/R1/R2/R3】

LAOXU 发表于 2024-1-26 14:21:22

神农鼎 发表于 2024-1-26 12:13
事实上, 在 MDU32C 中,
我们原本有做完整的, 只因为要配合 Keil-C51 ,
所以我们把它又拿掉了 !


要配合 C51, 更应该要加 32bX32b=64b 乘法.


R0R1R2R3, R4R5R6R7 = R0R1R2R3 * R4R5R6R7; 多好啊~~~
页: [1] 2
查看完整版本: MDU32C 定型流片了吗?