2011-01-26 16 views
1

我目前移植atomic.hpp出提升的一個項目,並希望推廣的原子附加功能,由此它的模板的類型補充:使用XADD不同的整數寬度

template <typename T, typename V> 
inline T add(volatile T* mem, V val) 
{ 
    T r; 

    asm volatile 
    (
     "lock\n\t" 
     "xadd %1, %0": 
     "+m"(*mem), "=r"(r): 
     "1"(val): 
     "memory", "cc" 
    ); 

    return r; 
} 

我可以找不到明確的文檔,因爲使用帶符號和無符號8,16,32和64位數字是安全的。有人知道嗎?

+0

你有沒有考慮過使用重載而不是模板? – 2011-01-26 19:12:05

+0

我可以做但我仍然需要知道使用xadd作爲有符號和無符號的8位到64位數字是安全的...... – Graeme 2011-01-26 19:25:45

回答

2

是的,您可以在IA32或IA64下使用lock xadd,所有類型的數字8,16,32和64位有符號或無符號。 內存對齊不需要,但如果是,則內存訪問速度更快。

英特爾手冊:

鎖定前綴的完整性是 不會受 內存領域的對齊方式。對於任意未對齊的 字段,內存鎖定爲 。該指令的操作 在非64位模式和 64位模式下是相同的。

警告!

如果LOCK前綴用於與XADD指令和源 操作數是存儲器操作數,可 產生一個 未定義操作碼異常(#UD)。

所以源操作數必須是寄存器,而目標操作數是存儲器地址!