]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
x86 -> IR -> x86: fix enough bits to make OOo 1.1.2 work.
authorJulian Seward <jseward@acm.org>
Sun, 19 Sep 2004 11:55:46 +0000 (11:55 +0000)
committerJulian Seward <jseward@acm.org>
Sun, 19 Sep 2004 11:55:46 +0000 (11:55 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@271

VEX/priv/guest-x86/toIR.c
VEX/priv/host-x86/isel.c
VEX/priv/ir/irdefs.c

index 398b1269111d3bc2ff21055dd3406b655cd0ec04..3751f73cb4d25a51115a26a0739cc49a06a34a0e 100644 (file)
@@ -3930,6 +3930,10 @@ UInt dis_FPU ( Bool* decode_ok, UChar sorb, UInt delta )
                fp_do_op_ST_ST ( "mul", Iop_MulF64, 0, modrm - 0xC8, False );
                break;
 
+            case 0xE0 ... 0xE7: /* FSUBR %st(0),%st(?) */
+               fp_do_oprev_ST_ST ( "subr", Iop_SubF64, 0, modrm - 0xE0, False );
+               break;
+
             case 0xE8 ... 0xEF: /* FSUB %st(0),%st(?) */
                fp_do_op_ST_ST ( "sub", Iop_SubF64, 0, modrm - 0xE8, False );
                break;
@@ -7345,13 +7349,9 @@ static UInt disInstr ( UInt delta, Bool* isEnd )
          putIReg(4, R_EAX, unop(Iop_16Sto32, getIReg(2, R_EAX)));
          DIP("cwde\n");
       } else {
-         vassert(0);
-//--          vg_assert(sz == 2);
-//--          uInstr2(cb, GET,   1, ArchReg, R_EAX, TempReg, t1);
-//--          uInstr1(cb, WIDEN, 2, TempReg, t1); /* 2 == dst size */
-//--          uWiden(cb, 1, True);
-//--          uInstr2(cb, PUT, 2, TempReg, t1, ArchReg, R_EAX);
-//--          DIP("cbw\n");
+         vassert(sz == 2);
+         putIReg(2, R_EAX, unop(Iop_8Sto16, getIReg(1, R_EAX)));
+         DIP("cbw\n");
       }
       break;
 
@@ -8124,7 +8124,7 @@ static UInt disInstr ( UInt delta, Bool* isEnd )
 //--       break;
 //-- 
    case 0xAA: /* STOS, no REP prefix */
-//--    case 0xAB:
+   case 0xAB:
       dis_string_op( dis_STOS, ( opc == 0xAA ? 1 : sz ), "stos", sorb );
       break;
 //--    
index b02e7db48a0c2c220fb60abe22615d65cb4087c0..e0812f9538192c78e318431c64d9d8f06d8a6f90 100644 (file)
@@ -638,21 +638,23 @@ static HReg iselIntExpr_R_wrk ( ISelEnv* env, IRExpr* e )
       }
 
       switch (e->Iex.Unop.op) {
+         case Iop_8Uto16:
          case Iop_8Uto32:
          case Iop_16Uto32: {
             HReg dst = newVRegI(env);
             HReg src = iselIntExpr_R(env, e->Iex.Unop.arg);
-            UInt mask = e->Iex.Unop.op==Iop_8Uto32 ? 0xFF : 0xFFFF;
+            UInt mask = e->Iex.Unop.op==Iop_16Uto32 ? 0xFFFF : 0xFF;
             addInstr(env, mk_MOVsd_RR(src,dst) );
             addInstr(env, X86Instr_Alu32R(Xalu_AND,
                                           X86RMI_Imm(mask), dst));
             return dst;
          }
+         case Iop_8Sto16:
          case Iop_8Sto32:
          case Iop_16Sto32: {
             HReg dst = newVRegI(env);
             HReg src = iselIntExpr_R(env, e->Iex.Unop.arg);
-            UInt amt = e->Iex.Unop.op==Iop_8Sto32 ? 24 : 16;
+            UInt amt = e->Iex.Unop.op==Iop_16Sto32 ? 16 : 24;
             addInstr(env, mk_MOVsd_RR(src,dst) );
             addInstr(env, X86Instr_Sh32(Xsh_SHL, amt, X86RM_Reg(dst)));
             addInstr(env, X86Instr_Sh32(Xsh_SAR, amt, X86RM_Reg(dst)));
index 3dd9740dfdf7101881932fb7edfd2cab2d3bf0cc..4b4b5838bab2b8b8968f9b36b84deee989f5cedd 100644 (file)
@@ -635,8 +635,13 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 )
       case Iop_1Uto8:   UNARY(Ity_I8,Ity_Bit);
       case Iop_1Uto32:  UNARY(Ity_I32,Ity_Bit);
       case Iop_32to1:   UNARY(Ity_Bit,Ity_I32);
+
       case Iop_8Uto32:  UNARY(Ity_I32,Ity_I8);
       case Iop_8Sto32:  UNARY(Ity_I32,Ity_I8);
+
+      case Iop_8Uto16:  UNARY(Ity_I16,Ity_I8);
+      case Iop_8Sto16:  UNARY(Ity_I16,Ity_I8);
+
       case Iop_16Uto32: UNARY(Ity_I32,Ity_I16);
       case Iop_16Sto32: UNARY(Ity_I32,Ity_I16);
       case Iop_32Sto64: UNARY(Ity_I64,Ity_I32);