]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 432161 Addition of arm64 v8.2 FADDP, FNEG and FSQRT
authorAssad Hashmi <assad.hashmi@linaro.org>
Fri, 29 Jan 2021 13:38:40 +0000 (08:38 -0500)
committerAssad Hashmi <assad.hashmi@linaro.org>
Fri, 29 Jan 2021 13:38:40 +0000 (08:38 -0500)
This patch adds FP half-precision support for the following:
FABS <Hd>, <Hn>
FABS <Vd>.<T>, <Vn>.<T>
FNEG <Hd>, <Hn>
FNEG <Vd>.<T>, <Vn>.<T>
FSQRT <Hd>, <Hn>
FSQRT <Vd>.<T>, <Vn>.<T>

Fixes https://bugs.kde.org/show_bug.cgi?id=432161

VEX/priv/guest_arm64_toIR.c
VEX/priv/host_arm64_defs.c
VEX/priv/host_arm64_defs.h
VEX/priv/host_arm64_isel.c
VEX/priv/ir_defs.c
VEX/pub/libvex_ir.h
memcheck/mc_translate.c
memcheck/tests/vbit-test/irops.c
none/tests/arm64/fp_and_simd_v82.c
none/tests/arm64/fp_and_simd_v82.stdout.exp

index 89231be29d01fe3c257da8a179fc43b457bb81a7..6c9762e5c69fedd2b5f7a785667a6f28cc101232 100644 (file)
@@ -580,6 +580,7 @@ static IROp mkDIVF ( IRType ty ) {
 
 static IROp mkNEGF ( IRType ty ) {
    switch (ty) {
+      case Ity_F16: return Iop_NegF16;
       case Ity_F32: return Iop_NegF32;
       case Ity_F64: return Iop_NegF64;
       default: vpanic("mkNEGF");
@@ -588,6 +589,7 @@ static IROp mkNEGF ( IRType ty ) {
 
 static IROp mkABSF ( IRType ty ) {
    switch (ty) {
+      case Ity_F16: return Iop_AbsF16;
       case Ity_F32: return Iop_AbsF32;
       case Ity_F64: return Iop_AbsF64;
       default: vpanic("mkABSF");
@@ -596,6 +598,7 @@ static IROp mkABSF ( IRType ty ) {
 
 static IROp mkSQRTF ( IRType ty ) {
    switch (ty) {
+      case Ity_F16: return Iop_SqrtF16;
       case Ity_F32: return Iop_SqrtF32;
       case Ity_F64: return Iop_SqrtF64;
       default: vpanic("mkSQRTF");
@@ -13491,6 +13494,58 @@ Bool dis_AdvSIMD_two_reg_misc(/*MB_OUT*/DisResult* dres, UInt insn)
 }
 
 
+static
+Bool dis_AdvSIMD_two_reg_misc_fp16(/*MB_OUT*/DisResult* dres, UInt insn)
+{
+   /* 31 30 29 28    23   21    16     11 9 4
+      0  Q  U  01110 size 11100 opcode 10 n d
+      Decode fields: U,size,opcode
+   */
+#  define INSN(_bMax,_bMin)  SLICE_UInt(insn, (_bMax), (_bMin))
+   if (INSN(31,31) != 0
+       || INSN(28,24) != BITS5(0,1,1,1,0)
+       || INSN(21,17) != BITS5(1,1,1,0,0)
+       || INSN(11,10) != BITS2(1,0)) {
+      return False;
+   }
+   UInt bitQ   = INSN(30,30);
+   UInt bitU   = INSN(29,29);
+   UInt size   = INSN(23,22);
+   UInt opcode = INSN(16,12);
+   UInt nn     = INSN(9,5);
+   UInt dd     = INSN(4,0);
+   vassert(size < 4);
+
+   if (size == X11 && opcode == BITS5(0,1,1,1,1)) {
+      /* -------- Q,0,11,01111: FABS 4h_4h, 8h_8h -------- */
+      /* -------- Q,1,11,01111: FNEG 4h_4h, 8h_8h -------- */
+      Bool   isFNEG = bitU == 1;
+      IROp   op     = isFNEG ? Iop_Neg16Fx8 : Iop_Abs16Fx8;
+      IRTemp res = newTempV128();
+      assign(res, unop(op, getQReg128(nn)));
+      putQReg128(dd, math_MAYBE_ZERO_HI64(bitQ, res));
+      const HChar* arr = bitQ == 0 ? "4h" : "8h";
+      DIP("%s %s.%s, %s.%s\n", isFNEG ? "fneg" : "fabs",
+          nameQReg128(dd), arr, nameQReg128(nn), arr);
+      return True;
+   }
+
+   if (bitU == 1 && size == X11 && opcode == BITS5(1,1,1,1,1)) {
+      /* -------- 1,11,11111: FSQRT 4h_4h, 8h_8h -------- */
+      IRTemp resV = newTempV128();
+      assign(resV, binop(Iop_Sqrt16Fx8, mkexpr(mk_get_IR_rounding_mode()),
+                             getQReg128(nn)));
+      putQReg128(dd, math_MAYBE_ZERO_HI64(bitQ, resV));
+      const HChar* arr = bitQ == 0 ? "4h" : "8h";
+      DIP("%s %s.%s, %s.%s\n", "fsqrt",
+          nameQReg128(dd), arr, nameQReg128(nn), arr);
+      return True;
+   }
+
+   return False;
+#  undef INSN
+}
+
 static
 Bool dis_AdvSIMD_vector_x_indexed_elem(/*MB_OUT*/DisResult* dres, UInt insn)
 {
@@ -14296,12 +14351,16 @@ Bool dis_AdvSIMD_fp_data_proc_1_source(/*MB_OUT*/DisResult* dres, UInt insn)
    UInt nn     = INSN(9,5);
    UInt dd     = INSN(4,0);
 
-   if (ty <= X01 && opcode <= BITS6(0,0,0,0,1,1)) {
+   if (opcode <= BITS6(0,0,0,0,1,1)) {
       /* -------- 0x,000000: FMOV  d_d, s_s -------- */
-      /* -------- 0x,000001: FABS  d_d, s_s -------- */
-      /* -------- 0x,000010: FNEG  d_d, s_s -------- */
-      /* -------- 0x,000011: FSQRT d_d, s_s -------- */
-      IRType ity = ty == X01 ? Ity_F64 : Ity_F32;
+      /* -------- 0x,000001: FABS  d_d, s_s, h_h --- */
+      /* -------- 0x,000010: FNEG  d_d, s_s, h_h --- */
+      /* -------- 0x,000011: FSQRT d_d, s_s, h_h --- */
+      IRType ity;
+      if (ty == X01) ity = Ity_F64;
+      else if (ty == X00) ity = Ity_F32;
+      else if (ty == X11) ity = Ity_F16;
+      else vassert(0);
       IRTemp src = newTemp(ity);
       IRTemp res = newTemp(ity);
       const HChar* nm = "??";
@@ -14312,7 +14371,7 @@ Bool dis_AdvSIMD_fp_data_proc_1_source(/*MB_OUT*/DisResult* dres, UInt insn)
          case BITS6(0,0,0,0,0,1):
             nm = "fabs"; assign(res, unop(mkABSF(ity), mkexpr(src))); break;
          case BITS6(0,0,0,0,1,0):
-            nm = "fabs"; assign(res, unop(mkNEGF(ity), mkexpr(src))); break;
+            nm = "fneg"; assign(res, unop(mkNEGF(ity), mkexpr(src))); break;
          case BITS6(0,0,0,0,1,1):
             nm = "fsqrt";
             assign(res, binop(mkSQRTF(ity), 
@@ -15090,6 +15149,8 @@ Bool dis_ARM64_simd_and_fp(/*MB_OUT*/DisResult* dres, UInt insn,
    if (UNLIKELY(ok)) return True;
    ok = dis_AdvSIMD_two_reg_misc(dres, insn);
    if (UNLIKELY(ok)) return True;
+   ok = dis_AdvSIMD_two_reg_misc_fp16(dres, insn);
+   if (UNLIKELY(ok)) return True;
    ok = dis_AdvSIMD_vector_x_indexed_elem(dres, insn);
    if (UNLIKELY(ok)) return True;
    ok = dis_AdvSIMD_crypto_aes(dres, insn);
index e6b06e5fbee0b2a507971915e7009b82699983f9..4423ced3e273cf95b757b159785eac813d619290 100644 (file)
@@ -748,8 +748,10 @@ static void showARM64VecUnaryOp(/*OUT*/const HChar** nm,
    switch (op) {
       case ARM64vecu_FNEG64x2:    *nm = "fneg ";   *ar = "2d";  return;
       case ARM64vecu_FNEG32x4:    *nm = "fneg ";   *ar = "4s";  return;
+      case ARM64vecu_FNEG16x8:    *nm = "fneg ";   *ar = "8h";  return;
       case ARM64vecu_FABS64x2:    *nm = "fabs ";   *ar = "2d";  return;
       case ARM64vecu_FABS32x4:    *nm = "fabs ";   *ar = "4s";  return;
+      case ARM64vecu_FABS16x8:    *nm = "fabs ";   *ar = "8h";  return;
       case ARM64vecu_NOT:         *nm = "not  ";   *ar = "all"; return;
       case ARM64vecu_ABS64x2:     *nm = "abs  ";   *ar = "2d";  return;
       case ARM64vecu_ABS32x4:     *nm = "abs  ";   *ar = "4s";  return;
@@ -777,6 +779,7 @@ static void showARM64VecUnaryOp(/*OUT*/const HChar** nm,
       case ARM64vecu_FRSQRTE32x4: *nm = "frsqrte"; *ar = "4s";  return;
       case ARM64vecu_FSQRT64x2:   *nm = "fsqrt";   *ar = "2d";  return;
       case ARM64vecu_FSQRT32x4:   *nm = "fsqrt";   *ar = "4s";  return;
+      case ARM64vecu_FSQRT16x8:   *nm = "fsqrt";   *ar = "8h";  return;
       default: vpanic("showARM64VecUnaryOp");
    }
 }
@@ -1173,6 +1176,14 @@ ARM64Instr* ARM64Instr_VUnaryS ( ARM64FpUnaryOp op, HReg dst, HReg src ) {
    i->ARM64in.VUnaryS.src = src;
    return i;
 }
+ARM64Instr* ARM64Instr_VUnaryH ( ARM64FpUnaryOp op, HReg dst, HReg src ) {
+   ARM64Instr* i = LibVEX_Alloc_inline(sizeof(ARM64Instr));
+   i->tag                 = ARM64in_VUnaryH;
+   i->ARM64in.VUnaryH.op  = op;
+   i->ARM64in.VUnaryH.dst = dst;
+   i->ARM64in.VUnaryH.src = src;
+   return i;
+}
 ARM64Instr* ARM64Instr_VBinD ( ARM64FpBinOp op,
                                HReg dst, HReg argL, HReg argR ) {
    ARM64Instr* i = LibVEX_Alloc_inline(sizeof(ARM64Instr));
@@ -1811,6 +1822,12 @@ void ppARM64Instr ( const ARM64Instr* i ) {
          vex_printf(", ");
          ppHRegARM64asSreg(i->ARM64in.VUnaryS.src);
          return;
+      case ARM64in_VUnaryH:
+         vex_printf("f%s ", showARM64FpUnaryOp(i->ARM64in.VUnaryH.op));
+         ppHRegARM64asHreg(i->ARM64in.VUnaryH.dst);
+         vex_printf(", ");
+         ppHRegARM64asHreg(i->ARM64in.VUnaryH.src);
+         return;
       case ARM64in_VBinD:
          vex_printf("f%s   ", showARM64FpBinOp(i->ARM64in.VBinD.op));
          ppHRegARM64(i->ARM64in.VBinD.dst);
@@ -2283,6 +2300,10 @@ void getRegUsage_ARM64Instr ( HRegUsage* u, const ARM64Instr* i, Bool mode64 )
          addHRegUse(u, HRmWrite, i->ARM64in.VUnaryS.dst);
          addHRegUse(u, HRmRead, i->ARM64in.VUnaryS.src);
          return;
+      case ARM64in_VUnaryH:
+         addHRegUse(u, HRmWrite, i->ARM64in.VUnaryH.dst);
+         addHRegUse(u, HRmRead, i->ARM64in.VUnaryH.src);
+         return;
       case ARM64in_VBinD:
          addHRegUse(u, HRmWrite, i->ARM64in.VBinD.dst);
          addHRegUse(u, HRmRead, i->ARM64in.VBinD.argL);
@@ -2557,6 +2578,10 @@ void mapRegs_ARM64Instr ( HRegRemap* m, ARM64Instr* i, Bool mode64 )
          i->ARM64in.VUnaryS.dst = lookupHRegRemap(m, i->ARM64in.VUnaryS.dst);
          i->ARM64in.VUnaryS.src = lookupHRegRemap(m, i->ARM64in.VUnaryS.src);
          return;
+      case ARM64in_VUnaryH:
+         i->ARM64in.VUnaryH.dst = lookupHRegRemap(m, i->ARM64in.VUnaryH.dst);
+         i->ARM64in.VUnaryH.src = lookupHRegRemap(m, i->ARM64in.VUnaryH.src);
+         return;
       case ARM64in_VBinD:
          i->ARM64in.VBinD.dst  = lookupHRegRemap(m, i->ARM64in.VBinD.dst);
          i->ARM64in.VBinD.argL = lookupHRegRemap(m, i->ARM64in.VBinD.argL);
@@ -2862,6 +2887,7 @@ static inline UInt qregEnc ( HReg r )
 #define X01000   BITS8(0,0,0, 0,1,0,0,0)
 #define X10000   BITS8(0,0,0, 1,0,0,0,0)
 #define X11000   BITS8(0,0,0, 1,1,0,0,0)
+#define X11001   BITS8(0,0,0, 1,1,0,0,1)
 #define X11110   BITS8(0,0,0, 1,1,1,1,0)
 #define X11111   BITS8(0,0,0, 1,1,1,1,1)
 
@@ -4505,6 +4531,35 @@ Int emit_ARM64Instr ( /*MB_MOD*/Bool* is_profInc,
          }
          goto bad;
       }
+      case ARM64in_VUnaryH: {
+         /* 31        23 21     16  14    9 4
+            000 11110 11 1 0000 0,1 10000 n d  FABS Hd, Hn
+            ------------------- 1,0 ---------  FNEG Hd, Hn
+            ------------------- 1,1 ---------  FSQRT Hd, Hn
+         */
+         UInt hD  = dregEnc(i->ARM64in.VUnaryH.dst);
+         UInt hN  = dregEnc(i->ARM64in.VUnaryH.src);
+         /* opc field (bits 15 and 16) */
+         UInt b16 = 2; /* impossible */
+         UInt b15 = 2; /* impossible */
+         switch (i->ARM64in.VUnaryH.op) {
+            case ARM64fpu_NEG:  b16 = 1; b15 = 0; break;
+            case ARM64fpu_SQRT: b16 = 1; b15 = 1; break;
+            case ARM64fpu_ABS:  b16 = 0; b15 = 1; break;
+            default: break;
+         }
+         /*
+            000, 11110 11 1,0000 01,10000 n d   FABS Hd, Hn
+            ---, ----- -- -,---- 10,----- n d   FNEG Hd, Hn
+            ---, ----- -- -,---- 11,----- n d   FSQRT Hd, Hn
+         */
+         if (b16 < 2 && b15 < 2) {
+            *p++ = X_3_8_5_6_5_5(X000, X11110111, (X0000 << 1) | b16,
+                                 (b15 << 5) | X10000, hN, hD);
+            goto done;
+         }
+         goto bad;
+      }
       case ARM64in_VBinD: {
          /* 31        23  20 15   11 9 4
             ---------------- 0000 ------   FMUL  --------
@@ -5291,8 +5346,10 @@ Int emit_ARM64Instr ( /*MB_MOD*/Bool* is_profInc,
          /* 31        23   20    15     9 4
             010 01110 11 1 00000 111110 n d  FABS Vd.2d,  Vn.2d
             010 01110 10 1 00000 111110 n d  FABS Vd.4s,  Vn.4s
+            010 01110 11 1 11000 111110 n d  FABS Vd.8h,  Vn.8h
             011 01110 11 1 00000 111110 n d  FNEG Vd.2d,  Vn.2d
             011 01110 10 1 00000 111110 n d  FNEG Vd.4s,  Vn.4s
+            011 01110 11 1 11000 111110 n d  FNEG Vd.8h,  Vn.8h
             011 01110 00 1 00000 010110 n d  NOT  Vd.16b, Vn.16b
 
             010 01110 11 1 00000 101110 n d  ABS  Vd.2d,  Vn.2d
@@ -5330,16 +5387,23 @@ Int emit_ARM64Instr ( /*MB_MOD*/Bool* is_profInc,
 
             011 01110 11 1 00001 111110 n d  FSQRT Vd.2d, Vn.2d
             011 01110 10 1 00001 111110 n d  FSQRT Vd.4s, Vn.4s
+            011 01110 11 1 11001 111110 n d  FSQRT Vd.8h, Vn.8h
          */
          UInt vD = qregEnc(i->ARM64in.VUnaryV.dst);
          UInt vN = qregEnc(i->ARM64in.VUnaryV.arg);
          switch (i->ARM64in.VUnaryV.op) {
+            case ARM64vecu_FABS16x8:
+               *p++ = X_3_8_5_6_5_5(X010, X01110111, X11000, X111110, vN, vD);
+               break;
             case ARM64vecu_FABS64x2:
                *p++ = X_3_8_5_6_5_5(X010, X01110111, X00000, X111110, vN, vD);
                break;
             case ARM64vecu_FABS32x4:
                *p++ = X_3_8_5_6_5_5(X010, X01110101, X00000, X111110, vN, vD);
                break;
+            case ARM64vecu_FNEG16x8:
+               *p++ = X_3_8_5_6_5_5(X011, X01110111, X11000, X111110, vN, vD);
+               break;
             case ARM64vecu_FNEG64x2:
                *p++ = X_3_8_5_6_5_5(X011, X01110111, X00000, X111110, vN, vD);
                break;
@@ -5427,6 +5491,9 @@ Int emit_ARM64Instr ( /*MB_MOD*/Bool* is_profInc,
             case ARM64vecu_FSQRT32x4:
                *p++ = X_3_8_5_6_5_5(X011, X01110101, X00001, X111110, vN, vD);
                break;
+            case ARM64vecu_FSQRT16x8:
+               *p++ = X_3_8_5_6_5_5(X011, X01110111, X11001, X111110, vN, vD);
+               break;
             default:
                goto bad;
          }
index 8cece7b9c578290a96c9de751c3d5b008c0d215a..6c35c4c5aa69ee2d0a14e864802a0374922a5d2b 100644 (file)
@@ -423,8 +423,8 @@ typedef
 
 typedef
    enum {
-      ARM64vecu_FNEG64x2=350, ARM64vecu_FNEG32x4,
-      ARM64vecu_FABS64x2,     ARM64vecu_FABS32x4,
+      ARM64vecu_FNEG64x2=350, ARM64vecu_FNEG32x4,     ARM64vecu_FNEG16x8,
+      ARM64vecu_FABS64x2,     ARM64vecu_FABS32x4,     ARM64vecu_FABS16x8,
       ARM64vecu_NOT,
       ARM64vecu_ABS64x2,      ARM64vecu_ABS32x4,
       ARM64vecu_ABS16x8,      ARM64vecu_ABS8x16,
@@ -439,7 +439,7 @@ typedef
       ARM64vecu_URSQRTE32x4,
       ARM64vecu_FRECPE64x2,   ARM64vecu_FRECPE32x4,
       ARM64vecu_FRSQRTE64x2,  ARM64vecu_FRSQRTE32x4,
-      ARM64vecu_FSQRT64x2,    ARM64vecu_FSQRT32x4,
+      ARM64vecu_FSQRT64x2,    ARM64vecu_FSQRT32x4,    ARM64vecu_FSQRT16x8,
       ARM64vecu_INVALID
    }
    ARM64VecUnaryOp;
@@ -524,6 +524,7 @@ typedef
       ARM64in_VCvtHD,   /* scalar 16 bit FP <--> 64 bit FP */
       ARM64in_VUnaryD,
       ARM64in_VUnaryS,
+      ARM64in_VUnaryH,
       ARM64in_VBinD,
       ARM64in_VBinS,
       ARM64in_VTriD,
@@ -824,6 +825,12 @@ typedef
             HReg           dst;
             HReg           src;
          } VUnaryS;
+         /* 16-bit FP unary */
+         struct {
+            ARM64FpUnaryOp op;
+            HReg           dst;
+            HReg           src;
+         } VUnaryH;
          /* 64-bit FP binary arithmetic */
          struct {
             ARM64FpBinOp op;
@@ -1025,6 +1032,7 @@ extern ARM64Instr* ARM64Instr_VCvtHS  ( Bool hToS, HReg dst, HReg src );
 extern ARM64Instr* ARM64Instr_VCvtHD  ( Bool hToD, HReg dst, HReg src );
 extern ARM64Instr* ARM64Instr_VUnaryD ( ARM64FpUnaryOp op, HReg dst, HReg src );
 extern ARM64Instr* ARM64Instr_VUnaryS ( ARM64FpUnaryOp op, HReg dst, HReg src );
+extern ARM64Instr* ARM64Instr_VUnaryH ( ARM64FpUnaryOp op, HReg dst, HReg src );
 extern ARM64Instr* ARM64Instr_VBinD   ( ARM64FpBinOp op, HReg, HReg, HReg );
 extern ARM64Instr* ARM64Instr_VBinS   ( ARM64FpBinOp op, HReg, HReg, HReg );
 extern ARM64Instr* ARM64Instr_VTriD   ( ARM64FpTriOp op, HReg dst,
index 8c090c37e10a5e3e93d1201a3b8fdadc2fec8d7d..1e5ce70674c862cb73362a9036e84b0875153c76 100644 (file)
@@ -2456,8 +2456,8 @@ static HReg iselV128Expr_wrk ( ISelEnv* env, IRExpr* e )
       /* Other cases */
       switch (e->Iex.Unop.op) {
          case Iop_NotV128:
-         case Iop_Abs64Fx2: case Iop_Abs32Fx4:
-         case Iop_Neg64Fx2: case Iop_Neg32Fx4:
+         case Iop_Abs64Fx2: case Iop_Abs32Fx4: case Iop_Abs16Fx8:
+         case Iop_Neg64Fx2: case Iop_Neg32Fx4: case Iop_Neg16Fx8:
          case Iop_Abs64x2:  case Iop_Abs32x4:
          case Iop_Abs16x8:  case Iop_Abs8x16:
          case Iop_Cls32x4:  case Iop_Cls16x8:  case Iop_Cls8x16:
@@ -2481,8 +2481,10 @@ static HReg iselV128Expr_wrk ( ISelEnv* env, IRExpr* e )
                case Iop_NotV128:           op = ARM64vecu_NOT;         break;
                case Iop_Abs64Fx2:          op = ARM64vecu_FABS64x2;    break;
                case Iop_Abs32Fx4:          op = ARM64vecu_FABS32x4;    break;
+               case Iop_Abs16Fx8:          op = ARM64vecu_FABS16x8;    break;
                case Iop_Neg64Fx2:          op = ARM64vecu_FNEG64x2;    break;
                case Iop_Neg32Fx4:          op = ARM64vecu_FNEG32x4;    break;
+               case Iop_Neg16Fx8:          op = ARM64vecu_FNEG16x8;    break;
                case Iop_Abs64x2:           op = ARM64vecu_ABS64x2;     break;
                case Iop_Abs32x4:           op = ARM64vecu_ABS32x4;     break;
                case Iop_Abs16x8:           op = ARM64vecu_ABS16x8;     break;
@@ -2592,14 +2594,19 @@ static HReg iselV128Expr_wrk ( ISelEnv* env, IRExpr* e )
 
    if (e->tag == Iex_Binop) {
       switch (e->Iex.Binop.op) {
+         case Iop_Sqrt16Fx8:
          case Iop_Sqrt32Fx4:
          case Iop_Sqrt64Fx2: {
             HReg arg = iselV128Expr(env, e->Iex.Binop.arg2);
             HReg res = newVRegV(env);
             set_FPCR_rounding_mode(env, e->Iex.Binop.arg1);
-            ARM64VecUnaryOp op 
-               = e->Iex.Binop.op == Iop_Sqrt32Fx4
-                    ? ARM64vecu_FSQRT32x4 : ARM64vecu_FSQRT64x2;
+            ARM64VecUnaryOp op;
+            switch (e->Iex.Binop.op) {
+               case Iop_Sqrt16Fx8: op = ARM64vecu_FSQRT16x8; break;
+               case Iop_Sqrt32Fx4: op = ARM64vecu_FSQRT32x4; break;
+               case Iop_Sqrt64Fx2: op = ARM64vecu_FSQRT64x2; break;
+               default: vassert(0);
+            }
             addInstr(env, ARM64Instr_VUnaryV(op, res, arg));
             return res;
          }
@@ -3694,6 +3701,25 @@ static HReg iselF16Expr_wrk ( ISelEnv* env, IRExpr* e )
       }
    }
 
+   if (e->tag == Iex_Unop) {
+      switch (e->Iex.Unop.op) {
+         case Iop_NegF16: {
+            HReg srcH = iselF16Expr(env, e->Iex.Unop.arg);
+            HReg dstH = newVRegD(env);
+            addInstr(env, ARM64Instr_VUnaryH(ARM64fpu_NEG, dstH, srcH));
+            return dstH;
+         }
+         case Iop_AbsF16: {
+            HReg srcH = iselF16Expr(env, e->Iex.Unop.arg);
+            HReg dstH = newVRegD(env);
+            addInstr(env, ARM64Instr_VUnaryH(ARM64fpu_ABS, dstH, srcH));
+            return dstH;
+         }
+         default:
+            break;
+      }
+   }
+
    if (e->tag == Iex_Binop) {
       switch (e->Iex.Binop.op) {
          case Iop_F32toF16: {
@@ -3710,6 +3736,13 @@ static HReg iselF16Expr_wrk ( ISelEnv* env, IRExpr* e )
             addInstr(env, ARM64Instr_VCvtHD(False/*!hToD*/, dstH, srcD));
             return dstH;
          }
+         case Iop_SqrtF16: {
+            HReg src = iselF16Expr(env, e->Iex.Binop.arg2);
+            set_FPCR_rounding_mode(env, e->Iex.Binop.arg1);
+            HReg dst = newVRegD(env);
+            addInstr(env, ARM64Instr_VUnaryH(ARM64fpu_SQRT, dst, src));
+            return dst;
+         }
          default:
             break;
       }
index 2734776f5b1ab8cb74a639d7175bb2a67a7acfa9..9940903b3a68a79f3d70bd706af8dac278ff2e24 100644 (file)
@@ -342,8 +342,11 @@ void ppIROp ( IROp op )
       case Iop_AbsF64:        vex_printf("AbsF64"); return;
       case Iop_NegF32:        vex_printf("NegF32"); return;
       case Iop_AbsF32:        vex_printf("AbsF32"); return;
+      case Iop_NegF16:        vex_printf("NegF16"); return;
+      case Iop_AbsF16:        vex_printf("AbsF16"); return;
       case Iop_SqrtF64:       vex_printf("SqrtF64"); return;
       case Iop_SqrtF32:       vex_printf("SqrtF32"); return;
+      case Iop_SqrtF16:       vex_printf("SqrtF16"); return;
       case Iop_SinF64:    vex_printf("SinF64"); return;
       case Iop_CosF64:    vex_printf("CosF64"); return;
       case Iop_TanF64:    vex_printf("TanF64"); return;
@@ -688,6 +691,7 @@ void ppIROp ( IROp op )
       case Iop_RecipEst64Fx2: vex_printf("RecipEst64Fx2"); return;
       case Iop_RecipStep64Fx2: vex_printf("RecipStep64Fx2"); return;
 
+      case Iop_Abs16Fx8:  vex_printf("Abs16Fx8"); return;
       case Iop_Abs32Fx4:  vex_printf("Abs32Fx4"); return;
       case Iop_Abs64Fx2:  vex_printf("Abs64Fx2"); return;
       case Iop_RSqrtStep32Fx4:  vex_printf("RSqrtStep32Fx4"); return;
@@ -698,6 +702,7 @@ void ppIROp ( IROp op )
       case Iop_RSqrtEst32F0x4: vex_printf("RSqrtEst32F0x4"); return;
       case Iop_RSqrtEst32Fx8: vex_printf("RSqrtEst32Fx8"); return;
 
+      case Iop_Sqrt16Fx8:  vex_printf("Sqrt16Fx8"); return;
       case Iop_Sqrt32Fx4:  vex_printf("Sqrt32Fx4"); return;
       case Iop_Sqrt32F0x4: vex_printf("Sqrt32F0x4"); return;
       case Iop_Sqrt64Fx2:  vex_printf("Sqrt64Fx2"); return;
@@ -743,6 +748,7 @@ void ppIROp ( IROp op )
       case Iop_Neg64Fx2: vex_printf("Neg64Fx2"); return;
       case Iop_Neg32Fx4: vex_printf("Neg32Fx4"); return;
       case Iop_Neg32Fx2: vex_printf("Neg32Fx2"); return;
+      case Iop_Neg16Fx8: vex_printf("Neg16Fx8"); return;
 
       case Iop_F32x4_2toQ16x8: vex_printf("F32x4_2toQ16x8"); return;
       case Iop_F64x2_2toQ32x4: vex_printf("F64x2_2toQ32x4"); return;
@@ -1556,6 +1562,7 @@ Bool primopMightTrap ( IROp op )
    case Iop_CmpGT32Fx4: case Iop_CmpGE32Fx4:
    case Iop_PwMax32Fx4: case Iop_PwMin32Fx4:
    case Iop_Abs32Fx4: case Iop_Neg32Fx4: case Iop_Sqrt32Fx4:
+   case Iop_Abs16Fx8: case Iop_Neg16Fx8: case Iop_Sqrt16Fx8:
    case Iop_RecipEst32Fx4: case Iop_RecipStep32Fx4: case Iop_RSqrtEst32Fx4:
    case Iop_Scale2_32Fx4: case Iop_Log2_32Fx4: case Iop_Exp2_32Fx4:
    case Iop_RSqrtStep32Fx4:
@@ -3331,6 +3338,9 @@ void typeOfPrimop ( IROp op,
       case Iop_NegF32: case Iop_AbsF32:
          UNARY(Ity_F32, Ity_F32);
 
+      case Iop_NegF16: case Iop_AbsF16:
+         UNARY(Ity_F16, Ity_F16);
+
       case Iop_SqrtF64:
       case Iop_RecpExpF64:
          BINARY(ity_RMode,Ity_F64, Ity_F64);
@@ -3340,6 +3350,9 @@ void typeOfPrimop ( IROp op,
       case Iop_RecpExpF32:
          BINARY(ity_RMode,Ity_F32, Ity_F32);
 
+      case Iop_SqrtF16:
+         BINARY(ity_RMode, Ity_F16, Ity_F16);
+
       case Iop_MaxNumF64: case Iop_MinNumF64:
          BINARY(Ity_F64,Ity_F64, Ity_F64);
 
@@ -3425,13 +3438,14 @@ void typeOfPrimop ( IROp op,
       case Iop_RoundF32x4_RP:
       case Iop_RoundF32x4_RN:
       case Iop_RoundF32x4_RZ:
-      case Iop_Abs64Fx2: case Iop_Abs32Fx4:
+      case Iop_Abs64Fx2: case Iop_Abs32Fx4: case Iop_Abs16Fx8:
       case Iop_RSqrtEst32Fx4:
       case Iop_RSqrtEst32Ux4:
          UNARY(Ity_V128, Ity_V128);
 
       case Iop_Sqrt64Fx2:
       case Iop_Sqrt32Fx4:
+      case Iop_Sqrt16Fx8:
       case Iop_I32StoF32x4:
       case Iop_F32toI32Sx4:
          BINARY(ity_RMode,Ity_V128, Ity_V128);
@@ -3632,7 +3646,7 @@ void typeOfPrimop ( IROp op,
       case Iop_Reverse8sIn32_x4: case Iop_Reverse16sIn32_x4:
       case Iop_Reverse8sIn16_x8:
       case Iop_Reverse1sIn8_x16:
-      case Iop_Neg64Fx2: case Iop_Neg32Fx4:
+      case Iop_Neg64Fx2: case Iop_Neg32Fx4: case Iop_Neg16Fx8:
       case Iop_Abs8x16: case Iop_Abs16x8: case Iop_Abs32x4: case Iop_Abs64x2:
       case Iop_CipherSV128:
       case Iop_PwBitMtxXpose64x2:
index 8d924b3b4eeb86841fa5f7c1a21896fadfa81228..a74e3ac5d55532b8c5f188f71f22b80ab8477c70 100644 (file)
@@ -592,6 +592,9 @@ typedef
       /* :: F32 -> F32 */
       Iop_NegF32, Iop_AbsF32,
 
+      /* :: F16 -> F16 */
+      Iop_NegF16, Iop_AbsF16,
+
       /* Unary operations, with rounding. */
       /* :: IRRoundingMode(I32) x F64 -> F64 */
       Iop_SqrtF64,
@@ -599,6 +602,9 @@ typedef
       /* :: IRRoundingMode(I32) x F32 -> F32 */
       Iop_SqrtF32,
 
+      /* :: IRRoundingMode(I32) x F16 -> F16 */
+      Iop_SqrtF16,
+
       /* Comparison, yielding GT/LT/EQ/UN(ordered), as per the following:
             0x45 Unordered
             0x01 LT
@@ -1366,10 +1372,13 @@ typedef
       Iop_PwMax32Fx4, Iop_PwMin32Fx4,
 
       /* unary */
+      Iop_Abs16Fx8,
       Iop_Abs32Fx4,
+      Iop_Neg16Fx8,
       Iop_Neg32Fx4,
 
       /* binary :: IRRoundingMode(I32) x V128 -> V128 */
+      Iop_Sqrt16Fx8,
       Iop_Sqrt32Fx4,
 
       /* Vector Reciprocal Estimate finds an approximate reciprocal of each
index 91f23ed60e40f08b0860e5edf7923b38de824dc3..288895dea27c87091afc0496849de4992bc5e683 100644 (file)
@@ -2705,6 +2705,15 @@ IRAtom* binary16Fx8 ( MCEnv* mce, IRAtom* vatomX, IRAtom* vatomY )
    return at;
 }
 
+static
+IRAtom* unary16Fx8 ( MCEnv* mce, IRAtom* vatomX )
+{
+   IRAtom* at;
+   tl_assert(isShadowAtom(mce, vatomX));
+   at = assignNew('V', mce, Ity_V128, mkPCast16x8(mce, vatomX));
+   return at;
+}
+
 /* TODO: remaining versions of 16x4 FP ops when more of the half-precision IR is
    implemented.
 */
@@ -2884,6 +2893,20 @@ IRAtom* unary32Fx4_w_rm ( MCEnv* mce, IRAtom* vRM, IRAtom* vatomX )
    return t1;
 }
 
+/* --- ... and ... 16Fx8 versions of the same --- */
+
+static
+IRAtom* unary16Fx8_w_rm ( MCEnv* mce, IRAtom* vRM, IRAtom* vatomX )
+{
+   /* Same scheme as binaryFx4_w_rm. */
+   IRAtom* t1 = unary16Fx8(mce, vatomX);
+   // PCast the RM, and widen it to 128 bits
+   IRAtom* t2 = mkPCastTo(mce, Ity_V128, vRM);
+   // Roll it into the result
+   t1 = mkUifUV128(mce, t1, t2);
+   return t1;
+}
+
 /* --- ... and ... 32Fx8 versions of the same --- */
 
 static
@@ -3752,6 +3775,8 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce,
 
       case Iop_I32StoF32x4:
       case Iop_F32toI32Sx4:
+      case Iop_Sqrt16Fx8:
+         return unary16Fx8_w_rm(mce, vatom1, vatom2);
       case Iop_Sqrt32Fx4:
          return unary32Fx4_w_rm(mce, vatom1, vatom2);
       case Iop_Sqrt64Fx2:
@@ -4403,6 +4428,10 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce,
          /* I32(rm) x F32/F64/F128/D32/D64/D128 -> D128/F128 */
          return mkLazy2(mce, Ity_I128, vatom1, vatom2);
 
+      case Iop_SqrtF16:
+         /* I32(rm) x F16 -> F16 */
+         return mkLazy2(mce, Ity_I16, vatom1, vatom2);
+
       case Iop_RoundF32toInt:
       case Iop_SqrtF32:
       case Iop_RecpExpF32:
@@ -5017,6 +5046,10 @@ IRExpr* expr2vbits_Unop ( MCEnv* mce, IROp op, IRAtom* atom )
       case Iop_RecipEst32F0x4:
          return unary32F0x4(mce, vatom);
 
+      case Iop_Abs16Fx8:
+      case Iop_Neg16Fx8:
+         return unary16Fx8(mce, vatom);
+
       // These are self-shadowing.
       case Iop_32UtoV128:
       case Iop_64UtoV128:
@@ -5104,6 +5137,10 @@ IRExpr* expr2vbits_Unop ( MCEnv* mce, IROp op, IRAtom* atom )
       case Iop_F16toF32: 
          return mkPCastTo(mce, Ity_I32, vatom);
 
+      case Iop_AbsF16:
+      case Iop_NegF16:
+         return mkPCastTo(mce, Ity_I16, vatom);
+
       case Iop_Ctz32: case Iop_CtzNat32:
       case Iop_Ctz64: case Iop_CtzNat64:
          return expensiveCountTrailingZeroes(mce, op, atom, vatom);
index 39939b711d216bb857f1d8ce88e27cadf6cb45ed..9ac292787135457b45f9d7b0136d851ae4d365df 100644 (file)
@@ -210,9 +210,12 @@ static irop_t irops[] = {
   { DEFOP(Iop_NegF64,    UNDEF_ALL), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 = 1, .mips64 = 1 },
   { DEFOP(Iop_AbsF64,    UNDEF_ALL), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 = 1, .mips64 = 1 },
   { DEFOP(Iop_NegF32,    UNDEF_ALL), .s390x = 1, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 },
+  { DEFOP(Iop_NegF16,    UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 },
   { DEFOP(Iop_AbsF32,    UNDEF_ALL), .s390x = 1, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 },
+  { DEFOP(Iop_AbsF16,    UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 },
   { DEFOP(Iop_SqrtF64,   UNDEF_ALL), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 = 0, .mips64 = 1 }, // mips asserts
   { DEFOP(Iop_SqrtF32,   UNDEF_ALL), .s390x = 1, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 0, .ppc32 = 0, .mips32 = 1, .mips64 = 1 },
+  { DEFOP(Iop_SqrtF16,   UNDEF_ALL), .s390x = 0, .amd64 = 0, .x86 = 0, .arm = 1, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 },
   { DEFOP(Iop_CmpF64,    UNDEF_ALL), .s390x = 1, .amd64 = 1, .x86 = 1, .arm = 1, .ppc64 = 1, .ppc32 = 1, .mips32 = 1, .mips64 = 1 },
   { DEFOP(Iop_CmpF32,    UNDEF_ALL), .s390x = 1, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 }, // mips asserts
   { DEFOP(Iop_CmpF128,   UNDEF_ALL), .s390x = 1, .amd64 = 0, .x86 = 0, .arm = 0, .ppc64 = 0, .ppc32 = 0, .mips32 = 0, .mips64 = 0 },
@@ -630,12 +633,15 @@ static irop_t irops[] = {
   { DEFOP(Iop_CmpGE32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_PwMax32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_PwMin32Fx4, UNDEF_UNKNOWN), },
+  { DEFOP(Iop_Abs16Fx8, UNDEF_UNKNOWN), },
   { DEFOP(Iop_Abs32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_Sqrt32Fx4, UNDEF_UNKNOWN), },
+  { DEFOP(Iop_Sqrt16Fx8, UNDEF_UNKNOWN), },
   { DEFOP(Iop_Scale2_32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_Log2_32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_Exp2_32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_Neg32Fx4, UNDEF_UNKNOWN), },
+  { DEFOP(Iop_Neg16Fx8, UNDEF_UNKNOWN), },
   { DEFOP(Iop_RecipEst32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_RecipStep32Fx4, UNDEF_UNKNOWN), },
   { DEFOP(Iop_RSqrtEst32Fx4, UNDEF_UNKNOWN), },
index 1878fbd0b649a09d47babc6779aeb5c2c9e7eab5..90fbf5d202b195f754eea5ca204ec8e6ae983972 100644 (file)
@@ -2228,6 +2228,305 @@ GEN_THREEVEC_TEST(faddp_4h_27_28_29, "faddp v27.4h, v28.4h, v29.4h",    27, 28,
 GEN_THREEVEC_TEST(faddp_4h_28_29_30, "faddp v28.4h, v29.4h, v30.4h",    28, 29, 30)
 GEN_THREEVEC_TEST(faddp_4h_29_30_31, "faddp v29.4h, v30.4h, v31.4h",    29, 30, 31)
 
+// FABS <Hd>, <Hn>
+
+GEN_TWOVEC_TEST(fabs_h_00_01, "fabs h0, h1",    0, 1)
+GEN_TWOVEC_TEST(fabs_h_01_02, "fabs h1, h2",    1, 2)
+GEN_TWOVEC_TEST(fabs_h_02_03, "fabs h2, h3",    2, 3)
+GEN_TWOVEC_TEST(fabs_h_03_04, "fabs h3, h4",    3, 4)
+GEN_TWOVEC_TEST(fabs_h_04_05, "fabs h4, h5",    4, 5)
+GEN_TWOVEC_TEST(fabs_h_05_06, "fabs h5, h6",    5, 6)
+GEN_TWOVEC_TEST(fabs_h_06_07, "fabs h6, h7",    6, 7)
+GEN_TWOVEC_TEST(fabs_h_07_08, "fabs h7, h8",    7, 8)
+GEN_TWOVEC_TEST(fabs_h_08_09, "fabs h8, h9",    8, 9)
+GEN_TWOVEC_TEST(fabs_h_09_10, "fabs h9, h10",    9, 10)
+GEN_TWOVEC_TEST(fabs_h_10_11, "fabs h10, h11",    10, 11)
+GEN_TWOVEC_TEST(fabs_h_11_12, "fabs h11, h12",    11, 12)
+GEN_TWOVEC_TEST(fabs_h_12_13, "fabs h12, h13",    12, 13)
+GEN_TWOVEC_TEST(fabs_h_13_14, "fabs h13, h14",    13, 14)
+GEN_TWOVEC_TEST(fabs_h_14_15, "fabs h14, h15",    14, 15)
+GEN_TWOVEC_TEST(fabs_h_15_16, "fabs h15, h16",    15, 16)
+GEN_TWOVEC_TEST(fabs_h_16_17, "fabs h16, h17",    16, 17)
+GEN_TWOVEC_TEST(fabs_h_17_18, "fabs h17, h18",    17, 18)
+GEN_TWOVEC_TEST(fabs_h_18_19, "fabs h18, h19",    18, 19)
+GEN_TWOVEC_TEST(fabs_h_19_20, "fabs h19, h20",    19, 20)
+GEN_TWOVEC_TEST(fabs_h_20_21, "fabs h20, h21",    20, 21)
+GEN_TWOVEC_TEST(fabs_h_21_22, "fabs h21, h22",    21, 22)
+GEN_TWOVEC_TEST(fabs_h_22_23, "fabs h22, h23",    22, 23)
+GEN_TWOVEC_TEST(fabs_h_23_24, "fabs h23, h24",    23, 24)
+GEN_TWOVEC_TEST(fabs_h_24_25, "fabs h24, h25",    24, 25)
+GEN_TWOVEC_TEST(fabs_h_25_26, "fabs h25, h26",    25, 26)
+GEN_TWOVEC_TEST(fabs_h_26_27, "fabs h26, h27",    26, 27)
+GEN_TWOVEC_TEST(fabs_h_27_28, "fabs h27, h28",    27, 28)
+GEN_TWOVEC_TEST(fabs_h_28_29, "fabs h28, h29",    28, 29)
+GEN_TWOVEC_TEST(fabs_h_29_30, "fabs h29, h30",    29, 30)
+GEN_TWOVEC_TEST(fabs_h_30_31, "fabs h30, h31",    30, 31)
+
+// FABS <Vd>.<T>, <Vn>.<T>
+
+GEN_TWOVEC_TEST(fabs_8h_00_01, "fabs v0.8h, v1.8h",    0, 1)
+GEN_TWOVEC_TEST(fabs_8h_01_02, "fabs v1.8h, v2.8h",    1, 2)
+GEN_TWOVEC_TEST(fabs_8h_02_03, "fabs v2.8h, v3.8h",    2, 3)
+GEN_TWOVEC_TEST(fabs_8h_03_04, "fabs v3.8h, v4.8h",    3, 4)
+GEN_TWOVEC_TEST(fabs_8h_04_05, "fabs v4.8h, v5.8h",    4, 5)
+GEN_TWOVEC_TEST(fabs_8h_05_06, "fabs v5.8h, v6.8h",    5, 6)
+GEN_TWOVEC_TEST(fabs_8h_06_07, "fabs v6.8h, v7.8h",    6, 7)
+GEN_TWOVEC_TEST(fabs_8h_07_08, "fabs v7.8h, v8.8h",    7, 8)
+GEN_TWOVEC_TEST(fabs_8h_08_09, "fabs v8.8h, v9.8h",    8, 9)
+GEN_TWOVEC_TEST(fabs_8h_09_10, "fabs v9.8h, v10.8h",    9, 10)
+GEN_TWOVEC_TEST(fabs_8h_10_11, "fabs v10.8h, v11.8h",    10, 11)
+GEN_TWOVEC_TEST(fabs_8h_11_12, "fabs v11.8h, v12.8h",    11, 12)
+GEN_TWOVEC_TEST(fabs_8h_12_13, "fabs v12.8h, v13.8h",    12, 13)
+GEN_TWOVEC_TEST(fabs_8h_13_14, "fabs v13.8h, v14.8h",    13, 14)
+GEN_TWOVEC_TEST(fabs_8h_14_15, "fabs v14.8h, v15.8h",    14, 15)
+GEN_TWOVEC_TEST(fabs_8h_15_16, "fabs v15.8h, v16.8h",    15, 16)
+GEN_TWOVEC_TEST(fabs_8h_16_17, "fabs v16.8h, v17.8h",    16, 17)
+GEN_TWOVEC_TEST(fabs_8h_17_18, "fabs v17.8h, v18.8h",    17, 18)
+GEN_TWOVEC_TEST(fabs_8h_18_19, "fabs v18.8h, v19.8h",    18, 19)
+GEN_TWOVEC_TEST(fabs_8h_19_20, "fabs v19.8h, v20.8h",    19, 20)
+GEN_TWOVEC_TEST(fabs_8h_20_21, "fabs v20.8h, v21.8h",    20, 21)
+GEN_TWOVEC_TEST(fabs_8h_21_22, "fabs v21.8h, v22.8h",    21, 22)
+GEN_TWOVEC_TEST(fabs_8h_22_23, "fabs v22.8h, v23.8h",    22, 23)
+GEN_TWOVEC_TEST(fabs_8h_23_24, "fabs v23.8h, v24.8h",    23, 24)
+GEN_TWOVEC_TEST(fabs_8h_24_25, "fabs v24.8h, v25.8h",    24, 25)
+GEN_TWOVEC_TEST(fabs_8h_25_26, "fabs v25.8h, v26.8h",    25, 26)
+GEN_TWOVEC_TEST(fabs_8h_26_27, "fabs v26.8h, v27.8h",    26, 27)
+GEN_TWOVEC_TEST(fabs_8h_27_28, "fabs v27.8h, v28.8h",    27, 28)
+GEN_TWOVEC_TEST(fabs_8h_28_29, "fabs v28.8h, v29.8h",    28, 29)
+GEN_TWOVEC_TEST(fabs_8h_29_30, "fabs v29.8h, v30.8h",    29, 30)
+GEN_TWOVEC_TEST(fabs_8h_30_31, "fabs v30.8h, v31.8h",    30, 31)
+
+GEN_TWOVEC_TEST(fabs_4h_00_01, "fabs v0.4h, v1.4h",    0, 1)
+GEN_TWOVEC_TEST(fabs_4h_01_02, "fabs v1.4h, v2.4h",    1, 2)
+GEN_TWOVEC_TEST(fabs_4h_02_03, "fabs v2.4h, v3.4h",    2, 3)
+GEN_TWOVEC_TEST(fabs_4h_03_04, "fabs v3.4h, v4.4h",    3, 4)
+GEN_TWOVEC_TEST(fabs_4h_04_05, "fabs v4.4h, v5.4h",    4, 5)
+GEN_TWOVEC_TEST(fabs_4h_05_06, "fabs v5.4h, v6.4h",    5, 6)
+GEN_TWOVEC_TEST(fabs_4h_06_07, "fabs v6.4h, v7.4h",    6, 7)
+GEN_TWOVEC_TEST(fabs_4h_07_08, "fabs v7.4h, v8.4h",    7, 8)
+GEN_TWOVEC_TEST(fabs_4h_08_09, "fabs v8.4h, v9.4h",    8, 9)
+GEN_TWOVEC_TEST(fabs_4h_09_10, "fabs v9.4h, v10.4h",    9, 10)
+GEN_TWOVEC_TEST(fabs_4h_10_11, "fabs v10.4h, v11.4h",    10, 11)
+GEN_TWOVEC_TEST(fabs_4h_11_12, "fabs v11.4h, v12.4h",    11, 12)
+GEN_TWOVEC_TEST(fabs_4h_12_13, "fabs v12.4h, v13.4h",    12, 13)
+GEN_TWOVEC_TEST(fabs_4h_13_14, "fabs v13.4h, v14.4h",    13, 14)
+GEN_TWOVEC_TEST(fabs_4h_14_15, "fabs v14.4h, v15.4h",    14, 15)
+GEN_TWOVEC_TEST(fabs_4h_15_16, "fabs v15.4h, v16.4h",    15, 16)
+GEN_TWOVEC_TEST(fabs_4h_16_17, "fabs v16.4h, v17.4h",    16, 17)
+GEN_TWOVEC_TEST(fabs_4h_17_18, "fabs v17.4h, v18.4h",    17, 18)
+GEN_TWOVEC_TEST(fabs_4h_18_19, "fabs v18.4h, v19.4h",    18, 19)
+GEN_TWOVEC_TEST(fabs_4h_19_20, "fabs v19.4h, v20.4h",    19, 20)
+GEN_TWOVEC_TEST(fabs_4h_20_21, "fabs v20.4h, v21.4h",    20, 21)
+GEN_TWOVEC_TEST(fabs_4h_21_22, "fabs v21.4h, v22.4h",    21, 22)
+GEN_TWOVEC_TEST(fabs_4h_22_23, "fabs v22.4h, v23.4h",    22, 23)
+GEN_TWOVEC_TEST(fabs_4h_23_24, "fabs v23.4h, v24.4h",    23, 24)
+GEN_TWOVEC_TEST(fabs_4h_24_25, "fabs v24.4h, v25.4h",    24, 25)
+GEN_TWOVEC_TEST(fabs_4h_25_26, "fabs v25.4h, v26.4h",    25, 26)
+GEN_TWOVEC_TEST(fabs_4h_26_27, "fabs v26.4h, v27.4h",    26, 27)
+GEN_TWOVEC_TEST(fabs_4h_27_28, "fabs v27.4h, v28.4h",    27, 28)
+GEN_TWOVEC_TEST(fabs_4h_28_29, "fabs v28.4h, v29.4h",    28, 29)
+GEN_TWOVEC_TEST(fabs_4h_29_30, "fabs v29.4h, v30.4h",    29, 30)
+GEN_TWOVEC_TEST(fabs_4h_30_31, "fabs v30.4h, v31.4h",    30, 31)
+
+// FNEG <Hd>, <Hn>
+
+GEN_TWOVEC_TEST(fneg_h_00_01, "fneg h0, h1",    0, 1)
+GEN_TWOVEC_TEST(fneg_h_01_02, "fneg h1, h2",    1, 2)
+GEN_TWOVEC_TEST(fneg_h_02_03, "fneg h2, h3",    2, 3)
+GEN_TWOVEC_TEST(fneg_h_03_04, "fneg h3, h4",    3, 4)
+GEN_TWOVEC_TEST(fneg_h_04_05, "fneg h4, h5",    4, 5)
+GEN_TWOVEC_TEST(fneg_h_05_06, "fneg h5, h6",    5, 6)
+GEN_TWOVEC_TEST(fneg_h_06_07, "fneg h6, h7",    6, 7)
+GEN_TWOVEC_TEST(fneg_h_07_08, "fneg h7, h8",    7, 8)
+GEN_TWOVEC_TEST(fneg_h_08_09, "fneg h8, h9",    8, 9)
+GEN_TWOVEC_TEST(fneg_h_09_10, "fneg h9, h10",    9, 10)
+GEN_TWOVEC_TEST(fneg_h_10_11, "fneg h10, h11",    10, 11)
+GEN_TWOVEC_TEST(fneg_h_11_12, "fneg h11, h12",    11, 12)
+GEN_TWOVEC_TEST(fneg_h_12_13, "fneg h12, h13",    12, 13)
+GEN_TWOVEC_TEST(fneg_h_13_14, "fneg h13, h14",    13, 14)
+GEN_TWOVEC_TEST(fneg_h_14_15, "fneg h14, h15",    14, 15)
+GEN_TWOVEC_TEST(fneg_h_15_16, "fneg h15, h16",    15, 16)
+GEN_TWOVEC_TEST(fneg_h_16_17, "fneg h16, h17",    16, 17)
+GEN_TWOVEC_TEST(fneg_h_17_18, "fneg h17, h18",    17, 18)
+GEN_TWOVEC_TEST(fneg_h_18_19, "fneg h18, h19",    18, 19)
+GEN_TWOVEC_TEST(fneg_h_19_20, "fneg h19, h20",    19, 20)
+GEN_TWOVEC_TEST(fneg_h_20_21, "fneg h20, h21",    20, 21)
+GEN_TWOVEC_TEST(fneg_h_21_22, "fneg h21, h22",    21, 22)
+GEN_TWOVEC_TEST(fneg_h_22_23, "fneg h22, h23",    22, 23)
+GEN_TWOVEC_TEST(fneg_h_23_24, "fneg h23, h24",    23, 24)
+GEN_TWOVEC_TEST(fneg_h_24_25, "fneg h24, h25",    24, 25)
+GEN_TWOVEC_TEST(fneg_h_25_26, "fneg h25, h26",    25, 26)
+GEN_TWOVEC_TEST(fneg_h_26_27, "fneg h26, h27",    26, 27)
+GEN_TWOVEC_TEST(fneg_h_27_28, "fneg h27, h28",    27, 28)
+GEN_TWOVEC_TEST(fneg_h_28_29, "fneg h28, h29",    28, 29)
+GEN_TWOVEC_TEST(fneg_h_29_30, "fneg h29, h30",    29, 30)
+GEN_TWOVEC_TEST(fneg_h_30_31, "fneg h30, h31",    30, 31)
+
+// FNEG <Vd>.<T>, <Vn>.<T>
+
+GEN_TWOVEC_TEST(fneg_8h_00_01, "fneg v0.8h, v1.8h",    0, 1)
+GEN_TWOVEC_TEST(fneg_8h_01_02, "fneg v1.8h, v2.8h",    1, 2)
+GEN_TWOVEC_TEST(fneg_8h_02_03, "fneg v2.8h, v3.8h",    2, 3)
+GEN_TWOVEC_TEST(fneg_8h_03_04, "fneg v3.8h, v4.8h",    3, 4)
+GEN_TWOVEC_TEST(fneg_8h_04_05, "fneg v4.8h, v5.8h",    4, 5)
+GEN_TWOVEC_TEST(fneg_8h_05_06, "fneg v5.8h, v6.8h",    5, 6)
+GEN_TWOVEC_TEST(fneg_8h_06_07, "fneg v6.8h, v7.8h",    6, 7)
+GEN_TWOVEC_TEST(fneg_8h_07_08, "fneg v7.8h, v8.8h",    7, 8)
+GEN_TWOVEC_TEST(fneg_8h_08_09, "fneg v8.8h, v9.8h",    8, 9)
+GEN_TWOVEC_TEST(fneg_8h_09_10, "fneg v9.8h, v10.8h",    9, 10)
+GEN_TWOVEC_TEST(fneg_8h_10_11, "fneg v10.8h, v11.8h",    10, 11)
+GEN_TWOVEC_TEST(fneg_8h_11_12, "fneg v11.8h, v12.8h",    11, 12)
+GEN_TWOVEC_TEST(fneg_8h_12_13, "fneg v12.8h, v13.8h",    12, 13)
+GEN_TWOVEC_TEST(fneg_8h_13_14, "fneg v13.8h, v14.8h",    13, 14)
+GEN_TWOVEC_TEST(fneg_8h_14_15, "fneg v14.8h, v15.8h",    14, 15)
+GEN_TWOVEC_TEST(fneg_8h_15_16, "fneg v15.8h, v16.8h",    15, 16)
+GEN_TWOVEC_TEST(fneg_8h_16_17, "fneg v16.8h, v17.8h",    16, 17)
+GEN_TWOVEC_TEST(fneg_8h_17_18, "fneg v17.8h, v18.8h",    17, 18)
+GEN_TWOVEC_TEST(fneg_8h_18_19, "fneg v18.8h, v19.8h",    18, 19)
+GEN_TWOVEC_TEST(fneg_8h_19_20, "fneg v19.8h, v20.8h",    19, 20)
+GEN_TWOVEC_TEST(fneg_8h_20_21, "fneg v20.8h, v21.8h",    20, 21)
+GEN_TWOVEC_TEST(fneg_8h_21_22, "fneg v21.8h, v22.8h",    21, 22)
+GEN_TWOVEC_TEST(fneg_8h_22_23, "fneg v22.8h, v23.8h",    22, 23)
+GEN_TWOVEC_TEST(fneg_8h_23_24, "fneg v23.8h, v24.8h",    23, 24)
+GEN_TWOVEC_TEST(fneg_8h_24_25, "fneg v24.8h, v25.8h",    24, 25)
+GEN_TWOVEC_TEST(fneg_8h_25_26, "fneg v25.8h, v26.8h",    25, 26)
+GEN_TWOVEC_TEST(fneg_8h_26_27, "fneg v26.8h, v27.8h",    26, 27)
+GEN_TWOVEC_TEST(fneg_8h_27_28, "fneg v27.8h, v28.8h",    27, 28)
+GEN_TWOVEC_TEST(fneg_8h_28_29, "fneg v28.8h, v29.8h",    28, 29)
+GEN_TWOVEC_TEST(fneg_8h_29_30, "fneg v29.8h, v30.8h",    29, 30)
+GEN_TWOVEC_TEST(fneg_8h_30_31, "fneg v30.8h, v31.8h",    30, 31)
+
+GEN_TWOVEC_TEST(fneg_4h_00_01, "fneg v0.4h, v1.4h",    0, 1)
+GEN_TWOVEC_TEST(fneg_4h_01_02, "fneg v1.4h, v2.4h",    1, 2)
+GEN_TWOVEC_TEST(fneg_4h_02_03, "fneg v2.4h, v3.4h",    2, 3)
+GEN_TWOVEC_TEST(fneg_4h_03_04, "fneg v3.4h, v4.4h",    3, 4)
+GEN_TWOVEC_TEST(fneg_4h_04_05, "fneg v4.4h, v5.4h",    4, 5)
+GEN_TWOVEC_TEST(fneg_4h_05_06, "fneg v5.4h, v6.4h",    5, 6)
+GEN_TWOVEC_TEST(fneg_4h_06_07, "fneg v6.4h, v7.4h",    6, 7)
+GEN_TWOVEC_TEST(fneg_4h_07_08, "fneg v7.4h, v8.4h",    7, 8)
+GEN_TWOVEC_TEST(fneg_4h_08_09, "fneg v8.4h, v9.4h",    8, 9)
+GEN_TWOVEC_TEST(fneg_4h_09_10, "fneg v9.4h, v10.4h",    9, 10)
+GEN_TWOVEC_TEST(fneg_4h_10_11, "fneg v10.4h, v11.4h",    10, 11)
+GEN_TWOVEC_TEST(fneg_4h_11_12, "fneg v11.4h, v12.4h",    11, 12)
+GEN_TWOVEC_TEST(fneg_4h_12_13, "fneg v12.4h, v13.4h",    12, 13)
+GEN_TWOVEC_TEST(fneg_4h_13_14, "fneg v13.4h, v14.4h",    13, 14)
+GEN_TWOVEC_TEST(fneg_4h_14_15, "fneg v14.4h, v15.4h",    14, 15)
+GEN_TWOVEC_TEST(fneg_4h_15_16, "fneg v15.4h, v16.4h",    15, 16)
+GEN_TWOVEC_TEST(fneg_4h_16_17, "fneg v16.4h, v17.4h",    16, 17)
+GEN_TWOVEC_TEST(fneg_4h_17_18, "fneg v17.4h, v18.4h",    17, 18)
+GEN_TWOVEC_TEST(fneg_4h_18_19, "fneg v18.4h, v19.4h",    18, 19)
+GEN_TWOVEC_TEST(fneg_4h_19_20, "fneg v19.4h, v20.4h",    19, 20)
+GEN_TWOVEC_TEST(fneg_4h_20_21, "fneg v20.4h, v21.4h",    20, 21)
+GEN_TWOVEC_TEST(fneg_4h_21_22, "fneg v21.4h, v22.4h",    21, 22)
+GEN_TWOVEC_TEST(fneg_4h_22_23, "fneg v22.4h, v23.4h",    22, 23)
+GEN_TWOVEC_TEST(fneg_4h_23_24, "fneg v23.4h, v24.4h",    23, 24)
+GEN_TWOVEC_TEST(fneg_4h_24_25, "fneg v24.4h, v25.4h",    24, 25)
+GEN_TWOVEC_TEST(fneg_4h_25_26, "fneg v25.4h, v26.4h",    25, 26)
+GEN_TWOVEC_TEST(fneg_4h_26_27, "fneg v26.4h, v27.4h",    26, 27)
+GEN_TWOVEC_TEST(fneg_4h_27_28, "fneg v27.4h, v28.4h",    27, 28)
+GEN_TWOVEC_TEST(fneg_4h_28_29, "fneg v28.4h, v29.4h",    28, 29)
+GEN_TWOVEC_TEST(fneg_4h_29_30, "fneg v29.4h, v30.4h",    29, 30)
+GEN_TWOVEC_TEST(fneg_4h_30_31, "fneg v30.4h, v31.4h",    30, 31)
+
+// FSQRT <Hd>, <Hn>
+
+GEN_TWOVEC_TEST(fsqrt_h_00_01, "fsqrt h0, h1",    0, 1)
+GEN_TWOVEC_TEST(fsqrt_h_01_02, "fsqrt h1, h2",    1, 2)
+GEN_TWOVEC_TEST(fsqrt_h_02_03, "fsqrt h2, h3",    2, 3)
+GEN_TWOVEC_TEST(fsqrt_h_03_04, "fsqrt h3, h4",    3, 4)
+GEN_TWOVEC_TEST(fsqrt_h_04_05, "fsqrt h4, h5",    4, 5)
+GEN_TWOVEC_TEST(fsqrt_h_05_06, "fsqrt h5, h6",    5, 6)
+GEN_TWOVEC_TEST(fsqrt_h_06_07, "fsqrt h6, h7",    6, 7)
+GEN_TWOVEC_TEST(fsqrt_h_07_08, "fsqrt h7, h8",    7, 8)
+GEN_TWOVEC_TEST(fsqrt_h_08_09, "fsqrt h8, h9",    8, 9)
+GEN_TWOVEC_TEST(fsqrt_h_09_10, "fsqrt h9, h10",    9, 10)
+GEN_TWOVEC_TEST(fsqrt_h_10_11, "fsqrt h10, h11",    10, 11)
+GEN_TWOVEC_TEST(fsqrt_h_11_12, "fsqrt h11, h12",    11, 12)
+GEN_TWOVEC_TEST(fsqrt_h_12_13, "fsqrt h12, h13",    12, 13)
+GEN_TWOVEC_TEST(fsqrt_h_13_14, "fsqrt h13, h14",    13, 14)
+GEN_TWOVEC_TEST(fsqrt_h_14_15, "fsqrt h14, h15",    14, 15)
+GEN_TWOVEC_TEST(fsqrt_h_15_16, "fsqrt h15, h16",    15, 16)
+GEN_TWOVEC_TEST(fsqrt_h_16_17, "fsqrt h16, h17",    16, 17)
+GEN_TWOVEC_TEST(fsqrt_h_17_18, "fsqrt h17, h18",    17, 18)
+GEN_TWOVEC_TEST(fsqrt_h_18_19, "fsqrt h18, h19",    18, 19)
+GEN_TWOVEC_TEST(fsqrt_h_19_20, "fsqrt h19, h20",    19, 20)
+GEN_TWOVEC_TEST(fsqrt_h_20_21, "fsqrt h20, h21",    20, 21)
+GEN_TWOVEC_TEST(fsqrt_h_21_22, "fsqrt h21, h22",    21, 22)
+GEN_TWOVEC_TEST(fsqrt_h_22_23, "fsqrt h22, h23",    22, 23)
+GEN_TWOVEC_TEST(fsqrt_h_23_24, "fsqrt h23, h24",    23, 24)
+GEN_TWOVEC_TEST(fsqrt_h_24_25, "fsqrt h24, h25",    24, 25)
+GEN_TWOVEC_TEST(fsqrt_h_25_26, "fsqrt h25, h26",    25, 26)
+GEN_TWOVEC_TEST(fsqrt_h_26_27, "fsqrt h26, h27",    26, 27)
+GEN_TWOVEC_TEST(fsqrt_h_27_28, "fsqrt h27, h28",    27, 28)
+GEN_TWOVEC_TEST(fsqrt_h_28_29, "fsqrt h28, h29",    28, 29)
+GEN_TWOVEC_TEST(fsqrt_h_29_30, "fsqrt h29, h30",    29, 30)
+GEN_TWOVEC_TEST(fsqrt_h_30_31, "fsqrt h30, h31",    30, 31)
+
+// FSQRT <Vd>.<T>, <Vn>.<T>
+
+GEN_TWOVEC_TEST(fsqrt_8h_00_01, "fsqrt v0.8h, v1.8h",    0, 1)
+GEN_TWOVEC_TEST(fsqrt_8h_01_02, "fsqrt v1.8h, v2.8h",    1, 2)
+GEN_TWOVEC_TEST(fsqrt_8h_02_03, "fsqrt v2.8h, v3.8h",    2, 3)
+GEN_TWOVEC_TEST(fsqrt_8h_03_04, "fsqrt v3.8h, v4.8h",    3, 4)
+GEN_TWOVEC_TEST(fsqrt_8h_04_05, "fsqrt v4.8h, v5.8h",    4, 5)
+GEN_TWOVEC_TEST(fsqrt_8h_05_06, "fsqrt v5.8h, v6.8h",    5, 6)
+GEN_TWOVEC_TEST(fsqrt_8h_06_07, "fsqrt v6.8h, v7.8h",    6, 7)
+GEN_TWOVEC_TEST(fsqrt_8h_07_08, "fsqrt v7.8h, v8.8h",    7, 8)
+GEN_TWOVEC_TEST(fsqrt_8h_08_09, "fsqrt v8.8h, v9.8h",    8, 9)
+GEN_TWOVEC_TEST(fsqrt_8h_09_10, "fsqrt v9.8h, v10.8h",    9, 10)
+GEN_TWOVEC_TEST(fsqrt_8h_10_11, "fsqrt v10.8h, v11.8h",    10, 11)
+GEN_TWOVEC_TEST(fsqrt_8h_11_12, "fsqrt v11.8h, v12.8h",    11, 12)
+GEN_TWOVEC_TEST(fsqrt_8h_12_13, "fsqrt v12.8h, v13.8h",    12, 13)
+GEN_TWOVEC_TEST(fsqrt_8h_13_14, "fsqrt v13.8h, v14.8h",    13, 14)
+GEN_TWOVEC_TEST(fsqrt_8h_14_15, "fsqrt v14.8h, v15.8h",    14, 15)
+GEN_TWOVEC_TEST(fsqrt_8h_15_16, "fsqrt v15.8h, v16.8h",    15, 16)
+GEN_TWOVEC_TEST(fsqrt_8h_16_17, "fsqrt v16.8h, v17.8h",    16, 17)
+GEN_TWOVEC_TEST(fsqrt_8h_17_18, "fsqrt v17.8h, v18.8h",    17, 18)
+GEN_TWOVEC_TEST(fsqrt_8h_18_19, "fsqrt v18.8h, v19.8h",    18, 19)
+GEN_TWOVEC_TEST(fsqrt_8h_19_20, "fsqrt v19.8h, v20.8h",    19, 20)
+GEN_TWOVEC_TEST(fsqrt_8h_20_21, "fsqrt v20.8h, v21.8h",    20, 21)
+GEN_TWOVEC_TEST(fsqrt_8h_21_22, "fsqrt v21.8h, v22.8h",    21, 22)
+GEN_TWOVEC_TEST(fsqrt_8h_22_23, "fsqrt v22.8h, v23.8h",    22, 23)
+GEN_TWOVEC_TEST(fsqrt_8h_23_24, "fsqrt v23.8h, v24.8h",    23, 24)
+GEN_TWOVEC_TEST(fsqrt_8h_24_25, "fsqrt v24.8h, v25.8h",    24, 25)
+GEN_TWOVEC_TEST(fsqrt_8h_25_26, "fsqrt v25.8h, v26.8h",    25, 26)
+GEN_TWOVEC_TEST(fsqrt_8h_26_27, "fsqrt v26.8h, v27.8h",    26, 27)
+GEN_TWOVEC_TEST(fsqrt_8h_27_28, "fsqrt v27.8h, v28.8h",    27, 28)
+GEN_TWOVEC_TEST(fsqrt_8h_28_29, "fsqrt v28.8h, v29.8h",    28, 29)
+GEN_TWOVEC_TEST(fsqrt_8h_29_30, "fsqrt v29.8h, v30.8h",    29, 30)
+GEN_TWOVEC_TEST(fsqrt_8h_30_31, "fsqrt v30.8h, v31.8h",    30, 31)
+
+GEN_TWOVEC_TEST(fsqrt_4h_00_01, "fsqrt v0.4h, v1.4h",    0, 1)
+GEN_TWOVEC_TEST(fsqrt_4h_01_02, "fsqrt v1.4h, v2.4h",    1, 2)
+GEN_TWOVEC_TEST(fsqrt_4h_02_03, "fsqrt v2.4h, v3.4h",    2, 3)
+GEN_TWOVEC_TEST(fsqrt_4h_03_04, "fsqrt v3.4h, v4.4h",    3, 4)
+GEN_TWOVEC_TEST(fsqrt_4h_04_05, "fsqrt v4.4h, v5.4h",    4, 5)
+GEN_TWOVEC_TEST(fsqrt_4h_05_06, "fsqrt v5.4h, v6.4h",    5, 6)
+GEN_TWOVEC_TEST(fsqrt_4h_06_07, "fsqrt v6.4h, v7.4h",    6, 7)
+GEN_TWOVEC_TEST(fsqrt_4h_07_08, "fsqrt v7.4h, v8.4h",    7, 8)
+GEN_TWOVEC_TEST(fsqrt_4h_08_09, "fsqrt v8.4h, v9.4h",    8, 9)
+GEN_TWOVEC_TEST(fsqrt_4h_09_10, "fsqrt v9.4h, v10.4h",    9, 10)
+GEN_TWOVEC_TEST(fsqrt_4h_10_11, "fsqrt v10.4h, v11.4h",    10, 11)
+GEN_TWOVEC_TEST(fsqrt_4h_11_12, "fsqrt v11.4h, v12.4h",    11, 12)
+GEN_TWOVEC_TEST(fsqrt_4h_12_13, "fsqrt v12.4h, v13.4h",    12, 13)
+GEN_TWOVEC_TEST(fsqrt_4h_13_14, "fsqrt v13.4h, v14.4h",    13, 14)
+GEN_TWOVEC_TEST(fsqrt_4h_14_15, "fsqrt v14.4h, v15.4h",    14, 15)
+GEN_TWOVEC_TEST(fsqrt_4h_15_16, "fsqrt v15.4h, v16.4h",    15, 16)
+GEN_TWOVEC_TEST(fsqrt_4h_16_17, "fsqrt v16.4h, v17.4h",    16, 17)
+GEN_TWOVEC_TEST(fsqrt_4h_17_18, "fsqrt v17.4h, v18.4h",    17, 18)
+GEN_TWOVEC_TEST(fsqrt_4h_18_19, "fsqrt v18.4h, v19.4h",    18, 19)
+GEN_TWOVEC_TEST(fsqrt_4h_19_20, "fsqrt v19.4h, v20.4h",    19, 20)
+GEN_TWOVEC_TEST(fsqrt_4h_20_21, "fsqrt v20.4h, v21.4h",    20, 21)
+GEN_TWOVEC_TEST(fsqrt_4h_21_22, "fsqrt v21.4h, v22.4h",    21, 22)
+GEN_TWOVEC_TEST(fsqrt_4h_22_23, "fsqrt v22.4h, v23.4h",    22, 23)
+GEN_TWOVEC_TEST(fsqrt_4h_23_24, "fsqrt v23.4h, v24.4h",    23, 24)
+GEN_TWOVEC_TEST(fsqrt_4h_24_25, "fsqrt v24.4h, v25.4h",    24, 25)
+GEN_TWOVEC_TEST(fsqrt_4h_25_26, "fsqrt v25.4h, v26.4h",    25, 26)
+GEN_TWOVEC_TEST(fsqrt_4h_26_27, "fsqrt v26.4h, v27.4h",    26, 27)
+GEN_TWOVEC_TEST(fsqrt_4h_27_28, "fsqrt v27.4h, v28.4h",    27, 28)
+GEN_TWOVEC_TEST(fsqrt_4h_28_29, "fsqrt v28.4h, v29.4h",    28, 29)
+GEN_TWOVEC_TEST(fsqrt_4h_29_30, "fsqrt v29.4h, v30.4h",    29, 30)
+GEN_TWOVEC_TEST(fsqrt_4h_30_31, "fsqrt v30.4h, v31.4h",    30, 31)
 
 /* ---------------------------------------------------------------- */
 /* -- main()                                                     -- */
@@ -2335,13 +2634,320 @@ int main ( void )
    if (1) test_faddp_4h_28_29_30(TyH);
    if (1) test_faddp_4h_29_30_31(TyH);
 
+   printf("\nFABS <Hd>, <Hn>\n\n");
+
+   if (1) test_fabs_h_00_01(TyH);
+   if (1) test_fabs_h_01_02(TyH);
+   if (1) test_fabs_h_02_03(TyH);
+   if (1) test_fabs_h_03_04(TyH);
+   if (1) test_fabs_h_04_05(TyH);
+   if (1) test_fabs_h_05_06(TyH);
+   if (1) test_fabs_h_06_07(TyH);
+   if (1) test_fabs_h_07_08(TyH);
+   if (1) test_fabs_h_08_09(TyH);
+   if (1) test_fabs_h_09_10(TyH);
+   if (1) test_fabs_h_10_11(TyH);
+   if (1) test_fabs_h_11_12(TyH);
+   if (1) test_fabs_h_12_13(TyH);
+   if (1) test_fabs_h_13_14(TyH);
+   if (1) test_fabs_h_14_15(TyH);
+   if (1) test_fabs_h_15_16(TyH);
+   if (1) test_fabs_h_16_17(TyH);
+   if (1) test_fabs_h_17_18(TyH);
+   if (1) test_fabs_h_18_19(TyH);
+   if (1) test_fabs_h_19_20(TyH);
+   if (1) test_fabs_h_20_21(TyH);
+   if (1) test_fabs_h_21_22(TyH);
+   if (1) test_fabs_h_22_23(TyH);
+   if (1) test_fabs_h_23_24(TyH);
+   if (1) test_fabs_h_24_25(TyH);
+   if (1) test_fabs_h_25_26(TyH);
+   if (1) test_fabs_h_26_27(TyH);
+   if (1) test_fabs_h_27_28(TyH);
+   if (1) test_fabs_h_28_29(TyH);
+   if (1) test_fabs_h_29_30(TyH);
+   if (1) test_fabs_h_30_31(TyH);
+
+   printf("\nFABS <Vd>.<T>, <Vn>.<T>\n\n");
+
+   if (1) test_fabs_8h_00_01(TyH);
+   if (1) test_fabs_8h_01_02(TyH);
+   if (1) test_fabs_8h_02_03(TyH);
+   if (1) test_fabs_8h_03_04(TyH);
+   if (1) test_fabs_8h_04_05(TyH);
+   if (1) test_fabs_8h_05_06(TyH);
+   if (1) test_fabs_8h_06_07(TyH);
+   if (1) test_fabs_8h_07_08(TyH);
+   if (1) test_fabs_8h_08_09(TyH);
+   if (1) test_fabs_8h_09_10(TyH);
+   if (1) test_fabs_8h_10_11(TyH);
+   if (1) test_fabs_8h_11_12(TyH);
+   if (1) test_fabs_8h_12_13(TyH);
+   if (1) test_fabs_8h_13_14(TyH);
+   if (1) test_fabs_8h_14_15(TyH);
+   if (1) test_fabs_8h_15_16(TyH);
+   if (1) test_fabs_8h_16_17(TyH);
+   if (1) test_fabs_8h_17_18(TyH);
+   if (1) test_fabs_8h_18_19(TyH);
+   if (1) test_fabs_8h_19_20(TyH);
+   if (1) test_fabs_8h_20_21(TyH);
+   if (1) test_fabs_8h_21_22(TyH);
+   if (1) test_fabs_8h_22_23(TyH);
+   if (1) test_fabs_8h_23_24(TyH);
+   if (1) test_fabs_8h_24_25(TyH);
+   if (1) test_fabs_8h_25_26(TyH);
+   if (1) test_fabs_8h_26_27(TyH);
+   if (1) test_fabs_8h_27_28(TyH);
+   if (1) test_fabs_8h_28_29(TyH);
+   if (1) test_fabs_8h_29_30(TyH);
+   if (1) test_fabs_8h_30_31(TyH);
+
+   if (1) test_fabs_4h_00_01(TyH);
+   if (1) test_fabs_4h_01_02(TyH);
+   if (1) test_fabs_4h_02_03(TyH);
+   if (1) test_fabs_4h_03_04(TyH);
+   if (1) test_fabs_4h_04_05(TyH);
+   if (1) test_fabs_4h_05_06(TyH);
+   if (1) test_fabs_4h_06_07(TyH);
+   if (1) test_fabs_4h_07_08(TyH);
+   if (1) test_fabs_4h_08_09(TyH);
+   if (1) test_fabs_4h_09_10(TyH);
+   if (1) test_fabs_4h_10_11(TyH);
+   if (1) test_fabs_4h_11_12(TyH);
+   if (1) test_fabs_4h_12_13(TyH);
+   if (1) test_fabs_4h_13_14(TyH);
+   if (1) test_fabs_4h_14_15(TyH);
+   if (1) test_fabs_4h_15_16(TyH);
+   if (1) test_fabs_4h_16_17(TyH);
+   if (1) test_fabs_4h_17_18(TyH);
+   if (1) test_fabs_4h_18_19(TyH);
+   if (1) test_fabs_4h_19_20(TyH);
+   if (1) test_fabs_4h_20_21(TyH);
+   if (1) test_fabs_4h_21_22(TyH);
+   if (1) test_fabs_4h_22_23(TyH);
+   if (1) test_fabs_4h_23_24(TyH);
+   if (1) test_fabs_4h_24_25(TyH);
+   if (1) test_fabs_4h_25_26(TyH);
+   if (1) test_fabs_4h_26_27(TyH);
+   if (1) test_fabs_4h_27_28(TyH);
+   if (1) test_fabs_4h_28_29(TyH);
+   if (1) test_fabs_4h_29_30(TyH);
+   if (1) test_fabs_4h_30_31(TyH);
+
+   printf("\nFNEG <Hd>, <Hn>\n\n");
+
+   if (1) test_fneg_h_00_01(TyH);
+   if (1) test_fneg_h_01_02(TyH);
+   if (1) test_fneg_h_02_03(TyH);
+   if (1) test_fneg_h_03_04(TyH);
+   if (1) test_fneg_h_04_05(TyH);
+   if (1) test_fneg_h_05_06(TyH);
+   if (1) test_fneg_h_06_07(TyH);
+   if (1) test_fneg_h_07_08(TyH);
+   if (1) test_fneg_h_08_09(TyH);
+   if (1) test_fneg_h_09_10(TyH);
+   if (1) test_fneg_h_10_11(TyH);
+   if (1) test_fneg_h_11_12(TyH);
+   if (1) test_fneg_h_12_13(TyH);
+   if (1) test_fneg_h_13_14(TyH);
+   if (1) test_fneg_h_14_15(TyH);
+   if (1) test_fneg_h_15_16(TyH);
+   if (1) test_fneg_h_16_17(TyH);
+   if (1) test_fneg_h_17_18(TyH);
+   if (1) test_fneg_h_18_19(TyH);
+   if (1) test_fneg_h_19_20(TyH);
+   if (1) test_fneg_h_20_21(TyH);
+   if (1) test_fneg_h_21_22(TyH);
+   if (1) test_fneg_h_22_23(TyH);
+   if (1) test_fneg_h_23_24(TyH);
+   if (1) test_fneg_h_24_25(TyH);
+   if (1) test_fneg_h_25_26(TyH);
+   if (1) test_fneg_h_26_27(TyH);
+   if (1) test_fneg_h_27_28(TyH);
+   if (1) test_fneg_h_28_29(TyH);
+   if (1) test_fneg_h_29_30(TyH);
+   if (1) test_fneg_h_30_31(TyH);
+
+   printf("\nFNEG <Vd>.<T>, <Vn>.<T>\n\n");
+
+   if (1) test_fneg_8h_00_01(TyH);
+   if (1) test_fneg_8h_01_02(TyH);
+   if (1) test_fneg_8h_02_03(TyH);
+   if (1) test_fneg_8h_03_04(TyH);
+   if (1) test_fneg_8h_04_05(TyH);
+   if (1) test_fneg_8h_05_06(TyH);
+   if (1) test_fneg_8h_06_07(TyH);
+   if (1) test_fneg_8h_07_08(TyH);
+   if (1) test_fneg_8h_08_09(TyH);
+   if (1) test_fneg_8h_09_10(TyH);
+   if (1) test_fneg_8h_10_11(TyH);
+   if (1) test_fneg_8h_11_12(TyH);
+   if (1) test_fneg_8h_12_13(TyH);
+   if (1) test_fneg_8h_13_14(TyH);
+   if (1) test_fneg_8h_14_15(TyH);
+   if (1) test_fneg_8h_15_16(TyH);
+   if (1) test_fneg_8h_16_17(TyH);
+   if (1) test_fneg_8h_17_18(TyH);
+   if (1) test_fneg_8h_18_19(TyH);
+   if (1) test_fneg_8h_19_20(TyH);
+   if (1) test_fneg_8h_20_21(TyH);
+   if (1) test_fneg_8h_21_22(TyH);
+   if (1) test_fneg_8h_22_23(TyH);
+   if (1) test_fneg_8h_23_24(TyH);
+   if (1) test_fneg_8h_24_25(TyH);
+   if (1) test_fneg_8h_25_26(TyH);
+   if (1) test_fneg_8h_26_27(TyH);
+   if (1) test_fneg_8h_27_28(TyH);
+   if (1) test_fneg_8h_28_29(TyH);
+   if (1) test_fneg_8h_29_30(TyH);
+   if (1) test_fneg_8h_30_31(TyH);
+
+   if (1) test_fneg_4h_00_01(TyH);
+   if (1) test_fneg_4h_01_02(TyH);
+   if (1) test_fneg_4h_02_03(TyH);
+   if (1) test_fneg_4h_03_04(TyH);
+   if (1) test_fneg_4h_04_05(TyH);
+   if (1) test_fneg_4h_05_06(TyH);
+   if (1) test_fneg_4h_06_07(TyH);
+   if (1) test_fneg_4h_07_08(TyH);
+   if (1) test_fneg_4h_08_09(TyH);
+   if (1) test_fneg_4h_09_10(TyH);
+   if (1) test_fneg_4h_10_11(TyH);
+   if (1) test_fneg_4h_11_12(TyH);
+   if (1) test_fneg_4h_12_13(TyH);
+   if (1) test_fneg_4h_13_14(TyH);
+   if (1) test_fneg_4h_14_15(TyH);
+   if (1) test_fneg_4h_15_16(TyH);
+   if (1) test_fneg_4h_16_17(TyH);
+   if (1) test_fneg_4h_17_18(TyH);
+   if (1) test_fneg_4h_18_19(TyH);
+   if (1) test_fneg_4h_19_20(TyH);
+   if (1) test_fneg_4h_20_21(TyH);
+   if (1) test_fneg_4h_21_22(TyH);
+   if (1) test_fneg_4h_22_23(TyH);
+   if (1) test_fneg_4h_23_24(TyH);
+   if (1) test_fneg_4h_24_25(TyH);
+   if (1) test_fneg_4h_25_26(TyH);
+   if (1) test_fneg_4h_26_27(TyH);
+   if (1) test_fneg_4h_27_28(TyH);
+   if (1) test_fneg_4h_28_29(TyH);
+   if (1) test_fneg_4h_29_30(TyH);
+   if (1) test_fneg_4h_30_31(TyH);
+
+   printf("\nFSQRT <Hd>, <Hn>\n\n");
+
+   if (1) test_fsqrt_h_00_01(TyH);
+   if (1) test_fsqrt_h_01_02(TyH);
+   if (1) test_fsqrt_h_02_03(TyH);
+   if (1) test_fsqrt_h_03_04(TyH);
+   if (1) test_fsqrt_h_04_05(TyH);
+   if (1) test_fsqrt_h_05_06(TyH);
+   if (1) test_fsqrt_h_06_07(TyH);
+   if (1) test_fsqrt_h_07_08(TyH);
+   if (1) test_fsqrt_h_08_09(TyH);
+   if (1) test_fsqrt_h_09_10(TyH);
+   if (1) test_fsqrt_h_10_11(TyH);
+   if (1) test_fsqrt_h_11_12(TyH);
+   if (1) test_fsqrt_h_12_13(TyH);
+   if (1) test_fsqrt_h_13_14(TyH);
+   if (1) test_fsqrt_h_14_15(TyH);
+   if (1) test_fsqrt_h_15_16(TyH);
+   if (1) test_fsqrt_h_16_17(TyH);
+   if (1) test_fsqrt_h_17_18(TyH);
+   if (1) test_fsqrt_h_18_19(TyH);
+   if (1) test_fsqrt_h_19_20(TyH);
+   if (1) test_fsqrt_h_20_21(TyH);
+   if (1) test_fsqrt_h_21_22(TyH);
+   if (1) test_fsqrt_h_22_23(TyH);
+   if (1) test_fsqrt_h_23_24(TyH);
+   if (1) test_fsqrt_h_24_25(TyH);
+   if (1) test_fsqrt_h_25_26(TyH);
+   if (1) test_fsqrt_h_26_27(TyH);
+   if (1) test_fsqrt_h_27_28(TyH);
+   if (1) test_fsqrt_h_28_29(TyH);
+   if (1) test_fsqrt_h_29_30(TyH);
+   if (1) test_fsqrt_h_30_31(TyH);
+
+   printf("\nFSQRT <Vd>.<T>, <Vn>.<T>\n\n");
+
+   if (1) test_fsqrt_8h_00_01(TyH);
+   if (1) test_fsqrt_8h_01_02(TyH);
+   if (1) test_fsqrt_8h_02_03(TyH);
+   if (1) test_fsqrt_8h_03_04(TyH);
+   if (1) test_fsqrt_8h_04_05(TyH);
+   if (1) test_fsqrt_8h_05_06(TyH);
+   if (1) test_fsqrt_8h_06_07(TyH);
+   if (1) test_fsqrt_8h_07_08(TyH);
+   if (1) test_fsqrt_8h_08_09(TyH);
+   if (1) test_fsqrt_8h_09_10(TyH);
+   if (1) test_fsqrt_8h_10_11(TyH);
+   if (1) test_fsqrt_8h_11_12(TyH);
+   if (1) test_fsqrt_8h_12_13(TyH);
+   if (1) test_fsqrt_8h_13_14(TyH);
+   if (1) test_fsqrt_8h_14_15(TyH);
+   if (1) test_fsqrt_8h_15_16(TyH);
+   if (1) test_fsqrt_8h_16_17(TyH);
+   if (1) test_fsqrt_8h_17_18(TyH);
+   if (1) test_fsqrt_8h_18_19(TyH);
+   if (1) test_fsqrt_8h_19_20(TyH);
+   if (1) test_fsqrt_8h_20_21(TyH);
+   if (1) test_fsqrt_8h_21_22(TyH);
+   if (1) test_fsqrt_8h_22_23(TyH);
+   if (1) test_fsqrt_8h_23_24(TyH);
+   if (1) test_fsqrt_8h_24_25(TyH);
+   if (1) test_fsqrt_8h_25_26(TyH);
+   if (1) test_fsqrt_8h_26_27(TyH);
+   if (1) test_fsqrt_8h_27_28(TyH);
+   if (1) test_fsqrt_8h_28_29(TyH);
+   if (1) test_fsqrt_8h_29_30(TyH);
+   if (1) test_fsqrt_8h_30_31(TyH);
+
+   if (1) test_fsqrt_4h_00_01(TyH);
+   if (1) test_fsqrt_4h_01_02(TyH);
+   if (1) test_fsqrt_4h_02_03(TyH);
+   if (1) test_fsqrt_4h_03_04(TyH);
+   if (1) test_fsqrt_4h_04_05(TyH);
+   if (1) test_fsqrt_4h_05_06(TyH);
+   if (1) test_fsqrt_4h_06_07(TyH);
+   if (1) test_fsqrt_4h_07_08(TyH);
+   if (1) test_fsqrt_4h_08_09(TyH);
+   if (1) test_fsqrt_4h_09_10(TyH);
+   if (1) test_fsqrt_4h_10_11(TyH);
+   if (1) test_fsqrt_4h_11_12(TyH);
+   if (1) test_fsqrt_4h_12_13(TyH);
+   if (1) test_fsqrt_4h_13_14(TyH);
+   if (1) test_fsqrt_4h_14_15(TyH);
+   if (1) test_fsqrt_4h_15_16(TyH);
+   if (1) test_fsqrt_4h_16_17(TyH);
+   if (1) test_fsqrt_4h_17_18(TyH);
+   if (1) test_fsqrt_4h_18_19(TyH);
+   if (1) test_fsqrt_4h_19_20(TyH);
+   if (1) test_fsqrt_4h_20_21(TyH);
+   if (1) test_fsqrt_4h_21_22(TyH);
+   if (1) test_fsqrt_4h_22_23(TyH);
+   if (1) test_fsqrt_4h_23_24(TyH);
+   if (1) test_fsqrt_4h_24_25(TyH);
+   if (1) test_fsqrt_4h_25_26(TyH);
+   if (1) test_fsqrt_4h_26_27(TyH);
+   if (1) test_fsqrt_4h_27_28(TyH);
+   if (1) test_fsqrt_4h_28_29(TyH);
+   if (1) test_fsqrt_4h_29_30(TyH);
+   if (1) test_fsqrt_4h_30_31(TyH);
+
    return 0;
 }
 
 /* ---------------------------------------------------------------- */
 /* -- List of instructions tested in order of execution.         -- */
+/* -- Useful strings when searching for blocks of test cases.    -- */
 /* ---------------------------------------------------------------- */
 /*
    FADDP <V><d>, <Vn>.<T> Floating-point Add Pair of elements (scalar).
    FADDP <Vd>.<T>, <Vn>.<T>, <Vm>.<T> Floating-point Add Pairwise (vector).
+   FABS <Hd>, <Hn> Floating-point Absolute value (scalar).
+   FABS <Vd>.<T>, <Vn>.<T> Floating-point Absolute value (vector).
+   FNEG <Hd>, <Hn> Floating-point Negate (scalar).
+   FNEG <Vd>.<T>, <Vn>.<T> Floating-point Negate (vector).
+   FSQRT <Hd>, <Hn> Floating-point Square Root (scalar).
+   FSQRT <Vd>.<T>, <Vn>.<T> Floating-point Square Root (vector).
 */
index 1dd9e8c6b02f6a5a5424374be41178b8131396ac..f2c1975a219231d76cc541b3246e89b74f95fabc 100644 (file)
@@ -96,3 +96,305 @@ faddp v26.4h, v27.4h, v28.4h   1c7493622cfa2597b6855d5cd44e174a  868b2e22d97fdd6
 faddp v27.4h, v28.4h, v29.4h   96584f08a2f98312aff067d5f03b44cf  1eb33ae9199674ecd8d7987a5aa2c601  29fec9e82973b95bac8519f59f2d04ab  0000000000000000ac559f1ad8d75a72  1eb33ae9199674ecd8d7987a5aa2c601  29fec9e82973b95bac8519f59f2d04ab fpsr=00000000
 faddp v28.4h, v29.4h, v30.4h   89dc3ea5a31f12c364df0e25357e07d6  913d502c107e9cd06a3eec76b56ecb74  3edf14402e48bffaabe616bb98dc80c1  0000000000000000abb098e2e55ccb9f  913d502c107e9cd06a3eec76b56ecb74  3edf14402e48bffaabe616bb98dc80c1 fpsr=00000000
 faddp v29.4h, v30.4h, v31.4h   2a1fe48bf7d8b25706c5dff7abfe7295  0d2ba7bfbfefcfc75bab8685a4c94b2d  19f3d7116d5971d5d234977794db61d6  0000000000000000d23461d65bab4b2b  0d2ba7bfbfefcfc75bab8685a4c94b2d  19f3d7116d5971d5d234977794db61d6 fpsr=00000000
+
+FABS <Hd>, <Hn>
+
+fabs h0, h1   0937e4909fe80ce02f87a429eb5f081f  45af4ec7c2a821574df11effc5645bbb  00000000000000000000000000005bbb  45af4ec7c2a821574df11effc5645bbb fpsr=00000000
+fabs h1, h2   f57a25258fdf807367ff0cd7231ec7ef  8ab45265eb7423219729192a5f256ae7  00000000000000000000000000006ae7  8ab45265eb7423219729192a5f256ae7 fpsr=00000000
+fabs h2, h3   b1cff9f1b4ddbe2322a9c22776ff3042  83a818b6f3943cb7c8dd1991b6cb297d  0000000000000000000000000000297d  83a818b6f3943cb7c8dd1991b6cb297d fpsr=00000000
+fabs h3, h4   f7579b2891a813446e1bdf8d327099a8  51c6f6af2a1de39526bc45f7a76187ef  000000000000000000000000000007ef  51c6f6af2a1de39526bc45f7a76187ef fpsr=00000000
+fabs h4, h5   124ecb70f79979a7ae01844088bd7bbe  1614be74a19641dae470df8abcc9c0b3  000000000000000000000000000040b3  1614be74a19641dae470df8abcc9c0b3 fpsr=00000000
+fabs h5, h6   f209069ea7d3e520baedeb496f09ca07  f17c0c040cee6e4364c5ec2b482151d1  000000000000000000000000000051d1  f17c0c040cee6e4364c5ec2b482151d1 fpsr=00000000
+randV128: 512 calls, 699 iters
+fabs h6, h7   919b29bf2bfec2c5dd3bb51ccef7f987  ae2d4071b09e34d197ade8b4986d6b05  00000000000000000000000000006b05  ae2d4071b09e34d197ade8b4986d6b05 fpsr=00000000
+fabs h7, h8   1130d272c0b0f3b1b55dd7a60757997f  5136e60ea8b68eb60aff985d1d21b4da  000000000000000000000000000034da  5136e60ea8b68eb60aff985d1d21b4da fpsr=00000000
+fabs h8, h9   4c8b686f3a23b6d93a12e81f605f5002  d0f01218c3380ef0bee102374fafd4e3  000000000000000000000000000054e3  d0f01218c3380ef0bee102374fafd4e3 fpsr=00000000
+fabs h9, h10   b2aa237461d97084eb06887153eff01a  cfa6ab954bb50e5bd22fb34754a219c5  000000000000000000000000000019c5  cfa6ab954bb50e5bd22fb34754a219c5 fpsr=00000000
+fabs h10, h11   1c9fc204c8c052c704da5f3444a81014  0e492839a79cda20f92eb913e40864e6  000000000000000000000000000064e6  0e492839a79cda20f92eb913e40864e6 fpsr=00000000
+fabs h11, h12   0f7c166980b896167145c55bed24b56c  cc893028e602d73eb2831f4bf609ebf8  00000000000000000000000000006bf8  cc893028e602d73eb2831f4bf609ebf8 fpsr=00000000
+fabs h12, h13   0be77b318842c856059940783863e7a8  94463cd1c7914d221e876212d6c92a13  00000000000000000000000000002a13  94463cd1c7914d221e876212d6c92a13 fpsr=00000000
+fabs h13, h14   b78debf535fec705eaad3f4eb709cd41  c504bb084073c96cf268ed1e8d817879  00000000000000000000000000007879  c504bb084073c96cf268ed1e8d817879 fpsr=00000000
+fabs h14, h15   392f0631401ae5027aa91a00bcc34007  bf3e07b2c2da04a6f33908f372f209e1  000000000000000000000000000009e1  bf3e07b2c2da04a6f33908f372f209e1 fpsr=00000000
+fabs h15, h16   455d9993e4a5f1b876795aaf7a3a6332  768d72ee82413c1cef651c6c49c9b9c3  000000000000000000000000000039c3  768d72ee82413c1cef651c6c49c9b9c3 fpsr=00000000
+fabs h16, h17   031cbc1bd0f7f4313c3427feb9ab05a7  f7df3280711908adf17116fa75aea535  00000000000000000000000000002535  f7df3280711908adf17116fa75aea535 fpsr=00000000
+fabs h17, h18   f376b669ae2ce35a2a57a09a50746818  bf9212cf2c335fb533ff1b3c28c23a5e  00000000000000000000000000003a5e  bf9212cf2c335fb533ff1b3c28c23a5e fpsr=00000000
+fabs h18, h19   091a1f4f5923c556de8f49b6eb14daf9  95a02171b9c06a425dbdc3e2025a96a7  000000000000000000000000000016a7  95a02171b9c06a425dbdc3e2025a96a7 fpsr=00000000
+fabs h19, h20   edcf0197e7c200c7409e243038d0ce7b  1855d89a262a1b0a53270c4dcc860398  00000000000000000000000000000398  1855d89a262a1b0a53270c4dcc860398 fpsr=00000000
+fabs h20, h21   539af0a5cbcde8d1860844ed2dee1843  06d4130774cb026e0b85da88ee6240d4  000000000000000000000000000040d4  06d4130774cb026e0b85da88ee6240d4 fpsr=00000000
+fabs h21, h22   f0c7891470a9c6d97711cd0105a75eff  2c00565c14c9b5e0cc4528dc9099beba  00000000000000000000000000003eba  2c00565c14c9b5e0cc4528dc9099beba fpsr=00000000
+fabs h22, h23   738244a36537113d88fba7bfdd5d0131  ad8bac2d354666290b996d125b24f4bd  000000000000000000000000000074bd  ad8bac2d354666290b996d125b24f4bd fpsr=00000000
+fabs h23, h24   ab54e2e2e2e9a17df5c4cddac86ba5d7  df49d6a4ee899c7ee449c250d31cbfc2  00000000000000000000000000003fc2  df49d6a4ee899c7ee449c250d31cbfc2 fpsr=00000000
+fabs h24, h25   0aefbd68c882e0ba8688124d9a8034e6  4f3e6b0b450ee14a3f6391173f4b1584  00000000000000000000000000001584  4f3e6b0b450ee14a3f6391173f4b1584 fpsr=00000000
+fabs h25, h26   84629830272617d94573bcb41f7f9ba4  9c342f9777c1646445ad3ed3b57d49d5  000000000000000000000000000049d5  9c342f9777c1646445ad3ed3b57d49d5 fpsr=00000000
+fabs h26, h27   b803f91594cef4691ed025b60377507f  80efa667b5aedab485401690c81e5949  00000000000000000000000000005949  80efa667b5aedab485401690c81e5949 fpsr=00000000
+fabs h27, h28   b70b87ec21fcaee0ded12dca0df26a17  70b1ce7f93297a1aeff889594c121bf4  00000000000000000000000000001bf4  70b1ce7f93297a1aeff889594c121bf4 fpsr=00000000
+fabs h28, h29   8ede7208c800b715da12557654765782  f0d64bb3c491e2964c871592462727ca  000000000000000000000000000027ca  f0d64bb3c491e2964c871592462727ca fpsr=00000000
+fabs h29, h30   4467de8de308363b05d28a171d1a294d  20cbc3f09aaa865164adf8d51b36a175  00000000000000000000000000002175  20cbc3f09aaa865164adf8d51b36a175 fpsr=00000000
+fabs h30, h31   25ee34ff9e689545c592399af877a248  df912f8374159df2f7085589b343d21f  0000000000000000000000000000521f  df912f8374159df2f7085589b343d21f fpsr=00000000
+
+FABS <Vd>.<T>, <Vn>.<T>
+
+fabs v0.8h, v1.8h   5b3835128dd0355762546ab8a9c9f869  7a591efbe94e37d632c5c500931264b7  7a591efb694e37d632c54500131264b7  7a591efbe94e37d632c5c500931264b7 fpsr=00000000
+fabs v1.8h, v2.8h   7695b11f8084e96131699e77ba13900a  bddc2f3f9e7ca05380906821cd649648  3ddc2f3f1e7c2053009068214d641648  bddc2f3f9e7ca05380906821cd649648 fpsr=00000000
+fabs v2.8h, v3.8h   6ebcc4c757e84ee401f6228492d84a9b  0ce747ec936710ebfbe70be75829395f  0ce747ec136710eb7be70be75829395f  0ce747ec936710ebfbe70be75829395f fpsr=00000000
+fabs v3.8h, v4.8h   84b4b96d2e26a96f0d355683bcd06b85  67bd0a55cfd546a986815ea08ffe7621  67bd0a554fd546a906815ea00ffe7621  67bd0a55cfd546a986815ea08ffe7621 fpsr=00000000
+fabs v4.8h, v5.8h   c208da666ec923c9a6447b2b73612f52  a286f1ebadc1138d54839bd88d84ce1e  228671eb2dc1138d54831bd80d844e1e  a286f1ebadc1138d54839bd88d84ce1e fpsr=00000000
+fabs v5.8h, v6.8h   9ca3dd0d0d8957f8464ca0f2311c20b5  b3a2b91de06daeb55b71d1649acc2190  33a2391d606d2eb55b7151641acc2190  b3a2b91de06daeb55b71d1649acc2190 fpsr=00000000
+fabs v6.8h, v7.8h   3773ae1bcf8ff14a3d3c4e4b5a254e46  2ae60a0d6cd20b6d770c50d4ac6c0dc7  2ae60a0d6cd20b6d770c50d42c6c0dc7  2ae60a0d6cd20b6d770c50d4ac6c0dc7 fpsr=00000000
+fabs v7.8h, v8.8h   dbd8609b86ba8d162d9b0d5f9d85c79b  ed24c0578608f5c373d4f26ff7522fb6  6d244057060875c373d4726f77522fb6  ed24c0578608f5c373d4f26ff7522fb6 fpsr=00000000
+fabs v8.8h, v9.8h   e19a660dfbf22d561be6f39a2c0cfb30  7a7b4e2ba2eb89d3b39f1de9625c24b1  7a7b4e2b22eb09d3339f1de9625c24b1  7a7b4e2ba2eb89d3b39f1de9625c24b1 fpsr=00000000
+fabs v9.8h, v10.8h   5ff5310749300238b7eb0dd98437b5ac  4fce29f348d45b519eda58ac7a9edc2f  4fce29f348d45b511eda58ac7a9e5c2f  4fce29f348d45b519eda58ac7a9edc2f fpsr=00000000
+fabs v10.8h, v11.8h   4c7d311058224c9e16e48416217a378f  f30a5bd562bcb117541a3dac4fa95437  730a5bd562bc3117541a3dac4fa95437  f30a5bd562bcb117541a3dac4fa95437 fpsr=00000000
+fabs v11.8h, v12.8h   7b408c9b2067aa17b9a984144ef62b49  f81b4f5fe03bec2401c8b1f90f4166de  781b4f5f603b6c2401c831f90f4166de  f81b4f5fe03bec2401c8b1f90f4166de fpsr=00000000
+fabs v12.8h, v13.8h   9cd9212673fb3d5f28b1fa34a6deaa2f  e2b0c1b33d707512acc6a5cbc3245db3  62b041b33d7075122cc625cb43245db3  e2b0c1b33d707512acc6a5cbc3245db3 fpsr=00000000
+fabs v13.8h, v14.8h   61076702b3356dd0a94456d89e10168e  203fe937d71e545a5fb8b48c3ff8390d  203f6937571e545a5fb8348c3ff8390d  203fe937d71e545a5fb8b48c3ff8390d fpsr=00000000
+fabs v14.8h, v15.8h   1da02ac32de40ca086b6f3b5f5ec755f  ab5bb74d390b29ca76006c9b969ea1de  2b5b374d390b29ca76006c9b169e21de  ab5bb74d390b29ca76006c9b969ea1de fpsr=00000000
+fabs v15.8h, v16.8h   12c1d292dadac5cb275692ecb1c50570  0467c77c934fcdee3f104d5a2c898c46  0467477c134f4dee3f104d5a2c890c46  0467c77c934fcdee3f104d5a2c898c46 fpsr=00000000
+fabs v16.8h, v17.8h   b35fdb64701e945ab1e9eaf6c694941e  918fbdc5e291947a408fc950490c6c99  118f3dc56291147a408f4950490c6c99  918fbdc5e291947a408fc950490c6c99 fpsr=00000000
+fabs v17.8h, v18.8h   cebf5594ee8bc3c1b02de71711f26e5d  ef07e90793524658d8287172c6422b47  6f076907135246585828717246422b47  ef07e90793524658d8287172c6422b47 fpsr=00000000
+fabs v18.8h, v19.8h   db05f902c9a2df3e3cb7f382b0f69ba6  cb02be9bd72c829bcf087be4a6069c87  4b023e9b572c029b4f087be426061c87  cb02be9bd72c829bcf087be4a6069c87 fpsr=00000000
+fabs v19.8h, v20.8h   45b41a5728f342c14290ae66ab459ed4  6f74ad21e7c0a58301ba82fc21ccdd85  6f742d2167c0258301ba02fc21cc5d85  6f74ad21e7c0a58301ba82fc21ccdd85 fpsr=00000000
+fabs v20.8h, v21.8h   31e2defb421abff328343e3beb65bccc  ef5942a1c0e0ca1e28d1f199ea5ce881  6f5942a140e04a1e28d171996a5c6881  ef5942a1c0e0ca1e28d1f199ea5ce881 fpsr=00000000
+fabs v21.8h, v22.8h   cd8bb349e538e7dda8ab04445f43e64a  c77ffab3aa8fa5f5909c99db2e522a3d  477f7ab32a8f25f5109c19db2e522a3d  c77ffab3aa8fa5f5909c99db2e522a3d fpsr=00000000
+fabs v22.8h, v23.8h   47ef89ab93dcc610deab3e35e4b56fd0  5a22fb2a97f2b725f377acfa21466716  5a227b2a17f2372573772cfa21466716  5a22fb2a97f2b725f377acfa21466716 fpsr=00000000
+fabs v23.8h, v24.8h   e73092581227a95d868c1b95d9e8bc43  6701d88dd7e8dd3f864752b984649c70  6701588d57e85d3f064752b904641c70  6701d88dd7e8dd3f864752b984649c70 fpsr=00000000
+fabs v24.8h, v25.8h   41932201ece1f76cab44100b00fb703f  9c05382834d243e8102309289f0487d0  1c05382834d243e8102309281f0407d0  9c05382834d243e8102309289f0487d0 fpsr=00000000
+fabs v25.8h, v26.8h   a360f8a9cb209147bcf11ee6690c48d1  d380ece50912c7462ffa470ba7c38a89  53806ce5091247462ffa470b27c30a89  d380ece50912c7462ffa470ba7c38a89 fpsr=00000000
+fabs v26.8h, v27.8h   2b2e060ec00e220ad279adafb572e8bd  9f559c6abf12bf38fa2e0670b01bcafa  1f551c6a3f123f387a2e0670301b4afa  9f559c6abf12bf38fa2e0670b01bcafa fpsr=00000000
+fabs v27.8h, v28.8h   699bc759eb22cacbec75d26340ffddf6  b3e72358437eb891e7c38e901fb05a72  33e72358437e389167c30e901fb05a72  b3e72358437eb891e7c38e901fb05a72 fpsr=00000000
+fabs v28.8h, v29.8h   cb6c0e4df0c8e3dcdbbc80afcead8284  eefaadd40278e05968494fd990dfcfdb  6efa2dd40278605968494fd910df4fdb  eefaadd40278e05968494fd990dfcfdb fpsr=00000000
+fabs v29.8h, v30.8h   24fd09259b8aa0e483b6c449099d482d  456adc6dece67498047f6143a81e6dd3  456a5c6d6ce67498047f6143281e6dd3  456adc6dece67498047f6143a81e6dd3 fpsr=00000000
+fabs v30.8h, v31.8h   40e45202dcf949c54d4c8e652c2ea45c  3dc787326b364376e1256796e5753057  3dc707326b3643766125679665753057  3dc787326b364376e1256796e5753057 fpsr=00000000
+fabs v0.4h, v1.4h   d0247b4a28d835a36ffff2e82aa56bb5  88134186f12ca11732c074b63b26eb09  000000000000000032c074b63b266b09  88134186f12ca11732c074b63b26eb09 fpsr=00000000
+fabs v1.4h, v2.4h   5edc01923794338d74faa2ddf8e1a090  8bc2195ff2ebb5a01b5604b6f74470da  00000000000000001b5604b6774470da  8bc2195ff2ebb5a01b5604b6f74470da fpsr=00000000
+fabs v2.4h, v3.4h   94e3abf26c26b7a66d1858edf6f399e9  c5dd39d1b0c43bc118fccda3094fb4e2  000000000000000018fc4da3094f34e2  c5dd39d1b0c43bc118fccda3094fb4e2 fpsr=00000000
+fabs v3.4h, v4.4h   348f5988c1f6c82abad98c7cf36c568a  2497720343b5ec2ae5f8f1335752c15f  000000000000000065f871335752415f  2497720343b5ec2ae5f8f1335752c15f fpsr=00000000
+fabs v4.4h, v5.4h   68bc8fcb3f9c61edeb7496cb5e0437a5  0c880f75039997ff91acbb1a75ad5ef0  000000000000000011ac3b1a75ad5ef0  0c880f75039997ff91acbb1a75ad5ef0 fpsr=00000000
+fabs v5.4h, v6.4h   e2d10a83d1fbeeb59283ef9809a139d7  bdf57a5acc0300c3685016cac1c13e83  0000000000000000685016ca41c13e83  bdf57a5acc0300c3685016cac1c13e83 fpsr=00000000
+fabs v6.4h, v7.4h   4b2939371428a2738d4ac2b58b3fe613  00cccbbd5f8a40bcd0100e90e20d52c2  000000000000000050100e90620d52c2  00cccbbd5f8a40bcd0100e90e20d52c2 fpsr=00000000
+fabs v7.4h, v8.4h   de3613dbcdea9a46a0b7619465b43f63  3ddf478523227766b5984b4c78162e0a  000000000000000035984b4c78162e0a  3ddf478523227766b5984b4c78162e0a fpsr=00000000
+randV128: 768 calls, 1047 iters
+fabs v8.4h, v9.4h   cdf9a5fdd4619ca3fbbaaadd3bcfd967  b602c7a266815d1ae592158f24400e74  00000000000000006592158f24400e74  b602c7a266815d1ae592158f24400e74 fpsr=00000000
+fabs v9.4h, v10.4h   1345b2d1f5cf93b0dbb2b3391d86b89e  968adddb0a7d641192ced1619083e128  000000000000000012ce516110836128  968adddb0a7d641192ced1619083e128 fpsr=00000000
+fabs v10.4h, v11.4h   eefcef7a686e5be61a6a4debdaf028ce  70c12b2242100a1b51fb9bfc1e11f753  000000000000000051fb1bfc1e117753  70c12b2242100a1b51fb9bfc1e11f753 fpsr=00000000
+fabs v11.4h, v12.4h   9dbadedc5fb420fa5ec66b8ee2e7c1c7  e970cd3de35a4e1617453bcbf839d058  000000000000000017453bcb78395058  e970cd3de35a4e1617453bcbf839d058 fpsr=00000000
+fabs v12.4h, v13.4h   84238a63d0b094ac3e4009a988c78d73  516423533673b907314755eca9625466  0000000000000000314755ec29625466  516423533673b907314755eca9625466 fpsr=00000000
+fabs v13.4h, v14.4h   123429d34950a423bda5423513ded944  7b78995ea148096c521348c82dc23e60  0000000000000000521348c82dc23e60  7b78995ea148096c521348c82dc23e60 fpsr=00000000
+fabs v14.4h, v15.4h   4a23bc92c0a3ca39462ca98ced9ee362  8153f481b3023300833af8cfe8e7d506  0000000000000000033a78cf68e75506  8153f481b3023300833af8cfe8e7d506 fpsr=00000000
+fabs v15.4h, v16.4h   35d96c4c7ada81c9ab59a59dafba8e47  ef5c9847cb5bb98f619c4d5ea5f2255e  0000000000000000619c4d5e25f2255e  ef5c9847cb5bb98f619c4d5ea5f2255e fpsr=00000000
+fabs v16.4h, v17.4h   a9b3e9a3c3904619f63f1c4b1b9f4223  86aa11887877a6d849b3512b5e2a8218  000000000000000049b3512b5e2a0218  86aa11887877a6d849b3512b5e2a8218 fpsr=00000000
+fabs v17.4h, v18.4h   bc404be66e836250454c3b390ef5d0f9  7443688dbee9625eec89f510d5ec3223  00000000000000006c89751055ec3223  7443688dbee9625eec89f510d5ec3223 fpsr=00000000
+fabs v18.4h, v19.4h   4f764588d0158833cd1c203a3edd7a52  c947e188f225fba0cba393991642f012  00000000000000004ba3139916427012  c947e188f225fba0cba393991642f012 fpsr=00000000
+fabs v19.4h, v20.4h   ed553385d2a045fcb1e4194e2f953af0  c9f644af6c35b5a9298bd0f8923b179a  0000000000000000298b50f8123b179a  c9f644af6c35b5a9298bd0f8923b179a fpsr=00000000
+fabs v20.4h, v21.4h   fb255f422135581fb5fb8666d0e41372  1ca43e3121fba3ffacfe5cc842680cf4  00000000000000002cfe5cc842680cf4  1ca43e3121fba3ffacfe5cc842680cf4 fpsr=00000000
+fabs v21.4h, v22.4h   3151b853da308a1146e2e32500cd8fd7  4f455ede773e287b72d7d019b8471c89  000000000000000072d7501938471c89  4f455ede773e287b72d7d019b8471c89 fpsr=00000000
+fabs v22.4h, v23.4h   6f381e19ddf1bb3242f811ed9db08e7e  413a82184f5f247e5d780d4ad43726b8  00000000000000005d780d4a543726b8  413a82184f5f247e5d780d4ad43726b8 fpsr=00000000
+fabs v23.4h, v24.4h   943a71f409d6cbe08b9ef01e88ebf0c8  d4e28b3f89bd76674b41f3bc75980ce1  00000000000000004b4173bc75980ce1  d4e28b3f89bd76674b41f3bc75980ce1 fpsr=00000000
+fabs v24.4h, v25.4h   45609fd5e10f0ff762c923a14cb059d6  59cccbd0a3b1a06db3c73ae0ca2ee8a2  000000000000000033c73ae04a2e68a2  59cccbd0a3b1a06db3c73ae0ca2ee8a2 fpsr=00000000
+fabs v25.4h, v26.4h   0bcec3fc42073749ed465b523d239efb  9c834eaab10a107f9f54bf7726e66322  00000000000000001f543f7726e66322  9c834eaab10a107f9f54bf7726e66322 fpsr=00000000
+fabs v26.4h, v27.4h   e9e53f246ebcbf3251632ec2c358364b  d8308a161f694382213cafb53a36aff3  0000000000000000213c2fb53a362ff3  d8308a161f694382213cafb53a36aff3 fpsr=00000000
+fabs v27.4h, v28.4h   7b86d0bd834973a67642acd16da757d4  60898789ecfa86c5322e33ad392b6262  0000000000000000322e33ad392b6262  60898789ecfa86c5322e33ad392b6262 fpsr=00000000
+fabs v28.4h, v29.4h   77c81da655b51bba5253e15cf9d4ed0e  d29952a65385b97bbb8a37610426c3e4  00000000000000003b8a3761042643e4  d29952a65385b97bbb8a37610426c3e4 fpsr=00000000
+fabs v29.4h, v30.4h   e45c02af1c4e4317490de45654920060  0bdc2237e45a0fefef97b25e24fe3da4  00000000000000006f97325e24fe3da4  0bdc2237e45a0fefef97b25e24fe3da4 fpsr=00000000
+fabs v30.4h, v31.4h   7532770527b503faba181aeb0bcff737  b0d603a742d668fbec83e542163f4e88  00000000000000006c836542163f4e88  b0d603a742d668fbec83e542163f4e88 fpsr=00000000
+
+FNEG <Hd>, <Hn>
+
+fneg h0, h1   667c91075419db83ef0ab980073e89c8  6cdc819cfa68500465ee79fe87c9727e  0000000000000000000000000000f27e  6cdc819cfa68500465ee79fe87c9727e fpsr=00000000
+fneg h1, h2   ac89d491f84d4d934bc24480623a7323  c3c391a4d67da7770a72bf3d4d01cb88  00000000000000000000000000004b88  c3c391a4d67da7770a72bf3d4d01cb88 fpsr=00000000
+fneg h2, h3   a855ef96dd4b939b91c15167a2913ff9  bd93203fa5ba14d39e79ad9453d8d768  00000000000000000000000000005768  bd93203fa5ba14d39e79ad9453d8d768 fpsr=00000000
+fneg h3, h4   dc0a6363f6c70594cca9bcc22d02be55  7830544b46d033d95986e9e2ce510435  00000000000000000000000000008435  7830544b46d033d95986e9e2ce510435 fpsr=00000000
+fneg h4, h5   4142cc6e0151dec49a87e0aecdb528fb  1ce8746b100c316e5f21d698972394a5  000000000000000000000000000014a5  1ce8746b100c316e5f21d698972394a5 fpsr=00000000
+fneg h5, h6   1abdfbb76d0b454872abd2b6d05e3da6  a9a281db5ffba917992fba4fc06c3ac9  0000000000000000000000000000bac9  a9a281db5ffba917992fba4fc06c3ac9 fpsr=00000000
+fneg h6, h7   1c3cd4473b05d3739b191eb18db24784  395bb8385df15dd1efa9f2064667303b  0000000000000000000000000000b03b  395bb8385df15dd1efa9f2064667303b fpsr=00000000
+fneg h7, h8   843c995e1987d6cd91b17366b498ce77  bca76ecf3bf5428bf658d74321fc004f  0000000000000000000000000000804f  bca76ecf3bf5428bf658d74321fc004f fpsr=00000000
+fneg h8, h9   f778a7d83e836d98be89e66fb0620f95  6c9982253f796c209a63a01da4fc15dd  000000000000000000000000000095dd  6c9982253f796c209a63a01da4fc15dd fpsr=00000000
+fneg h9, h10   dbdf9b08c4db0c3c613532d7cd0d2505  98d0cbb0670d038eb3448f1a1f831c2c  00000000000000000000000000009c2c  98d0cbb0670d038eb3448f1a1f831c2c fpsr=00000000
+fneg h10, h11   82d5bd42ea2a9ce0d2064f0c52702884  9535e446495ef6e439b80035aa588dc4  00000000000000000000000000000dc4  9535e446495ef6e439b80035aa588dc4 fpsr=00000000
+fneg h11, h12   6a64c4bc1ef078764f175e08ea67f5db  df41b8323ce5b9c1c44832b87167b9ab  000000000000000000000000000039ab  df41b8323ce5b9c1c44832b87167b9ab fpsr=00000000
+fneg h12, h13   99b7b1906b87b46c65c6d4046a7db02c  ed62aaa3d0bc8048499b55733db3f2da  000000000000000000000000000072da  ed62aaa3d0bc8048499b55733db3f2da fpsr=00000000
+fneg h13, h14   f79e72ed5bfd7037ca9edd979b2f27a8  dd7809bb1ade554610281e521140e12f  0000000000000000000000000000612f  dd7809bb1ade554610281e521140e12f fpsr=00000000
+fneg h14, h15   362189c698dc26f0f74603b517463e55  9725b55308a2d1130289a02676ce7992  0000000000000000000000000000f992  9725b55308a2d1130289a02676ce7992 fpsr=00000000
+fneg h15, h16   08b60537cfcfe777b9c4aad2fb750f6d  f9936c23310119a90ede5217759691de  000000000000000000000000000011de  f9936c23310119a90ede5217759691de fpsr=00000000
+fneg h16, h17   31965e6ba117763d3801f1069d2d32d8  6ce5f7902ccea7d58f8a9df9690074d5  0000000000000000000000000000f4d5  6ce5f7902ccea7d58f8a9df9690074d5 fpsr=00000000
+fneg h17, h18   932174c4ec15b4a1525ebab3ddcf88f5  ce7a38f9d8685cf863ed602b346b02d6  000000000000000000000000000082d6  ce7a38f9d8685cf863ed602b346b02d6 fpsr=00000000
+fneg h18, h19   18a572afecf734e2e7d5725b0ec96331  0d0ac5f213624efc284cc26fbea1d16c  0000000000000000000000000000516c  0d0ac5f213624efc284cc26fbea1d16c fpsr=00000000
+fneg h19, h20   dbabbe15d021980b625e27aef3b33e8b  548df6decac624e79624406356756cd6  0000000000000000000000000000ecd6  548df6decac624e79624406356756cd6 fpsr=00000000
+fneg h20, h21   6876b2ef4493cb3611bde6fb4fb86a95  4b7848c9e734cbc93e2e51051cd7993c  0000000000000000000000000000193c  4b7848c9e734cbc93e2e51051cd7993c fpsr=00000000
+fneg h21, h22   d92e37acd05b093195d4cc196042f3c4  3b6c42f286950f5fdc3471d4a000137e  0000000000000000000000000000937e  3b6c42f286950f5fdc3471d4a000137e fpsr=00000000
+fneg h22, h23   7995b5a86a843e090eac1b090faf60f4  9c9caabe421a7bb4cfd27b0999f67851  0000000000000000000000000000f851  9c9caabe421a7bb4cfd27b0999f67851 fpsr=00000000
+fneg h23, h24   3106cf285ec202de0303cbd23c65e037  cd70a6e690ccee61f688dfef494e6890  0000000000000000000000000000e890  cd70a6e690ccee61f688dfef494e6890 fpsr=00000000
+fneg h24, h25   af4717cb4f0c47c331b57be58e66c298  3df836c31f59eefee506c39695529edf  00000000000000000000000000001edf  3df836c31f59eefee506c39695529edf fpsr=00000000
+fneg h25, h26   1f81ddcc6139683c60ba304b49a168cb  c4eacc5248f1cbd32400593fd06401d4  000000000000000000000000000081d4  c4eacc5248f1cbd32400593fd06401d4 fpsr=00000000
+fneg h26, h27   74388f35dbeec777eec8e091990f07ab  41859f453ecc281e798668f9c8c98689  00000000000000000000000000000689  41859f453ecc281e798668f9c8c98689 fpsr=00000000
+fneg h27, h28   d109228b0759d612ae4c89891b611cb7  ba65a049044f0a6ec6b4dfc0b99e8ac5  00000000000000000000000000000ac5  ba65a049044f0a6ec6b4dfc0b99e8ac5 fpsr=00000000
+fneg h28, h29   c6c3580edaccddcf5265f9e4da12353b  6297549b24245209338fce0077d9a665  00000000000000000000000000002665  6297549b24245209338fce0077d9a665 fpsr=00000000
+fneg h29, h30   d9369fb98def23e2b5fb412778825141  df3896fccb1fa9e696df458dcfef3ab5  0000000000000000000000000000bab5  df3896fccb1fa9e696df458dcfef3ab5 fpsr=00000000
+fneg h30, h31   d887cf76fb2c393d2780ce4bf4a68846  ab0fdde6a7b5615b0e6739d26218557a  0000000000000000000000000000d57a  ab0fdde6a7b5615b0e6739d26218557a fpsr=00000000
+
+FNEG <Vd>.<T>, <Vn>.<T>
+
+fneg v0.8h, v1.8h   c2e51eb2c26ae24c429f4d84f36bc2e8  8e7df72f5417009cee38f9ccd7f81f37  0e7d772fd417809c6e3879cc57f89f37  8e7df72f5417009cee38f9ccd7f81f37 fpsr=00000000
+fneg v1.8h, v2.8h   f2a1546f267de84418ad1bee69937563  29770459d723e1c39d554c895f5b36c0  a9778459572361c31d55cc89df5bb6c0  29770459d723e1c39d554c895f5b36c0 fpsr=00000000
+fneg v2.8h, v3.8h   10e8927696ec55e2380329874e749e64  c10380fea42b07395f10c1d376077a97  410300fe242b8739df1041d3f607fa97  c10380fea42b07395f10c1d376077a97 fpsr=00000000
+fneg v3.8h, v4.8h   2e04ddb8ce6b79a06fd086fddb7739ba  1053ca4553bf527dae5149384fd86c20  90534a45d3bfd27d2e51c938cfd8ec20  1053ca4553bf527dae5149384fd86c20 fpsr=00000000
+fneg v4.8h, v5.8h   3b1353a6dc026b3f41eddb408b1a83bd  92bf2a292c094c75314a43d24eb988fe  12bfaa29ac09cc75b14ac3d2ceb908fe  92bf2a292c094c75314a43d24eb988fe fpsr=00000000
+fneg v5.8h, v6.8h   9ef053f0f62818afda6eb8629600867d  72960517154507cf5ec1b548e5f9bb5f  f2968517954587cfdec1354865f93b5f  72960517154507cf5ec1b548e5f9bb5f fpsr=00000000
+fneg v6.8h, v7.8h   a09a97414698f159e6804a208c3aef5c  acbc0643aca508b945cb85797b52dcfd  2cbc86432ca588b9c5cb0579fb525cfd  acbc0643aca508b945cb85797b52dcfd fpsr=00000000
+fneg v7.8h, v8.8h   e7d126249134f10473a47ba276512cba  7abc1e3f1f44a40d833548a11bad0962  fabc9e3f9f44240d0335c8a19bad8962  7abc1e3f1f44a40d833548a11bad0962 fpsr=00000000
+fneg v8.8h, v9.8h   7151676243eafb855945992c900aca7c  781273a866fa978a94423df7150f4108  f812f3a8e6fa178a1442bdf7950fc108  781273a866fa978a94423df7150f4108 fpsr=00000000
+fneg v9.8h, v10.8h   e6eb18244c8f95bbb17c5080d451166d  05b8c1eecab4c0be68f85523d79f9f0c  85b841ee4ab440bee8f8d523579f1f0c  05b8c1eecab4c0be68f85523d79f9f0c fpsr=00000000
+randV128: 1024 calls, 1393 iters
+fneg v10.8h, v11.8h   df70e09bb0d6eb8b94165af6c637b7eb  f82dab261adaf78393fc8cfe1b5584db  782d2b269ada778313fc0cfe9b5504db  f82dab261adaf78393fc8cfe1b5584db fpsr=00000000
+fneg v11.8h, v12.8h   516be226f5a384cc8b8c5092f134a93a  bd31f61eaf7339316fe637f02448ac88  3d31761e2f73b931efe6b7f0a4482c88  bd31f61eaf7339316fe637f02448ac88 fpsr=00000000
+fneg v12.8h, v13.8h   ce08b43c76375b73104228ad24ae708d  b5fff19e1df48c28c508326540315023  35ff719e9df40c284508b265c031d023  b5fff19e1df48c28c508326540315023 fpsr=00000000
+fneg v13.8h, v14.8h   c2da713ddfbe20ee62ed7bd14f57939b  baa1500e5bbebe48a67944424c4eaafc  3aa1d00edbbe3e482679c442cc4e2afc  baa1500e5bbebe48a67944424c4eaafc fpsr=00000000
+fneg v14.8h, v15.8h   28fa9f6aa122df73c14cf1322c6fc011  208fa40aea8b37bb14690d0d90d069d6  a08f240a6a8bb7bb94698d0d10d0e9d6  208fa40aea8b37bb14690d0d90d069d6 fpsr=00000000
+fneg v15.8h, v16.8h   8596a2c29953279530d61873e1918131  6c1b8f6851ded3326b212d0a1e8180b0  ec1b0f68d1de5332eb21ad0a9e8100b0  6c1b8f6851ded3326b212d0a1e8180b0 fpsr=00000000
+fneg v16.8h, v17.8h   b2d53a7623b1760ed37897654c15cdbb  40e208fb8277ef56ae879d8e99ac994b  c0e288fb02776f562e871d8e19ac194b  40e208fb8277ef56ae879d8e99ac994b fpsr=00000000
+fneg v17.8h, v18.8h   2679afd4eda67346d348f7bc0cc35d54  a70e5e5a3030a0f7f71cd8d73ba23f44  270ede5ab03020f7771c58d7bba2bf44  a70e5e5a3030a0f7f71cd8d73ba23f44 fpsr=00000000
+fneg v18.8h, v19.8h   e34e2b34ae9b2dd31c1d0674dda09449  d928407deb9d4c3cb3aaeb1c91a8b198  5928c07d6b9dcc3c33aa6b1c11a83198  d928407deb9d4c3cb3aaeb1c91a8b198 fpsr=00000000
+fneg v19.8h, v20.8h   02d0fb54178f5368387de719fb59d66c  fb614308eca488666fef2d4394bfe4da  7b61c3086ca40866efefad4314bf64da  fb614308eca488666fef2d4394bfe4da fpsr=00000000
+fneg v20.8h, v21.8h   cfb9024454a1dff5e62ede86ba27f7b2  817f3e85e8d9b5f645db4a1e113763d8  017fbe8568d935f6c5dbca1e9137e3d8  817f3e85e8d9b5f645db4a1e113763d8 fpsr=00000000
+fneg v21.8h, v22.8h   74375b3467ee4c0b15999d3669e55679  57cbeb16f306e4f536d011bf39e3b202  d7cb6b16730664f5b6d091bfb9e33202  57cbeb16f306e4f536d011bf39e3b202 fpsr=00000000
+fneg v22.8h, v23.8h   f834673518e89429dfd72a10236460d0  234beca0f3d9a7afa813e66e129bf574  a34b6ca073d927af2813666e929b7574  234beca0f3d9a7afa813e66e129bf574 fpsr=00000000
+fneg v23.8h, v24.8h   b1cee2eacd5bdf215c1414ab14a7d662  9d661f1cc06e2aff2c8f9c4e2364608c  1d669f1c406eaaffac8f1c4ea364e08c  9d661f1cc06e2aff2c8f9c4e2364608c fpsr=00000000
+fneg v24.8h, v25.8h   b00c709d6799bdcdac0b328733f75f37  a716398f8972c081c5ad24f43c6b291e  2716b98f0972408145ada4f4bc6ba91e  a716398f8972c081c5ad24f43c6b291e fpsr=00000000
+fneg v25.8h, v26.8h   3b9dbd82c7b93e7907e68a7820b3d0d5  02c200141b3e087caa9fc6fb8400232f  82c280149b3e887c2a9f46fb0400a32f  02c200141b3e087caa9fc6fb8400232f fpsr=00000000
+fneg v26.8h, v27.8h   1d7ae72bc22e8f641e808282cbf994c5  506bb16f457cb07d22cb4f3562ed6b16  d06b316fc57c307da2cbcf35e2edeb16  506bb16f457cb07d22cb4f3562ed6b16 fpsr=00000000
+fneg v27.8h, v28.8h   37c3504f080ead048d0bb4e834ca63e5  f498d4ce3cb40a749200c4309e084fe1  749854cebcb48a74120044301e08cfe1  f498d4ce3cb40a749200c4309e084fe1 fpsr=00000000
+fneg v28.8h, v29.8h   6cfb19614c73775ff9894d3eda70e22f  9660b1fd2ed965ff52e32d1c61ec623c  166031fdaed9e5ffd2e3ad1ce1ece23c  9660b1fd2ed965ff52e32d1c61ec623c fpsr=00000000
+fneg v29.8h, v30.8h   ec3fcdbadb73ee3f25f818c40e48ad71  50554c1c4a9ae0c235da6940e181e567  d055cc1cca9a60c2b5dae94061816567  50554c1c4a9ae0c235da6940e181e567 fpsr=00000000
+fneg v30.8h, v31.8h   a2d6034040ef690313d087bc60defa26  4050bed30dcbc2cd9cc9f2725dbc2349  c0503ed38dcb42cd1cc97272ddbca349  4050bed30dcbc2cd9cc9f2725dbc2349 fpsr=00000000
+fneg v0.4h, v1.4h   6b43b7c8ef3ae223cd2665f0bc6583d6  9b96acbbae82c2fba1f6db7bd4ddf32d  000000000000000021f65b7b54dd732d  9b96acbbae82c2fba1f6db7bd4ddf32d fpsr=00000000
+fneg v1.4h, v2.4h   05c0703f21a708bf197a5e75409f8ebc  c4b19a523d29b0d58bac37ba5050a0c7  00000000000000000bacb7bad05020c7  c4b19a523d29b0d58bac37ba5050a0c7 fpsr=00000000
+fneg v2.4h, v3.4h   57cd827a199ba578e424469fc3b38d56  5f266815af1733225facf1cdf3ee5aae  0000000000000000dfac71cd73eedaae  5f266815af1733225facf1cdf3ee5aae fpsr=00000000
+fneg v3.4h, v4.4h   6451773725664353f9d23bc4096ce025  d89a02a4f756122e0b13a7830ad31c25  00000000000000008b1327838ad39c25  d89a02a4f756122e0b13a7830ad31c25 fpsr=00000000
+fneg v4.4h, v5.4h   9909ea29c99b30a963e96f81cef2a01f  1e87f0a162e4b6f6e6b353f681423c17  000000000000000066b3d3f60142bc17  1e87f0a162e4b6f6e6b353f681423c17 fpsr=00000000
+fneg v5.4h, v6.4h   c4888ad6fb96068abf0ce3edd9afb7e2  8b79cefb919eced2736d1309051d4eac  0000000000000000f36d9309851dceac  8b79cefb919eced2736d1309051d4eac fpsr=00000000
+fneg v6.4h, v7.4h   94c1ea268f143d648c3e7980d06fed6f  2b42907aba1f33118f2529149b127bc3  00000000000000000f25a9141b12fbc3  2b42907aba1f33118f2529149b127bc3 fpsr=00000000
+fneg v7.4h, v8.4h   b5fdf63e525d3feba342c69747df8863  ed0f1a45700b54f6115a355ea8ad0a90  0000000000000000915ab55e28ad8a90  ed0f1a45700b54f6115a355ea8ad0a90 fpsr=00000000
+fneg v8.4h, v9.4h   3ddbe9c2a6f6e512bfadeff8241e3c28  bfec5696158a0ccb99f6f56acd565067  000000000000000019f6756a4d56d067  bfec5696158a0ccb99f6f56acd565067 fpsr=00000000
+fneg v9.4h, v10.4h   3c1124001b91659515743ae0b18f0eb4  04802eb5d90d46256a9a5a4429cccc71  0000000000000000ea9ada44a9cc4c71  04802eb5d90d46256a9a5a4429cccc71 fpsr=00000000
+fneg v10.4h, v11.4h   bcdbf2a7bc81fa034c4609a265f82941  49a84aa060ad36459f47c73f6b938255  00000000000000001f47473feb930255  49a84aa060ad36459f47c73f6b938255 fpsr=00000000
+fneg v11.4h, v12.4h   6301eda3c6d6ae3f0ee7c80ba6fbe7af  6ec48bb888cabd8b175a1eb9730b5474  0000000000000000975a9eb9f30bd474  6ec48bb888cabd8b175a1eb9730b5474 fpsr=00000000
+fneg v12.4h, v13.4h   5332d25c32c5ba58b4353d152095212d  b416549ca745513e432fc4285cd110a0  0000000000000000c32f4428dcd190a0  b416549ca745513e432fc4285cd110a0 fpsr=00000000
+fneg v13.4h, v14.4h   5384b32f8f3b8682773a52fa547819c9  1b27be9bcf0e10ea2b26bec4a6760425  0000000000000000ab263ec426768425  1b27be9bcf0e10ea2b26bec4a6760425 fpsr=00000000
+fneg v14.4h, v15.4h   74ca84e211d6eb0a36d74814464ff864  11a81a5d949f34be0f03adc6b685bcc3  00000000000000008f032dc636853cc3  11a81a5d949f34be0f03adc6b685bcc3 fpsr=00000000
+fneg v15.4h, v16.4h   e4af9be86dd5d64c0ceb13c5d1eaa098  745aafe52d4e95afc5e0452688866081  000000000000000045e0c5260886e081  745aafe52d4e95afc5e0452688866081 fpsr=00000000
+fneg v16.4h, v17.4h   6ca1ddb8d6cd6d2c4fb273a0cd3c812c  373421adb82c509d1ec822a5ece5c289  00000000000000009ec8a2a56ce54289  373421adb82c509d1ec822a5ece5c289 fpsr=00000000
+fneg v17.4h, v18.4h   10d7c5b28d562b256781909d84c0aa9d  46460db99b03be371a30d4eab7a31d80  00000000000000009a3054ea37a39d80  46460db99b03be371a30d4eab7a31d80 fpsr=00000000
+fneg v18.4h, v19.4h   7361b239c6bb60a5a217767ce154cea9  cc44f62a37cf1caff1f748e7608cea69  000000000000000071f7c8e7e08c6a69  cc44f62a37cf1caff1f748e7608cea69 fpsr=00000000
+fneg v19.4h, v20.4h   779e84ad615eec0be2d4069ac35bccaf  ab8dbd606ef04866847d5cfdc7fd0aa5  0000000000000000047ddcfd47fd8aa5  ab8dbd606ef04866847d5cfdc7fd0aa5 fpsr=00000000
+fneg v20.4h, v21.4h   faef1b6d3e9faeb805191e590b328610  c18140ba1ec724bbb323f18bcc585d93  00000000000000003323718b4c58dd93  c18140ba1ec724bbb323f18bcc585d93 fpsr=00000000
+fneg v21.4h, v22.4h   ddb257d93ddc870bec459f189a3bda2b  ef81609828b38e0f5e48e7f24efcc394  0000000000000000de4867f2cefc4394  ef81609828b38e0f5e48e7f24efcc394 fpsr=00000000
+fneg v22.4h, v23.4h   014a17513d78586477b968384ed5a960  ec8710ffca0f332b11c008e3680e1a99  000000000000000091c088e3e80e9a99  ec8710ffca0f332b11c008e3680e1a99 fpsr=00000000
+fneg v23.4h, v24.4h   e908aced0955b67f0687e52afa0e634c  8672a7e7c4465daaf8f65719a83e389a  000000000000000078f6d719283eb89a  8672a7e7c4465daaf8f65719a83e389a fpsr=00000000
+fneg v24.4h, v25.4h   0fe3752eb1ff58a1861eb21a19a74fe1  a9c336c50a395257af7f3b990dccb85e  00000000000000002f7fbb998dcc385e  a9c336c50a395257af7f3b990dccb85e fpsr=00000000
+fneg v25.4h, v26.4h   3d7a4b24a470f9f173e45012a639beb8  8c68cb2fd20abe8a89d0e8fb196c32bd  000000000000000009d068fb996cb2bd  8c68cb2fd20abe8a89d0e8fb196c32bd fpsr=00000000
+fneg v26.4h, v27.4h   112c822868c37a032a491ddea25f98ca  503de8a6c4fe95ab18b9bbe926001e1a  000000000000000098b93be9a6009e1a  503de8a6c4fe95ab18b9bbe926001e1a fpsr=00000000
+fneg v27.4h, v28.4h   8e43a9cdb03e91d8e29887d09eee2923  c2a7a387d167f282db5771c6a6c0162d  00000000000000005b57f1c626c0962d  c2a7a387d167f282db5771c6a6c0162d fpsr=00000000
+fneg v28.4h, v29.4h   64c3c8f31496c86c724e30e7e800c13d  3787daa35552ae5a03aa438878d134f0  000000000000000083aac388f8d1b4f0  3787daa35552ae5a03aa438878d134f0 fpsr=00000000
+fneg v29.4h, v30.4h   caa63a35caddc516f6dcf26ea833a380  f4625db36342a8a1d76c2693f81c1435  0000000000000000576ca693781c9435  f4625db36342a8a1d76c2693f81c1435 fpsr=00000000
+fneg v30.4h, v31.4h   a04de2f3b3706a364da1adc6bee7b14f  d9980d18db98c1b637fefb450700975d  0000000000000000b7fe7b458700175d  d9980d18db98c1b637fefb450700975d fpsr=00000000
+
+FSQRT <Hd>, <Hn>
+
+fsqrt h0, h1   c68aca319cb4d9f902bfa00083dd9dc7  9d471b3c57b1d30768629292c9db4f6a  00000000000000000000000000004572  9d471b3c57b1d30768629292c9db4f6a fpsr=00000000
+fsqrt h1, h2   9a97735e88f4d0cb190ff6244d1406d4  4226770a9361f5f7878c194b150f1525  00000000000000000000000000002889  4226770a9361f5f7878c194b150f1525 fpsr=00000000
+fsqrt h2, h3   d6091249c74400d7725ed1c8f0481370  7b840e765d66da99acdf34244b0e8055  00000000000000000000000000007e00  7b840e765d66da99acdf34244b0e8055 fpsr=00000000
+fsqrt h3, h4   fb20e315c8fb07e70dd889d1d3231792  4723be200657ae56e61dddc13e915188  000000000000000000000000000046a7  4723be200657ae56e61dddc13e915188 fpsr=00000000
+fsqrt h4, h5   d03b289e3c3ff5aebcc979eb4cc0857e  7b5edb5f59ede021ed6bb64500ed06de  0000000000000000000000000000213e  7b5edb5f59ede021ed6bb64500ed06de fpsr=00000000
+fsqrt h5, h6   35b9c2430170a98b5f9282753b7f3f95  a49ce48e093f64703205c653c448cd3f  00000000000000000000000000007e00  a49ce48e093f64703205c653c448cd3f fpsr=00000000
+fsqrt h6, h7   a24e0f0b2d2e8cc2d8281af14681b732  477280550d50719989722807d7da346f  00000000000000000000000000003836  477280550d50719989722807d7da346f fpsr=00000000
+fsqrt h7, h8   268c6b7e9b93d19b5bba58e8e1c927ad  e814fa73cafac05ff19e1f8211469119  00000000000000000000000000007e00  e814fa73cafac05ff19e1f8211469119 fpsr=00000000
+fsqrt h8, h9   543ce1c67875a052c96df6ed4258c7f1  3c235c46486e774b773bc5de6d4be1a4  00000000000000000000000000007e00  3c235c46486e774b773bc5de6d4be1a4 fpsr=00000000
+fsqrt h9, h10   40cd368d6fe2effe9103811c125d722a  60d654755910358f31f0c3eb80b1bc99  00000000000000000000000000007e00  60d654755910358f31f0c3eb80b1bc99 fpsr=00000000
+fsqrt h10, h11   e746f8ab0d097917737d018a5a5442f2  de903629eb7cbad3152d3a84abc48154  00000000000000000000000000007e00  de903629eb7cbad3152d3a84abc48154 fpsr=00000000
+fsqrt h11, h12   6c8176edb6c5581f565b93f3b9ed4db6  4697db8c52f4167c568b8b1e79013133  00000000000000000000000000003673  4697db8c52f4167c568b8b1e79013133 fpsr=00000000
+randV128: 1280 calls, 1728 iters
+fsqrt h12, h13   c0326f92f544c1d108fce825a42f83af  a68d649fc70626c80d0d8d0892c2b18a  00000000000000000000000000007e00  a68d649fc70626c80d0d8d0892c2b18a fpsr=00000000
+fsqrt h13, h14   b81f1215993282e86afab6f843810006  476c5525b4923838ce1803aed8154112  00000000000000000000000000003e5e  476c5525b4923838ce1803aed8154112 fpsr=00000000
+fsqrt h14, h15   cb8031fa86b43909168c67920408af40  9a16de5b42f1a65873f0f00d63a6676f  00000000000000000000000000005174  9a16de5b42f1a65873f0f00d63a6676f fpsr=00000000
+fsqrt h15, h16   17c226b34c5a34a7bf8dccb0df52264b  91b4903cf39777fa3947b33c7b4a36ca  00000000000000000000000000003936  91b4903cf39777fa3947b33c7b4a36ca fpsr=00000000
+fsqrt h16, h17   e580bf97431ccd971a2a3c5bc4587782  a12601952d994b954b7415edc1b34343  00000000000000000000000000003f9f  a12601952d994b954b7415edc1b34343 fpsr=00000000
+fsqrt h17, h18   07c8246527734c8517ad25579f1dbf63  e97bc65213f5b386370943be44abcd00  00000000000000000000000000007e00  e97bc65213f5b386370943be44abcd00 fpsr=00000000
+fsqrt h18, h19   42e9f57daed1254c33a14ac880f3b84c  1db872d7196f03f22f8b5194f876a7a4  00000000000000000000000000007e00  1db872d7196f03f22f8b5194f876a7a4 fpsr=00000000
+fsqrt h19, h20   1c82218811983fe514d246fd45c42814  1b8f4c06c1c6d81e6d774ce2ab8513a4  000000000000000000000000000027d1  1b8f4c06c1c6d81e6d774ce2ab8513a4 fpsr=00000000
+fsqrt h20, h21   7adacbe18b1bc5f06f4ab031a4c41b5e  a2e2dc54a10fc7ebe00eaa06ecab2986  000000000000000000000000000032a6  a2e2dc54a10fc7ebe00eaa06ecab2986 fpsr=00000000
+fsqrt h21, h22   18f8cec856cda8c815645ddfc3969d32  e5b4982f8347cc056b4aa489471322d4  00000000000000000000000000002f64  e5b4982f8347cc056b4aa489471322d4 fpsr=00000000
+fsqrt h22, h23   4704a7fd7539a67b6bc4831cc3726064  942fe43c73cad30cccef11def36c92aa  00000000000000000000000000007e00  942fe43c73cad30cccef11def36c92aa fpsr=00000000
+fsqrt h23, h24   b1dd9cae316c95faa7ed4ee26dd6e740  3107b68984d4db389e20d8eec432c40d  00000000000000000000000000007e00  3107b68984d4db389e20d8eec432c40d fpsr=00000000
+fsqrt h24, h25   993af5532e348909ee9a0faaa5e049f6  8f328d6218bb5ae9931869de3b08f20b  00000000000000000000000000007e00  8f328d6218bb5ae9931869de3b08f20b fpsr=00000000
+fsqrt h25, h26   6ab43b0d56205ba781d781d92b430e4f  8d1249270de02f828c37a20e3750fb03  00000000000000000000000000007e00  8d1249270de02f828c37a20e3750fb03 fpsr=00000000
+fsqrt h26, h27   0a04ca3943a33c6069de64df996abe56  a08f7aab0a3b94409750f226f070a8a6  00000000000000000000000000007e00  a08f7aab0a3b94409750f226f070a8a6 fpsr=00000000
+fsqrt h27, h28   e76af0f79c635fe50a6c8fb142b51c63  0b8459738887cd96c3a8bc9a50436de7  000000000000000000000000000054dc  0b8459738887cd96c3a8bc9a50436de7 fpsr=00000000
+fsqrt h28, h29   318dd83a8b4fd9a79525ceed8b34c676  410faaf9335a6b6318bf9fd4e45f2a2c  00000000000000000000000000003307  410faaf9335a6b6318bf9fd4e45f2a2c fpsr=00000000
+fsqrt h29, h30   b3cc19fd2f102933748cb804f98d51ad  63257918bf57a16fa7c611ea378a1cc6  00000000000000000000000000002c5f  63257918bf57a16fa7c611ea378a1cc6 fpsr=00000000
+fsqrt h30, h31   5829ccc78138adcc66eddbf4eacd951b  83f6f8a2042f60654d4908816dd7679e  00000000000000000000000000005185  83f6f8a2042f60654d4908816dd7679e fpsr=00000000
+
+FSQRT <Vd>.<T>, <Vn>.<T>
+
+fsqrt v0.8h, v1.8h   d44a6d683c14859187c4b7a9ba659dc0  8a57b9b475c74a9ac7e4f0024fea1ce9  7e007e0058cf43447e007e0045a02c6f  8a57b9b475c74a9ac7e4f0024fea1ce9 fpsr=00000000
+fsqrt v1.8h, v2.8h   e1a6b20576e45319660bfabdf251bad7  f15181843ed8573b5e1eb3f400a721a0  7e007e003d3b49614cf27e001a762eb5  f15181843ed8573b5e1eb3f400a721a0 fpsr=00000000
+fsqrt v2.8h, v3.8h   a51b48e54cd51e1c6ec0dc41e35981a4  68388c83142e2162a6a7400c41cc403a  51cf7e0028172e907e003db13ecf3dd1  68388c83142e2162a6a7400c41cc403a fpsr=00000000
+fsqrt v3.8h, v4.8h   753d505c0ab09ee1b8d82f6a47ac22b0  57392c71721ca7ec07dc3d60ae9fe86f  4960343756fe7e00219b3ca37e007e00  57392c71721ca7ec07dc3d60ae9fe86f fpsr=00000000
+fsqrt v4.8h, v5.8h   d5c2adf11b78e6bdf5c89b0321220fe6  8e361a535a0e6be515814afcc8ac5227  7e002b1d4af653f228b1437a7e004704  8e361a535a0e6be515814afcc8ac5227 fpsr=00000000
+fsqrt v5.8h, v6.8h   ed8f348aac664eacaff4484170525fc1  f13bc7738256418b76fa9831407c1991  7e007e007e003ea959487e003dfd2aac  f13bc7738256418b76fa9831407c1991 fpsr=00000000
+fsqrt v6.8h, v7.8h   5838978548d16d6bf9832414c3af14ec  7011e9fc977a579b4599434661bc9e12  55b47e007e00498440bb3fa14ec67e00  7011e9fc977a579b4599434661bc9e12 fpsr=00000000
+fsqrt v7.8h, v8.8h   544da1105bccb1693018eb4b1e0dca8a  4632e74945f33bead1f79073408676e6  40fa7e0040e13bf57e007e003e045941  4632e74945f33bead1f79073408676e6 fpsr=00000000
+fsqrt v8.8h, v9.8h   54fea2bb6e22ced7f8755d1abc38816c  c34f179ed96993791434ccb7eb81b08f  7e0029857e007e00281a7e007e007e00  c34f179ed96993791434ccb7eb81b08f fpsr=00000000
+fsqrt v9.8h, v10.8h   7bd6fab1f066f1c39b728b98b7359f05  e209d1bd35a2e4bb69102ed3e89ebea3  7e007e0038bf7e00525d353a7e007e00  e209d1bd35a2e4bb69102ed3e89ebea3 fpsr=00000000
+fsqrt v10.8h, v11.8h   b1c6009702681bb3d263c8fe7b7d3782  012339f9fa9ea4e2b47820294273b14b  1c443aea7e007e007e002dc53f2f7e00  012339f9fa9ea4e2b47820294273b14b fpsr=00000000
+fsqrt v11.8h, v12.8h   3c59dcc3166cba001e7254415aa8ce6d  3d616f6e5273703c2b251ae55aa12bfd  3ca35574472f55d2338f2b6d4b4833fe  3d616f6e5273703c2b251ae55aa12bfd fpsr=00000000
+fsqrt v12.8h, v13.8h   a49b6129882f18d10b5aef24abfed6d5  31ff6f3a14e08a109ffc5653bc8638c0  36ed5560286a7e007e0049087e003a2a  31ff6f3a14e08a109ffc5653bc8638c0 fpsr=00000000
+fsqrt v13.8h, v14.8h   55d2e8525cc0762696d2924eeb23e01a  abc8640652ae595ea822c0efc24c75d6  7e005003474f4a8d7e007e007e0058d5  abc8640652ae595ea822c0efc24c75d6 fpsr=00000000
+fsqrt v14.8h, v15.8h   f97ab12b2ba45a7de821105e3894cf53  082cc900a58919e51e439bf94068375f  21c77e007e002ade2d017e003df0396e  082cc900a58919e51e439bf94068375f fpsr=00000000
+fsqrt v15.8h, v16.8h   9ab4503ea7a83efbd0ea437cc5935023  e526e8ea7278511ee4c699ab27a603eb  7e007e00573246667e007e0031881feb  e526e8ea7278511ee4c699ab27a603eb fpsr=00000000
+fsqrt v16.8h, v17.8h   9a349e40d527781e1631a8850d52596d  43e19344a0160660602c934a5f319dc7  3ff07e007e00210d4dc77e004d5d7e00  43e19344a0160660602c934a5f319dc7 fpsr=00000000
+fsqrt v17.8h, v18.8h   2f0267ce739b46a7b3fd525ab02c337e  029e80085846604c3e4ebfaa2cb6152d  1e797e0049d94ddd3d067e003457288d  029e80085846604c3e4ebfaa2cb6152d fpsr=00000000
+fsqrt v18.8h, v19.8h   fbe9d859891712b1b35914e7e42a7a71  5d4b2274ebe468fb5486cc410e1801e6  4c9a2f2f7e00525048417e0024f01d83  5d4b2274ebe468fb5486cc410e1801e6 fpsr=00000000
+fsqrt v19.8h, v20.8h   e9cdab2bb169e9ce39f9a86d69613a92  8aed8c8368ede101ec9d3c3e779a80f9  7e007e0052477e007e003c1f59847e00  8aed8c8368ede101ec9d3c3e779a80f9 fpsr=00000000
+fsqrt v20.8h, v21.8h   456b8bb56e4498c148387a3e59326169  4f64754589366d561fb31cf3e37509c5  457058977e00549f2d8d2c737e0022cb  4f64754589366d561fb31cf3e37509c5 fpsr=00000000
+fsqrt v21.8h, v22.8h   7b77ca9c542457b91dd92e901c2a76b3  a097a85aa041bdc22f9182dd81e819c9  7e007e007e007e0035807e007e002ace  a097a85aa041bdc22f9182dd81e819c9 fpsr=00000000
+fsqrt v22.8h, v23.8h   d90399e9dae54146d80143fbf733e392  3bcee14c0640be80f87a1d846ed595d5  3be77e0021007e007e002cb2553a7e00  3bcee14c0640be80f87a1d846ed595d5 fpsr=00000000
+fsqrt v23.8h, v24.8h   2e1317db718f10f9a16847995c1fcc0c  ca15c8ed1505ee21d5776119143daa31  7e007e00287b7e007e004e63281e7e00  ca15c8ed1505ee21d5776119143daa31 fpsr=00000000
+fsqrt v24.8h, v25.8h   016ff3a23f54a1c8fb0e617f68642b80  3bf48ba2d61af696e18c2239490ddcba  3bfa7e007e007e007e002f0e425b7e00  3bf48ba2d61af696e18c2239490ddcba fpsr=00000000
+fsqrt v25.8h, v26.8h   08a6b8d1064a9e3ad001994e59389c1a  94e1f4cffaf12c9a9dc130995c8eed66  7e007e007e00344a7e0036114c457e00  94e1f4cffaf12c9a9dc130995c8eed66 fpsr=00000000
+fsqrt v26.8h, v27.8h   8b7887b6f63ea182e21280c5b35ebc79  e6361aaa2010089529bb688260dce41f  7e002b4d2db3220e32c552014e3c7e00  e6361aaa2010089529bb688260dce41f fpsr=00000000
+fsqrt v27.8h, v28.8h   e49534af27175e15e16107dbd5a6606d  99d581b2e320cdf781478d9a43ec0c35  7e007e007e007e007e007e003ff6241a  99d581b2e320cdf781478d9a43ec0c35 fpsr=00000000
+fsqrt v28.8h, v29.8h   04a0245f9f65c076f574b3ab4566e87e  04130360427a62305f23dc1e1768efe3  20091f593f334f094d587e0029717e00  04130360427a62305f23dc1e1768efe3 fpsr=00000000
+fsqrt v29.8h, v30.8h   6793c6d7194320f1e0b3c777e933db0c  8b6449ea491c338e64793ba0751cf7cd  7e0042e1426537c6503b3bcf58857e00  8b6449ea491c338e64793ba0751cf7cd fpsr=00000000
+fsqrt v30.8h, v31.8h   b12f76631b32bd41aed1633909582ad6  83e5ef0298c3535817fa1ee38ba609b7  7e007e007e0047aa29a62d407e0022c3  83e5ef0298c3535817fa1ee38ba609b7 fpsr=00000000
+fsqrt v0.4h, v1.4h   c445f26226a6187fa7df90c35736bba3  fa795a662907aa69ae038ac60802d7fc  00000000000000007e007e0021aa7e00  fa795a662907aa69ae038ac60802d7fc fpsr=00000000
+fsqrt v1.4h, v2.4h   872e250c87472c2806c0a709ab26e38e  9aeff8e48c664ff3f48fa86ec0e2ba54  00000000000000007e007e007e007e00  9aeff8e48c664ff3f48fa86ec0e2ba54 fpsr=00000000
+fsqrt v2.4h, v3.4h   1f6bf81b2645b6018b0ac3f1a0bd60a8  8c6ac68f9ea00bc7aa9753c913bdfa7d  00000000000000007e0047e427de7e00  8c6ac68f9ea00bc7aa9753c913bdfa7d fpsr=00000000
+fsqrt v3.4h, v4.4h   7611035293dbb3cdb74b8d512c891fe8  6da299f279b631fc9c3e4bba0d306dbf  00000000000000007e0043dd248e54cb  6da299f279b631fc9c3e4bba0d306dbf fpsr=00000000
+fsqrt v4.4h, v5.4h   448b0100f58a3193ea534c3f4d54fb02  325d1ceb2f11d87bf6eadc2d3d476aa8  00000000000000007e007e003c98534c  325d1ceb2f11d87bf6eadc2d3d476aa8 fpsr=00000000
+fsqrt v5.4h, v6.4h   43c51e6768628f085cafcca94707b6da  3776619e0d5aca932d5ae16eeddcc289  000000000000000034a07e007e007e00  3776619e0d5aca932d5ae16eeddcc289 fpsr=00000000
+fsqrt v6.4h, v7.4h   8cd8dc081b67f5355e943c9eefb134c0  8293494f21fca67ee9454ce8204f7852  00000000000000007e00446e2ddf59e1  8293494f21fca67ee9454ce8204f7852 fpsr=00000000
+fsqrt v7.4h, v8.4h   9c54c65cc8cc8abfd94811120823b885  ed2955df375631a25058f0b2bd374aa8  000000000000000045e57e007e00434c  ed2955df375631a25058f0b2bd374aa8 fpsr=00000000
+fsqrt v8.4h, v9.4h   6617b826e12955b7ddc20e4d86b96483  5319f39f9ecac7852d8ab81fe32b187b  000000000000000034b57e007e0029fd  5319f39f9ecac7852d8ab81fe32b187b fpsr=00000000
+fsqrt v9.4h, v10.4h   09d6d8d885aff022b22bcec66697e83d  e0e63a5c5c94bb02074b769dba030784  0000000000000000216759257e00217c  e0e63a5c5c94bb02074b769dba030784 fpsr=00000000
+fsqrt v10.4h, v11.4h   c11ccb19d2b368a946d06f7c6a6421d3  f48af22d1951e72f690496f69de3b8ce  000000000000000052567e007e007e00  f48af22d1951e72f690496f69de3b8ce fpsr=00000000
+fsqrt v11.4h, v12.4h   896d49ea72f8f2dfd2e519c3681f9ec3  ea41e60b86ce74605bfb073f1283795e  00000000000000004bfd216227385a8d  ea41e60b86ce74605bfb073f1283795e fpsr=00000000
+fsqrt v12.4h, v13.4h   1a3994301bc23c0389e954d394935db6  5f0b9f3435e839d6307a0128ecf5f449  000000000000000035fc1c4d7e007e00  5f0b9f3435e839d6307a0128ecf5f449 fpsr=00000000
+fsqrt v13.4h, v14.4h   53861ef4365dab7a38013545f68ff409  a9519fc481a9a0eea5a8b334dd794614  00000000000000007e007e007e0040ee  a9519fc481a9a0eea5a8b334dd794614 fpsr=00000000
+randV128: 1536 calls, 2067 iters
+fsqrt v14.4h, v15.4h   72b0b8f1a8f12219c85df7728a9ac8e5  3a43017b120053c576502975eb08ee5e  00000000000000005906329b7e007e00  3a43017b120053c576502975eb08ee5e fpsr=00000000
+fsqrt v15.4h, v16.4h   b476b35703f8f0f1eb3fc28fd068aefb  8377d12725708809765a434867421e57  0000000000000000590a3fa251632d09  8377d12725708809765a434867421e57 fpsr=00000000
+fsqrt v16.4h, v17.4h   435ec7c1a9cb706003f7df7ab3e6d16b  ada181a18ad9d09f6709d94ed44591d5  0000000000000000514e7e007e007e00  ada181a18ad9d09f6709d94ed44591d5 fpsr=00000000
+fsqrt v17.4h, v18.4h   7a30b9bfe71c46956bf33b64ddb3f772  69d08752515fa192d8b248ad4c876c1e  00000000000000007e00421e4441540f  69d08752515fa192d8b248ad4c876c1e fpsr=00000000
+fsqrt v18.4h, v19.4h   4eddaffabac1d2bd400641bd53b338f3  b9f8b9bac9d462a96eb18a806646c2a4  0000000000000000552c7e0051027e00  b9f8b9bac9d462a96eb18a806646c2a4 fpsr=00000000
+fsqrt v19.4h, v20.4h   9630e571ed391d0e3a673b3de33d9c62  b0fa97f72c2ec20e10003c7b8f1e3c8c  000000000000000025a83c3c7e003c44  b0fa97f72c2ec20e10003c7b8f1e3c8c fpsr=00000000
+fsqrt v20.4h, v21.4h   ae26b044b2de6fb568e08d6d2a278b3b  2f39036958cea0229efd40fea670b837  00000000000000007e003e527e007e00  2f39036958cea0229efd40fea670b837 fpsr=00000000
+fsqrt v21.4h, v22.4h   7620f0d4e811a713aad018ae06d3e4df  1613db6e2e13de44f80a746a8a9c1804  00000000000000007e0058347e0029ab  1613db6e2e13de44f80a746a8a9c1804 fpsr=00000000
+fsqrt v22.4h, v23.4h   ce7d85807031a787e098bc6058a089ac  56efc6eff999a7571c2aee70b3922d51  00000000000000002c157e007e00349d  56efc6eff999a7571c2aee70b3922d51 fpsr=00000000
+fsqrt v23.4h, v24.4h   9c31822c6aaac4ded2c45b77c85515a2  aee22eadf7ba7b32a72dcf93dd1f3247  00000000000000007e007e007e003716  aee22eadf7ba7b32a72dcf93dd1f3247 fpsr=00000000
+fsqrt v24.4h, v25.4h   13dedbcdf7269287993b3fa461ed52bb  e1d712331df72e6e1d71c3eab80ee227  00000000000000002caa7e007e007e00  e1d712331df72e6e1d71c3eab80ee227 fpsr=00000000
+fsqrt v25.4h, v26.4h   a5fdc463222aa8a4915159eab147f2f5  e87b05bcbd7e79f33cc7c8a8ad19a545  00000000000000003c5f7e007e007e00  e87b05bcbd7e79f33cc7c8a8ad19a545 fpsr=00000000
+fsqrt v26.4h, v27.4h   787170ff1018f127682d4ad92f00b640  062b95cbb71a5477d79c2e3e206d7b76  00000000000000007e0034ff2df35bba  062b95cbb71a5477d79c2e3e206d7b76 fpsr=00000000
+fsqrt v27.4h, v28.4h   8bb8a0a8016332b0e3518329d34af5a6  1c46a1bdeb2b9d59ce50d50df06b4419  00000000000000007e007e007e00400c  1c46a1bdeb2b9d59ce50d50df06b4419 fpsr=00000000
+fsqrt v28.4h, v29.4h   c9611cde37959b4cd91e5db77abc3411  d8eaf997f07414df561343ef2337b325  000000000000000048ee3ff72f997e00  d8eaf997f07414df561343ef2337b325 fpsr=00000000
+fsqrt v29.4h, v30.4h   901c0d6900edf86a0158413c5196da3d  ee75320989cf2631c75a810f33800fea  00000000000000007e007e0037bf25a0  ee75320989cf2631c75a810f33800fea fpsr=00000000
+fsqrt v30.4h, v31.4h   d696144656b55795b629c3ab5ea13ec3  111eab69783527c0ccd64ec77b5e309b  00000000000000007e0045355bad3612  111eab69783527c0ccd64ec77b5e309b fpsr=00000000