]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add even more 64-bit integer primops (sigh)
authorJulian Seward <jseward@acm.org>
Wed, 27 Apr 2005 11:42:44 +0000 (11:42 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 27 Apr 2005 11:42:44 +0000 (11:42 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@1146

VEX/priv/ir/irdefs.c
VEX/priv/ir/iropt.c
VEX/pub/libvex_ir.h

index 3dbe71b22547c5fbabf248927f686885e9935033..747bd63831356afec81050378b795283297e1c9a 100644 (file)
@@ -142,11 +142,19 @@ void ppIROp ( IROp op )
       case Iop_32Sto64:  vex_printf("32Sto64"); return;
       case Iop_32Uto64:  vex_printf("32Uto64"); return;
       case Iop_32to8:    vex_printf("32to8");   return;
+      case Iop_16Uto64:  vex_printf("16Uto64"); return;
+      case Iop_16Sto64:  vex_printf("16Sto64"); return;
+      case Iop_8Uto64:   vex_printf("8Uto64"); return;
+      case Iop_8Sto64:   vex_printf("8Sto64"); return;
+      case Iop_64to16:   vex_printf("64to16"); return;
+      case Iop_64to8:    vex_printf("64to8");  return;
 
       case Iop_Not1:     vex_printf("Not1");    return;
       case Iop_32to1:    vex_printf("32to1");   return;
+      case Iop_64to1:    vex_printf("64to1");   return;
       case Iop_1Uto8:    vex_printf("1Uto8");   return;
       case Iop_1Uto32:   vex_printf("1Uto32");  return;
+      case Iop_1Uto64:   vex_printf("1Uto64");  return;
       case Iop_1Sto8:    vex_printf("1Sto8");  return;
       case Iop_1Sto16:   vex_printf("1Sto16");  return;
       case Iop_1Sto32:   vex_printf("1Sto32");  return;
@@ -1350,8 +1358,9 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 )
       case Iop_1Sto8:  UNARY(Ity_I8,Ity_I1);
       case Iop_1Sto16: UNARY(Ity_I16,Ity_I1);
       case Iop_1Uto32: case Iop_1Sto32: UNARY(Ity_I32,Ity_I1);
-      case Iop_1Sto64: UNARY(Ity_I64,Ity_I1);
+      case Iop_1Sto64: case Iop_1Uto64: UNARY(Ity_I64,Ity_I1);
       case Iop_32to1:  UNARY(Ity_I1,Ity_I32);
+      case Iop_64to1:  UNARY(Ity_I1,Ity_I64);
 
       case Iop_8Uto32: case Iop_8Sto32:
          UNARY(Ity_I32,Ity_I8);
@@ -1365,7 +1374,16 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 )
       case Iop_32Sto64: case Iop_32Uto64:
          UNARY(Ity_I64,Ity_I32);
 
+      case Iop_8Uto64: case Iop_8Sto64:
+         UNARY(Ity_I64,Ity_I8);
+
+      case Iop_16Uto64: case Iop_16Sto64:
+         UNARY(Ity_I64,Ity_I16);
+      case Iop_64to16:
+         UNARY(Ity_I16, Ity_I64);
+
       case Iop_32to8: UNARY(Ity_I8,Ity_I32);
+      case Iop_64to8: UNARY(Ity_I8,Ity_I64);
 
       case Iop_ScaleF64: case Iop_PRemF64: case Iop_PRem1F64:
       case Iop_AtanF64: case Iop_Yl2xF64:  case Iop_Yl2xp1F64: 
index a6e31cf65c9d6568bd4a924b10bd71228a03067b..b78b8f6c4917cb0374dc3cafdbf75f0c79ffe736 100644 (file)
@@ -898,6 +898,14 @@ static IRExpr* fold_Expr ( IRExpr* e )
             e2 = IRExpr_Const(IRConst_U32((UInt)s32));
             break;
          }
+         case Iop_8Uto64:
+            e2 = IRExpr_Const(IRConst_U64(
+                    0xFFULL & e->Iex.Unop.arg->Iex.Const.con->Ico.U8));
+            break;
+         case Iop_16Uto64:
+            e2 = IRExpr_Const(IRConst_U64(
+                    0xFFFFULL & e->Iex.Unop.arg->Iex.Const.con->Ico.U16));
+            break;
          case Iop_8Uto32:
             e2 = IRExpr_Const(IRConst_U32(
                     0xFF & e->Iex.Unop.arg->Iex.Const.con->Ico.U8));
