]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add a couple more primops needed by Memcheck.
authorJulian Seward <jseward@acm.org>
Thu, 4 Nov 2004 16:57:50 +0000 (16:57 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 4 Nov 2004 16:57:50 +0000 (16:57 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@486

VEX/priv/host-x86/isel.c
VEX/priv/ir/irdefs.c
VEX/pub/libvex_ir.h

index 64b814943425e353730a49c6797cd0c9c48fee8a..bbf400a4054c3ed7d04b3aeef0d4ff40b3916121 100644 (file)
@@ -1320,7 +1320,7 @@ static X86CondCode iselCondCode_wrk ( ISelEnv* env, IRExpr* e )
       switch (e->Iex.Binop.op) {
          case Iop_CmpEQ16:  return Xcc_Z;
          case Iop_CmpNE16:  return Xcc_NZ;
-         default: vpanic("iselCondCode(x86): CmpXX8");
+         default: vpanic("iselCondCode(x86): CmpXX16");
       }
    }
 
@@ -1346,6 +1346,25 @@ static X86CondCode iselCondCode_wrk ( ISelEnv* env, IRExpr* e )
       }
    }
 
+   /* CmpNE64 */
+   if (e->tag == Iex_Binop 
+       && e->Iex.Binop.op == Iop_CmpNE64) {
+      HReg hi1, hi2, lo1, lo2;
+      HReg tHi = newVRegI(env);
+      HReg tLo = newVRegI(env);
+      iselIntExpr64( &hi1, &lo1, env, e->Iex.Binop.arg1 );
+      iselIntExpr64( &hi2, &lo2, env, e->Iex.Binop.arg2 );
+      addInstr(env, mk_MOVsd_RR(hi1, tHi));
+      addInstr(env, X86Instr_Alu32R(Xalu_XOR,X86RMI_Reg(hi2), tHi));
+      addInstr(env, mk_MOVsd_RR(lo1, tLo));
+      addInstr(env, X86Instr_Alu32R(Xalu_XOR,X86RMI_Reg(lo2), tLo));
+      addInstr(env, X86Instr_Alu32R(Xalu_OR,X86RMI_Reg(tHi), tLo));
+      switch (e->Iex.Binop.op) {
+         case Iop_CmpNE64:  return Xcc_NZ;
+         default: vpanic("iselCondCode(x86): CmpXX64");
+      }
+   }
+
    /* var */
    if (e->tag == Iex_Tmp) {
       HReg r32 = lookupIRTemp(env, e->Iex.Tmp.tmp);
@@ -1490,6 +1509,22 @@ static void iselIntExpr64_wrk ( HReg* rHi, HReg* rLo, ISelEnv* env, IRExpr* e )
       return;
    }
 
+   /* 1Sto64(e) */
+   /* could do better than this, but for now ... */
+   if (e->tag == Iex_Unop
+       && e->Iex.Unop.op == Iop_1Sto64) {
+      HReg tLo = newVRegI(env);
+      HReg tHi = newVRegI(env);
+      X86CondCode cond = iselCondCode(env, e->Iex.Unop.arg);
+      addInstr(env, X86Instr_Set32(cond,tLo));
+      addInstr(env, X86Instr_Sh32(Xsh_SHL, 31, X86RM_Reg(tLo)));
+      addInstr(env, X86Instr_Sh32(Xsh_SAR, 31, X86RM_Reg(tLo)));
+      addInstr(env, mk_MOVsd_RR(tLo, tHi));
+      *rHi = tHi;
+      *rLo = tLo;
+      return;
+   }
+
    /* 32Uto64(e) */
    if (e->tag == Iex_Unop
        && e->Iex.Unop.op == Iop_32Uto64) {
index dbd38b6b84e10027b19575c85515b53823cbef85..9b26708d35780722c578ee54c7d6a8a42562796b 100644 (file)
@@ -120,6 +120,7 @@ void ppIROp ( IROp op )
       case Iop_1Uto8:    vex_printf("1Uto8");   return;
       case Iop_1Uto32:   vex_printf("1Uto32");  return;
       case Iop_1Sto32:   vex_printf("1Sto32");  return;
+      case Iop_1Sto64:   vex_printf("1Sto64");  return;
 
       case Iop_MullS8:   vex_printf("MullS8");  return;
       case Iop_MullS16:  vex_printf("MullS16"); return;
@@ -975,6 +976,7 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 )
       case Iop_Not1:   UNARY(Ity_Bit,Ity_Bit);
       case Iop_1Uto8:  UNARY(Ity_I8,Ity_Bit);
       case Iop_1Uto32: case Iop_1Sto32: UNARY(Ity_I32,Ity_Bit);
+      case Iop_1Sto64: UNARY(Ity_I64,Ity_Bit);
       case Iop_32to1:  UNARY(Ity_Bit,Ity_I32);
 
       case Iop_8Uto32: case Iop_8Sto32:
index e4943cff7e46025919ccd0928a28f1d5c7c0eb23..8c618aac079f7f5f52f1d5eb67ab5919c7a61031 100644 (file)
@@ -193,6 +193,7 @@ typedef
       Iop_1Uto8,  /* :: Ity_Bit -> Ity_I8, unsigned widen */
       Iop_1Uto32, /* :: Ity_Bit -> Ity_I32, unsigned widen */
       Iop_1Sto32, /* :: Ity_Bit -> Ity_I32, signed widen */
+      Iop_1Sto64, /* :: Ity_Bit -> Ity_I64, signed widen */
 
       /* ------ Floating point.  We try and be IEEE754 compliant. ------ */