标签: dpd

包装BCD到DPD:如何改进这个amd64装配程序?

我正在编写一个例程,用于在BCD(每位十进制4位)和密集包装十进制(DPD)(每3位十进制数位10位)之间进行转换.在Mike Cowlishaw的网站上进一步记录了DPD(建议软件使用查找表).


这个例程只需要它使用的低16位寄存器,但对于较短的指令编码,我尽可能使用32位指令.与代码相关的速度惩罚如下:

mov data,%eax # high 16 bit of data are cleared
...
shl %al
shr %eax
Run Code Online (Sandbox Code Playgroud)

要么

and $0x888,%edi         #   = 0000 a000 e000 i000
imul $0x0490,%di        #   = aei0 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)

其中16位的替代方案imul是32位imul,后续and或一系列lea指令和最终指令and.

我的例程中的整个代码可以在下面找到.由于我混合使用单词和双字指令,其中的表现是否有任何可能性更差?

        .section .text
        .type bcd2dpd_mul,@function
        .globl bcd2dpd_mul

        # convert BCD to DPD with multiplication tricks
        # input abcd efgh iklm in edi
        .align 8
bcd2dpd_mul:
        mov %edi,%eax           # …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly bcd dpd

9
推荐指数
2
解决办法
508
查看次数

标签 统计

assembly ×1

bcd ×1

dpd ×1

performance ×1

x86 ×1