@@ -919,6 +927,11 @@ static IRExpr* fold_Expr ( IRExpr* e )
                     1 == (1 & e->Iex.Unop.arg->Iex.Const.con->Ico.U32)
                  )));
             break;
+         case Iop_64to1:
+            e2 = IRExpr_Const(IRConst_U1(toBool(
+                    1 == (1 & e->Iex.Unop.arg->Iex.Const.con->Ico.U64)
+                 )));
+            break;
 
          case Iop_Not64:
             e2 = IRExpr_Const(IRConst_U64(
@@ -942,6 +955,10 @@ static IRExpr* fold_Expr ( IRExpr* e )
                     notBool(e->Iex.Unop.arg->Iex.Const.con->Ico.U1)));
             break;
 
+         case Iop_Neg64:
+            e2 = IRExpr_Const(IRConst_U64(
+                    - (e->Iex.Unop.arg->Iex.Const.con->Ico.U64)));
+            break;
          case Iop_Neg32:
             e2 = IRExpr_Const(IRConst_U32(
                     - (e->Iex.Unop.arg->Iex.Const.con->Ico.U32)));
@@ -951,6 +968,18 @@ static IRExpr* fold_Expr ( IRExpr* e )
                     - (e->Iex.Unop.arg->Iex.Const.con->Ico.U8)));
             break;
 
+         case Iop_64to8: {
+            ULong w64 = e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
+            w64 &= 0xFFULL;
+            e2 = IRExpr_Const(IRConst_U8( (UChar)w64 ));
+            break;
+         }
+         case Iop_64to16: {
+            ULong w64 = e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
+            w64 &= 0xFFFFULL;
+            e2 = IRExpr_Const(IRConst_U16( (UChar)w64 ));
+            break;
+         }
          case Iop_64to32: {
             ULong w64 = e->Iex.Unop.arg->Iex.Const.con->Ico.U64;
             w64 &= 0x00000000FFFFFFFFULL;
@@ -1262,6 +1291,14 @@ static IRExpr* fold_Expr ( IRExpr* e )
       } else {
 
          /* other cases (identities, etc) */
+
+         /* Shl64/Shr64(x,0) ==> x */
+         if ((e->Iex.Binop.op == Iop_Shl64 || e->Iex.Binop.op == Iop_Shr64)
+             && e->Iex.Binop.arg2->tag == Iex_Const
+             && e->Iex.Binop.arg2->Iex.Const.con->Ico.U8 == 0) {
+            e2 = e->Iex.Binop.arg1;
+         } else
+
          /* Shl32/Shr32(x,0) ==> x */
          if ((e->Iex.Binop.op == Iop_Shl32 || e->Iex.Binop.op == Iop_Shr32)
              && e->Iex.Binop.arg2->tag == Iex_Const
@@ -1331,7 +1368,6 @@ static IRExpr* fold_Expr ( IRExpr* e )
               || e->Iex.Binop.op == Iop_Xor16
               || e->Iex.Binop.op == Iop_Xor8)
              && sameIRTemps(e->Iex.Binop.arg1, e->Iex.Binop.arg2)) {
-            vassert(0); /* awaiting test case */
             e2 = mkZeroForXor(e->Iex.Binop.op);
          }
 
index 808c63c918a1af4bf18a2ca59ea1d473717e28d6..645cacc282591178ddc1e57c7d55426e6afaec59 100644 (file)
@@ -286,8 +286,10 @@ typedef
       /* 1-bit stuff */
       Iop_Not1,   /* :: Ity_Bit -> Ity_Bit */
       Iop_32to1,  /* :: Ity_I32 -> Ity_Bit, just select bit[0] */
-      Iop_1Uto8,  /* :: Ity_Bit -> Ity_I8, unsigned widen */
+      Iop_64to1,  /* :: Ity_I64 -> Ity_Bit, just select bit[0] */
+      Iop_1Uto8,  /* :: Ity_Bit -> Ity_I8,  unsigned widen */
       Iop_1Uto32, /* :: Ity_Bit -> Ity_I32, unsigned widen */
+      Iop_1Uto64, /* :: Ity_Bit -> Ity_I64, unsigned widen */
       Iop_1Sto8,  /* :: Ity_Bit -> Ity_I8,  signed widen */
       Iop_1Sto16, /* :: Ity_Bit -> Ity_I16, signed widen */
       Iop_1Sto32, /* :: Ity_Bit -> Ity_I32, signed widen */