2014-10-31 36 views

回答

6

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

BSWAP(字节交换)指令颠倒32位寄存器操作数的字节顺序。位0至7与24至31交换,位位置8至15与16至23交换。连续执行此指令两次,使寄存器的值与以前相同。 BSWAP指令可用于在“大端”和“小端”数据格式之间进行转换。这条指令也加速了十进制算术的执行。 (XCHG指令可用于交换字中的字节)。

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

的结论是,DOCO仍在写英特尔的工程师,而不是谁将会陷入对英语语言的那些痛苦的罪行:-)


但是,关于它如何高科技作家可以加速十进制运算,只有一种可能性突然出现(实际上,这是一个比跳跃更痛苦的爬行)。

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

做一个bswap就可以使它更容易操纵它作为双字,在写回之前做另一个bswap

当然,这是炒(虽然我想考虑学历炒作(一)),但英特尔没有给我们多给你参考文档中去。通过卷1,2a,2b,2c,3a,3b和3c搜索所有发生的bswap似乎也没有澄清它。


(一)英特尔不得不做这样的东西了好半天,其中最早的我还记得很有些“偷偷摸摸”的说明,使用调整后BCD值(每两个字节)的daa/das说明基于字节的非BCD添加。尽管我还没有做过彻底的搜索,但它并没有超越可能性的范围,认为它们可能在双词中具有类似的数字字符。

作为第一步,您可能会考虑英特尔的IDFPL,它们的库实现了IEEE754标准的小数点,您可能会发现它在那里使用。如果不是,它可能会用在其他高性能的十进制库中。

+0

没有什么像'dwords'(除非它是如此无证以至于我甚至没有在无证指令列表中读到它),那里只有'daa'-family(packed)和'aaa'-family (未包装) – harold 2014-10-31 22:03:39

2

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