BSWAP指令如何“加速执行十进制算术”?

时间:2014-10-31 21:21:39

标签: assembly x86

英特尔软件开发人员手册第1卷第7.3.1.2节规定BSWAP指令"加速十进制算术的执行"。它并没有解释这是怎么回事,谷歌也没有帮助。

有人可以开导我吗?

2 个答案:

答案 0 :(得分:8)

有点遗弃的评论,不是吗?

  

BSWAP(字节交换)指令反转32位寄存器操作数中的字节顺序。位位置0到7用24到31交换,位位置8到15用16到23交换。连续两次执行该指令使寄存器具有与之前相同的值。 BSWAP指令对于“big-endian”和“little-endian”数据格式之间的转换很有用。该指令还加速了十进制算术的执行。 (XCHG指令可用于交换字中的字节。)

而且,最重要的是,作为括号的最后一句与它似乎适用的陈述无关。并且,如果它不是意味着这样做,为什么要有括号。

我的结论是,doco仍然是由英特尔工程师而非技术作家编写的,他们会抓住那些针对英语的那些痛苦的罪行: - )


但是,关于它如何加速小数运算,只有一种可能性跳跃到脑海(而且,说实话,它更像是一次痛苦的爬行而不是跳跃)。

如果您有一个由十进制数字组成的大数字,每个字符一个,在内存中按顺序排列,如果您一次可以处理四位数字,则可能会有性能提升。但是,在little-endian机器上,将(顺序存储器中)字节{0x01, 0x02, 0x03, 0x04}作为32位值(dword)加载将为您提供0x04030201

在执行bswap之前,可以更轻松地将其作为dword进行操作,然后再将其作为另一个bswap进行回写。

当然,这种猜测(虽然我想考虑受过教育的推测(a)),但英特尔并不是这样。在你提到的文件中给我们很多东西。对于bswap的所有出现,搜索卷1,2a,2b,2c,3a,3b和3c似乎也没有明确说明。


(a)英特尔有一些"偷偷摸摸的"多年来我这样做的事情的说明,我记得最早的是daa/das指令,用于在使用基于字节的非BCD加法后调整BCD值(每个字节两个)。虽然我还没有进行详尽的搜索,但认为他们可能在dword中对数字字符有类似的东西并不超出可能性范围。

作为第一步,您可以查看英特尔的IDFPL,它们的库实现了IEEE754标准的小数侧,您可能会发现它在那里使用。如果没有,它可以用于其他高性能十进制库。

答案 1 :(得分:2)

通常对可变长度整数或压缩十进制数字的定点字符串执行十进制算术,并且以big-endian模式存储这些字符串可能更方便。数据可以一次4个字节加载到寄存器中,然后BSWAP用于交换数据。但是,如上所述,十进制调整指令是面向字节的,因此如果使用这些十进制调整指令,寄存器可以一次旋转8位以执行面向字节的数学运算。可以使用BSWAP而不是第一次旋转,但我在这里看不到多少优势。我不知道是否有一些聪明的技巧来实现32位压缩十进制加法,如果有,那么BSWAP会有所帮助。