2017-03-24 6 views
-1

Es ist eine Frage sehr ähnlich zu diesem one.armv8-a: testen, ob SIMD-Register ist! = 0

Auf ARMv7-a, ich habe folgende Assembler-Code:

vcmp.f64 d0, #0 
vmrs APSR_nzcv, fpscr 
beq .jumpover 

Wie kann ich diesen Code zu konvertieren ARMv8-a? Ich möchte testen, ob es in v0.16b Pixel gibt, die nicht Null sind.

EDIT # 1

Ich dachte an so etwas wie:

addv b0, v0.16b 
fcmp s0, #0.0 
beq .jumpover 

Ist das richtig? Außerdem habe ich die folgende Anweisung gelesen: "Gleitkomma-FCMP- und FCCMP-Anweisungen setzen die Integer-Bedingungsflags direkt und ändern nicht die Bedingungs-Flags im FPSR." was ich nicht 100% sicher verstehe.

+0

Bitte siehe https://www.element14.com/community/servlet/JiveServlet/previewBody/41836-102-1-229511/ARM.Reference_Manual.pdf. Lools wie Sie Daten Bewegungsbefehle wollen. Sie könnten umov w2, v0.8b [1] dann cmp w2, # 0 – InfinitelyManic

+0

Ihre Frage ergibt keinen Sinn, da Sie Daten in einem ganzzahligen Datenformat beschreiben, aber sprechen über die Durchführung eines Gleitkomma-Vergleichs. –

+0

ADDV d, Vn. Integer Summenelemente zu Skalar (Vektor). Wobei / B/8B, B/16B, H/4H, H/8H, S/2S oder S/4S ist. – InfinitelyManic

Antwort

1

SH1 in den Kommentaren fand eine Arbeitslösung:

mov x0, v0.d[0] 
cmp x0, #0 
beq .jumpover 

mov x0, v0.d[1] 
cmp x0, #0 
beq .jumpover 

Sie haben es für beide d zu tun [0] und d [1], um die 16 Punkte zu überprüfen.

+1

Ja - das macht Sinn! – InfinitelyManic

0

Müssen die Zyklen für smov w1, v1.h [0] überprüfen; welches ein einzelnes SIMD-Element ist, wird zum allgemeinen Register bewegt.

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) 
+0

Danke für den Vorschlag etwas. Ich habe so etwas auf armv7-a gemacht, aber ich denke, es ist völlig ineffizient. Weil Sie den Preis bezahlen, um aus SIMD-Daten 8 mal zu extrahieren und dann jedes Mal zu vergleichen. Ich bin kein Neon-Experte, aber mir wurde gesagt, dass es sehr teuer ist. – gregoiregentil

+1

Oh, ich verstehe. Ja, der Wechsel zwischen regulären Registern und dem SIMD-Register kann teuer werden. Weitere Informationen finden Sie im Abschnitt "Vektorarithmetik" ab Seite 111. Es gibt einige Vektorvergleichsmasken, die möglicherweise Ihren Vorstellungen entsprechen. Ich lösche meine Antwort. – InfinitelyManic

+1

Ungelöschte und bearbeitete Originalantwort, – InfinitelyManic