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

Assembly armv8-a:测试SIMD寄存器是否为!=0,assembly,arm,64-bit,neon,Assembly,Arm,64 Bit,Neon,这是一个与此非常相似的问题 在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中的条件标志”。我不

这是一个与此非常相似的问题

在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%肯定理解这一点。

需要检查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像素。

请参见。就像你想要数据移动指令一样。您可以使用umov w2,v0.8b[1]然后使用cmp w2,#0您的问题没有意义,因为您是以整数数据格式描述数据的,但是谈论执行浮点比较。ADDV d,Vn。整数和元素到标量(向量)。其中/是B/8B、B/16B、H/4H、H/8H、S/2S或S/4S。@罗斯·里奇,我的代码在armv7-a上工作。我将8个字节加载到d0中,然后将向量作为浮点(64位)进行比较。阅读armv7-a规格。这肯定只是
movx0,v0.d[0];cmp x0,#0;beq.jumpover
?谢谢你的建议。我曾经在armv7-a上做过类似的事情,但我认为这是完全没有效率的。因为从SIMD数据中提取数据需要付出8倍的代价,然后每次进行比较。我不是霓虹灯专家,但有人告诉我它非常昂贵。哦,我明白了。是的,在常规寄存器和SIMD寄存器之间移动可能会很昂贵。请阅读从第111页开始的向量算术部分。有一些向量比较掩码可能是您想要的。我会删除我的答案。是的-这是有道理的!