天道酬勤,学无止境

dpd

将 BCD 打包到 DPD:如何改进这个 amd64 汇编程序?(Packing BCD to DPD: How to improve this amd64 assembly routine?)

问题 我正在编写一个例程来在 BCD(每十进制数字 4 位)和密集压缩十进制 (DPD)(每 3 位十进制数字 10 位)之间进行转换。 在 Mike Cowlishaw 的网站上进一步记录了 DPD(建议使用查找表的软件)。 这个例程只需要它使用的寄存器的低 16 位,但为了更短的指令编码,我尽可能使用 32 位指令。 是与代码相关的速度损失,例如: mov data,%eax # high 16 bit of data are cleared ... shl %al shr %eax 或者 and $0x888,%edi # = 0000 a000 e000 i000 imul $0x0490,%di # = aei0 0000 0000 0000 其中 16 位imul的替代方案是 32 位imul和后续的and或一系列lea指令和最终的and 。 我的例程中的整个代码可以在下面找到。 由于我混合了 word 和 dword 指令,其中是否有任何性能比可能更差的地方? .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

2021-06-23 06:15:42    分类:技术分享    performance   assembly   x86   bcd   dpd

Packing BCD to DPD: How to improve this amd64 assembly routine?

I'm writing a routine to convert between BCD (4 bits per decimal digit) and Densely Packed Decimal (DPD) (10 bits per 3 decimal digits). DPD is further documented (with the suggestion for software to use lookup-tables) on Mike Cowlishaw's web site. This routine only ever requires the lower 16 bit of the registers it uses, yet for shorter instruction encoding I have used 32 bit instructions wherever possible. Is a speed penalty associated with code like: mov data,%eax # high 16 bit of data are cleared ... shl %al shr %eax or and $0x888,%edi # = 0000 a000 e000 i000 imul $0x0490,%di # = aei0 0000

2021-04-19 16:23:28    分类:问答    performance   assembly   x86   bcd   dpd