2012-06-12 34 views
2

我一直使用下的gcc/x86的這個小功能做int16_t的快速字節交換:意義(等於VS加等)

static inline int16_t MySwapInt16t(int16_t val) 
{ 
    __asm__ ("xchgb %b0, %h0" : "=Q" (val) : "0" (val)); 
    return val; 
} 

...同時通過瀏覽今天別人的代碼就行,我看到他也有類似的功能,看起來像這樣:

static inline int16_t HisSwapInt16t(int16_t val) 
{ 
    __asm__ ("xchgb %h0, %b0" : "+Q" (val)); 
    return val; 
} 

我的功能和他的功能(AFAICT)之間的區別是:

  1. 他指定 「+ Q」 代替
  2. %H0和%B0的位置互換 「= Q」
  3. 他沒有: 「0」(VAL)在他的函數的末尾子句

據我所知,這兩種方案似乎正常工作,但內聯彙編是有點黑色藝術的我,所以能有人見地的解釋:

  1. 什麼是三個不同的意義以上所列?
  2. 是兩種實現更好或比其他更快的一個,或者將它們都進行等價?

回答

0

他指定 「+ Q」 代替 「= Q」

他沒有: 「0」(VAL)在他的功能

+改性劑的端子句代表一個輸入和輸出操作數,因此無需添加輸入列表,檢查CGG manual有關。

%H0和B0%的位置互換

我想這並不重要,因爲在xchg指令做兩個操作數之間的內容交換。

其中兩個實現比另一個更好還是更快,還是它們都執行等效?

爲了找出最好的實現,我將編譯和檢查objdump編譯器如何包裝這些函數,因爲核心函數將是相同的單個指令。

希望得到這個幫助!