armv8-a:测试SIMD寄存器是否为!= 0

时间:2017-03-24 20:54:07

标签: assembly arm 64-bit neon

这是一个与此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

这是对的吗?另外,我读了以下语句"浮点FCMP和FCCMP指令直接设置整数条件标志,并且不修改FPSR中的条件标志。"我并非100%肯定会理解。

2 个答案:

答案 0 :(得分:1)

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个像素。

答案 1 :(得分:0)

需要检查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)