2016-03-01 35 views
1

我想在ASIMD彙編指令中實現按位提取矢量指令。讓我這樣說吧,在ARMv7的NEON指令,假設我有內部q15q11一些價值觀,我有:ASIMD指令中的按位提取矢量(ARM平臺)

"vext.8 d30, d30, d22, #4 \n\t" 
"vext.8 d31, d31, d23, #4 \n\t" 

正如你所看到的,我提取從底部4字節元素d22的結尾和d30的頂端的4個字節的元素。然後我將它們組合成一個64位寄存器d30(上面的第一條指令)。在q載體的後半部分(d31d23)上完成相同的操作。現在,我想在ARMv8 ASIMD指令中實現完全相同的邏輯。在ASIMD vext替換指令是ext和它的定義爲:

EXT VD(T),VN(T),VM(T),#INDEX

按位提取物(載體)。 。其中(T)是8B或16B。該索引是0到nelem((T)) - 1範圍內的即時值。

我的問題是,我如何使用這個指令來構建我的兩個SIMD向量相同的邏輯註冊v15v11例如。

回答

2

您應該首先注意到,在Aarch64中,寄存器的組織方式不同。在Aarch32中,Q15是{D31,D30}。在Aarch64中,D31是Q31的底部,在談論元素時可以將其描述爲V31。

沒有直接等同於Aarch64在這種情況下,因爲你不能直接訪問四寄存器的頂部64位,但我認爲你應該能夠取代它:

INS V15.S[0], V11.S[0] 
INS V15.S[2], V11.S[2] 

參考: http://infocenter.arm.com/help/topic/com.arm.doc.dui0802b/INS_advsimd_elt_vector.html

+0

我不確定我的答案是否很清楚。 ''EXT v15.8,v15.8,v11.8,#4「似乎在向量寄存器的下半部分(我的意思是'v15.d [0]'和'v11.d [0 ]')。然而,沒有辦法可以在這些向量的後半部分(我的意思是'v15.d [1]'和'v11.d [1]')做這個操作。在ARMv7中,正如你可以在我的問題中看到的,我們可以簡單地用'「vext.8」做到這一點。「d31,d31,d23,#4 \ n \ t」' – A23149577

+0

對不起,我誤解了你的描述。 – Dric512

0

不知道,如果你發現你的答案,或者如果這是你的預期目標:

正如@ Dric512表示,我認爲你可以使用SIMD數據移動指令,INS。

在下面的例子中,我們將數字3和2分別插入到32位通道中的向量10和11中。

然後我們將相應的元素插入向量15的兩個32位通道;由此導致所有的位進入向量的64位通道15.

mov w1, 3                                     
mov w2, 2                                     

ins v10.s[0], w1                                    
ins v11.s[1], w2                                    

ins v15.s[1], v11.s[1]                                  
ins v15.s[0], v10.s[0] 

下面是使用P/T ...,顯示的gdb結果$ v10.ss,$ v11.ss,$ v15.ss在基數2中,最後的p/t $ v15.ds顯示64位的位模式。我不確定這是否有幫助,但也許它會啓動泵。

67    mov w1, 3 
(gdb) si 
$82 = {0, 0, 0, 0} 
$83 = {0, 0, 0, 0} 
$84 = {0, 0, 0, 0} 
68    mov w2, 2 
(gdb) 
$85 = {0, 0, 0, 0} 
$86 = {0, 0, 0, 0} 
$87 = {0, 0, 0, 0} 
70    ins v10.s[0], w1 
(gdb) 
$88 = {11, 0, 0, 0} 
$89 = {0, 0, 0, 0} 
$90 = {0, 0, 0, 0} 
71    ins v11.s[1], w2 
(gdb) 
$91 = {11, 0, 0, 0} 
$92 = {0, 10, 0, 0} 
$93 = {0, 0, 0, 0} 
73    ins v15.s[1], v11.s[1] 
(gdb) 
$94 = {11, 0, 0, 0} 
$95 = {0, 10, 0, 0} 
$96 = {0, 10, 0, 0} 
74    ins v15.s[0], v10.s[0] 
(gdb) 
$97 = {11, 0, 0, 0} 
$98 = {0, 10, 0, 0} 
$99 = {11, 10, 0, 0} 
.exit0() at stuff.s:78 
78  _exit 
(gdb) p/t $v15.d.s 
$100 = {1000000000000000000000000000000011, 0}