2014-10-31 234 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會有所幫助。