2012-07-17 190 views
1

假設我在霓虹燈中有64位d寄存器。可以說它存儲值ABCDEFGH。 現在我想o增加一個& E,B & F,C & G,d & H和等..這裏是什麼內在的,它可以使這樣的操作在霓虹燈寄存器中添加

我看了看文檔,但沒有找到合適的東西。

+0

這是什麼「等」?你能確切地說明你想達到什麼嗎? – 2012-07-17 05:54:44

+0

其實我正在做一些圖像操作操作。我的圖像是RGBA格式。我想添加r,g,b和兩個連續像素的分量。 – 2012-07-17 05:56:34

+0

此外,最初我試圖使用vld4q加載數據並使用成對添加。但是在一次操作中,所有16個寄存器都被使用,錯誤被裁剪出來。 – 2012-07-17 05:58:04

回答

1

如果要以16位執行加法操作,即生成uint16x4結果,則可以使用vmovl將輸入向量從uint8x8提升爲uint8x16,然後使用vadd添加較低和較高的一半。在NEON內在表達,這是通過

const int16x8_t t = vmovl_u8(input); 
const int16x4_t r = vadd_u16(vget_low(t), vget_high(t)) 

這實現應編譯以下組件(d0爲64位輸入寄存器,d1是64位的輸出寄存器)。請注意,vget_low和vget_high不會產生任何指令 - 這些內在函數通過適當的寄存器分配來實現,通過利用Q寄存器來命名兩個連續的D寄存器是一種方便的方法。 Q {n}指對(D {2n},D {2n + 1})。

VMOVL.U8 q1, d0 
VADD.I16 d1, d2 

如果你想在8位被執行的運算,並在溢出的情況下飽和,做

const int8x8_t t = vreinterpret_u8_u64(vshr_n_u64(vreinterpret_u64_u8(input), 32)); 
const int8x8_t r = vqadd_u8(input, t); 

這編譯成(D0是輸入一遍,在D1輸出)

VSHR.U64 d1, d0, #32 
VQADD.I8 d1, d0 

通過用VADD替換VQADD,結果將在溢出時換行而不是飽和到0xff。