armv8-a:测试 SIMD 寄存器是否为 != 0
armv8-a: test if SIMD register is != 0
这个问题和这个one非常相似。
在armv7-a上,我的汇编代码如下:
vcmp.f64 d0, #0
vmrs APSR_nzcv, fpscr
beq .jumpover
如何将此代码转换为 armv8-a?我想测试v0.16b中是否有任何非零像素。
编辑#1
我在想类似的事情:
addv b0, v0.16b
fcmp s0, #0.0
beq .jumpover
这是正确的吗?此外,我阅读了以下声明 "Floating point FCMP and FCCMP instructions set the integer condition flags directly, and do not modify the condition flags in the FPSR.",我不是 100% 肯定理解。
需要检查 smov w1 的周期,v1.h[0];这是单个 SIMD 元素移动到通用寄存器。
data
array: .byte 0,0,0,0,0,0,1,0
.text
.global main
main:
ldr x20,=array // array pointer
ld1 {v0.8b}, [x20] // just for eg.,
cmgt v1.8b, v0.8b, #0 // any non-zero values ?
addv b1, v1.8b // vector reduce across lanes - element 0 in all sizes will hold some value :: conjecture
smov w1, v1.h[0] // sign or unsigned - don't matter - index 0 will have some value - check cycles
cmp w1, #0 //
cset w1, ne // just to test - (branch)
sh1 在评论中找到了可行的解决方案:
mov x0, v0.d[0]
cmp x0, #0
beq .jumpover
mov x0, v0.d[1]
cmp x0, #0
beq .jumpover
您必须对 d[0] 和 d[1] 都执行此操作以检查 16 个像素。
这个问题和这个one非常相似。
在armv7-a上,我的汇编代码如下:
vcmp.f64 d0, #0
vmrs APSR_nzcv, fpscr
beq .jumpover
如何将此代码转换为 armv8-a?我想测试v0.16b中是否有任何非零像素。
编辑#1
我在想类似的事情:
addv b0, v0.16b
fcmp s0, #0.0
beq .jumpover
这是正确的吗?此外,我阅读了以下声明 "Floating point FCMP and FCCMP instructions set the integer condition flags directly, and do not modify the condition flags in the FPSR.",我不是 100% 肯定理解。
需要检查 smov w1 的周期,v1.h[0];这是单个 SIMD 元素移动到通用寄存器。
data
array: .byte 0,0,0,0,0,0,1,0
.text
.global main
main:
ldr x20,=array // array pointer
ld1 {v0.8b}, [x20] // just for eg.,
cmgt v1.8b, v0.8b, #0 // any non-zero values ?
addv b1, v1.8b // vector reduce across lanes - element 0 in all sizes will hold some value :: conjecture
smov w1, v1.h[0] // sign or unsigned - don't matter - index 0 will have some value - check cycles
cmp w1, #0 //
cset w1, ne // just to test - (branch)
sh1 在评论中找到了可行的解决方案:
mov x0, v0.d[0]
cmp x0, #0
beq .jumpover
mov x0, v0.d[1]
cmp x0, #0
beq .jumpover
您必须对 d[0] 和 d[1] 都执行此操作以检查 16 个像素。