]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
x86 -> IR changes:
authorJulian Seward <jseward@acm.org>
Fri, 10 Sep 2004 20:25:11 +0000 (20:25 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 10 Sep 2004 20:25:11 +0000 (20:25 +0000)
* fix bug in movsbl/swl/sbw causing zero extension
* more ADC cases
* FIDIVR m32

git-svn-id: svn://svn.valgrind.org/vex/trunk@253

VEX/priv/guest-x86/toIR.c

index c640e70c8ec09a8f4bd82b5ca88e09ae24cc9550..fda5c61fceed1fb90d411b644aedd0780f7b8900 100644 (file)
@@ -1703,7 +1703,6 @@ UInt dis_op2_E_G ( UChar       sorb,
       assign( src,  loadLE(szToITy(size), mkexpr(addr)) );
 
       if (addSubCarry && op8 == Iop_Add8) {
-         vassert(0);
          helper_ADC( size, dst1, dst0, src );
          putIReg(size, gregOfRM(rm), mkexpr(dst1));
       } else
@@ -1968,7 +1967,7 @@ UInt dis_movx_E_G ( UChar       sorb,
    UChar rm = getIByte(delta);
    if (epartIsReg(rm)) {
       putIReg(szd, gregOfRM(rm),
-                  unop(mkWidenOp(szs,szd,False), 
+                  unop(mkWidenOp(szs,szd,sign_extend), 
                        getIReg(szs,eregOfRM(rm))));
       DIP("mov%c%c%c %s,%s\n", sign_extend ? 's' : 'z',
                                nameISize(szs), nameISize(szd),
@@ -1984,7 +1983,7 @@ UInt dis_movx_E_G ( UChar       sorb,
       IRTemp addr = disAMode ( &len, sorb, delta, dis_buf );
 
       putIReg(szd, gregOfRM(rm),
-                  unop(mkWidenOp(szs,szd,False), 
+                  unop(mkWidenOp(szs,szd,sign_extend), 
                         loadLE(szToITy(szs),mkexpr(addr))));
       DIP("mov%c%c%c %s,%s\n", sign_extend ? 's' : 'z',
                                nameISize(szs), nameISize(szd),
@@ -3632,6 +3631,11 @@ UInt dis_FPU ( Bool* decode_ok, UChar sorb, UInt delta )
               fop = Iop_DivF64;
               goto do_fop_m32;
 
+            case 7: /* FIDIVR m32int */ /* ST(0) = m32int / ST(0) */
+               DIP("fisubrl %s", dis_buf);
+              fop = Iop_DivF64;
+              goto do_foprev_m32;
+
             do_fop_m32:
                put_ST_UNCHECKED(0, 
                   binop(fop, 
@@ -3640,6 +3644,14 @@ UInt dis_FPU ( Bool* decode_ok, UChar sorb, UInt delta )
                              loadLE(Ity_I32, mkexpr(addr)))));
                break;
 
+            do_foprev_m32:
+               put_ST_UNCHECKED(0, 
+                  binop(fop, 
+                        unop(Iop_I32toF64,
+                             loadLE(Ity_I32, mkexpr(addr))),
+                        get_ST(0)));
+               break;
+
             default:
                vex_printf("unhandled opc_aux = 0x%2x\n", gregOfRM(modrm));
                vex_printf("first_opcode == 0xDA\n");
@@ -7562,10 +7574,10 @@ static UInt disInstr ( UInt delta, Bool* isEnd )
 //--    case 0x12: /* ADC Eb,Gb */
 //--       delta = dis_op2_E_G ( sorb, True, ADC, True, 1, delta, "adc" );
 //--       break;
-//--    case 0x13: /* ADC Ev,Gv */
-//--       delta = dis_op2_E_G ( sorb, True, ADC, True, sz, delta, "adc" );
-//--       break;
-//-- 
+   case 0x13: /* ADC Ev,Gv */
+      delta = dis_op2_E_G ( sorb, True, Iop_Add8, True, sz, delta, "adc" );
+      break;
+
 //--    case 0x1A: /* SBB Eb,Gb */
 //--       delta = dis_op2_E_G ( sorb, True, SBB, True, 1, delta, "sbb" );
 //--       break;