]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
add Iops Iop_Rotx32 and Iop_Rotx64
authorPetar Jovanovic <mips32r2@gmail.com>
Thu, 1 Feb 2018 17:09:56 +0000 (18:09 +0100)
committerPetar Jovanovic <mips32r2@gmail.com>
Thu, 1 Feb 2018 17:09:56 +0000 (18:09 +0100)
Part of MIPS32/64 Revision 6 changes.

Contributed by:
  Tamara Vlahovic, Aleksandar Rikalo and Aleksandra Karadzic.

Related BZ issue - #387410.

VEX/priv/ir_defs.c
VEX/pub/libvex_ir.h
memcheck/mc_translate.c
memcheck/tests/vbit-test/irops.c

index 8627beb5454526d967edf11f043a03cb79a45dcb..2cffd0b5713256b4227fc69d912dcbb8f24348bb 100644 (file)
@@ -1297,6 +1297,8 @@ void ppIROp ( IROp op )
       case Iop_BCDSub:  vex_printf("BCDSub"); return;
       case Iop_I128StoBCD128:  vex_printf("bcdcfsq."); return;
       case Iop_BCD128toI128S:  vex_printf("bcdctsq."); return;
+      case Iop_Rotx32:  vex_printf("bitswap"); return;
+      case Iop_Rotx64:  vex_printf("dbitswap"); return;
 
       case Iop_PwBitMtxXpose64x2: vex_printf("BitMatrixTranspose64x2"); return;
 
@@ -3578,6 +3580,10 @@ void typeOfPrimop ( IROp op,
       case Iop_ShrN64x4:
       case Iop_SarN16x16: case Iop_SarN32x8:
          BINARY(Ity_V256,Ity_I8, Ity_V256);
+      case Iop_Rotx32:
+         QUATERNARY(Ity_I32, Ity_I8, Ity_I8, Ity_I8, Ity_I32);
+      case Iop_Rotx64:
+         QUATERNARY(Ity_I64, Ity_I8, Ity_I8, Ity_I8, Ity_I64);
 
       default:
          ppIROp(op);
index ed7d52b273bf799c4ee0f83e2802be603560a955..2b07afd5124f3570ef4d670d4da39637fe51e502 100644 (file)
@@ -1936,6 +1936,7 @@ typedef
 
       Iop_Max32Fx8, Iop_Min32Fx8,
       Iop_Max64Fx4, Iop_Min64Fx4,
+      Iop_Rotx32, Iop_Rotx64,
       Iop_LAST      /* must be the last enumerator */
    }
    IROp;
index ae7e472d13a5f50199c458e4c8365fdbeaf08323..666719160092d44d9e054e0fffb9ef0949e29aa4 100644 (file)
@@ -2012,6 +2012,30 @@ IRAtom* mkLazy4 ( MCEnv* mce, IRType finalVty,
       return at;
    }
 
+   if (t1 == Ity_I32 && t2 == Ity_I8 && t3 == Ity_I8 && t4 == Ity_I8
+       && finalVty == Ity_I32) {
+      if (0) VG_(printf)("mkLazy4: I32 x I8 x I8 x I8 -> I32\n");
+      at = mkPCastTo(mce, Ity_I8, va1);
+      /* Now fold in 2nd, 3rd, 4th args. */
+      at = mkUifU(mce, Ity_I8, at, va2);
+      at = mkUifU(mce, Ity_I8, at, va3);
+      at = mkUifU(mce, Ity_I8, at, va4);
+      at = mkPCastTo(mce, Ity_I32, at);
+      return at;
+   }
+
+   if (t1 == Ity_I64 && t2 == Ity_I8 && t3 == Ity_I8 && t4 == Ity_I8
+       && finalVty == Ity_I64) {
+      if (0) VG_(printf)("mkLazy4: I64 x I8 x I8 x I8 -> I64\n");
+      at = mkPCastTo(mce, Ity_I8, va1);
+      /* Now fold in 2nd, 3rd, 4th args. */
+      at = mkUifU(mce, Ity_I8, at, va2);
+      at = mkUifU(mce, Ity_I8, at, va3);
+      at = mkUifU(mce, Ity_I8, at, va4);
+      at = mkPCastTo(mce, Ity_I64, at);
+      return at;
+   }
+
    if (1) {
       VG_(printf)("mkLazy4: ");
       ppIRType(t1);
@@ -3020,6 +3044,11 @@ IRAtom* expr2vbits_Qop ( MCEnv* mce,
          return assignNew('V', mce, Ity_V256,
                           IRExpr_Qop(op, vatom1, vatom2, vatom3, vatom4));
 
+      /* I32/I64 x I8 x I8 x I8 -> I32/I64 */
+      case Iop_Rotx32:
+         return mkLazy4(mce, Ity_I32, vatom1, vatom2, vatom3, vatom4);
+      case Iop_Rotx64:
+         return mkLazy4(mce, Ity_I64, vatom1, vatom2, vatom3, vatom4);
       default:
          ppIROp(op);
          VG_(tool_panic)("memcheck:expr2vbits_Qop");
index a969a14b2694fec0503db41157b69792f6f3728e..adc7845aeeed8500a19799b655eb946f1023b924 100644 (file)
@@ -1128,6 +1128,8 @@ static irop_t irops[] = {
   { DEFOP(Iop_NCipherLV128, UNDEF_ALL_64x2), .ppc64 = 1, .ppc32 = 1 },
   { DEFOP(Iop_SHA512, UNDEF_SOME), .ppc64 = 1, .ppc32 = 1 },
   { DEFOP(Iop_SHA256, UNDEF_SOME), .ppc64 = 1, .ppc32 = 1 },
+  { DEFOP(Iop_Rotx32, UNDEF_ALL), },
+  { DEFOP(Iop_Rotx64, UNDEF_ALL), },
   { DEFOP(Iop_PwBitMtxXpose64x2, UNDEF_64x2_TRANSPOSE), .ppc64 = 1, .ppc32 = 1 },
 };