]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
fixed oldFlagC usage
authorCerion Armour-Brown <cerion@valgrind.org>
Tue, 14 Dec 2004 12:08:09 +0000 (12:08 +0000)
committerCerion Armour-Brown <cerion@valgrind.org>
Tue, 14 Dec 2004 12:08:09 +0000 (12:08 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@656

VEX/priv/guest-arm/toIR.c

index df766f07c84c8d016d9ddb37bd03d3481fbe45ac..f85c5e09bd5f0488aeae50c14c6784a4121ceb28 100644 (file)
@@ -968,8 +968,6 @@ Bool dis_loadstore_w_ub_address ( UInt theInstr, IRTemp* address )
 
     IRTemp oldFlagC = newTemp(Ity_I32);
 
-    vassert(((theInstr >> 26) & 0x3) == 0x1);
-
     if (Rn_addr == 15) {
        if (P==1 && W==0) { // offset addressing
            // CAB: This right?
@@ -1031,12 +1029,16 @@ Bool dis_loadstore_w_ub_address ( UInt theInstr, IRTemp* address )
 
                // CAB: These right?
 
-               assign(oldFlagC, mk_armg_calculate_flags_c());
+               // X86G_CC_MASK_C ARMG_CC_SHIFT_C
+
+               assign( oldFlagC, binop(Iop_Shr32,
+                                       mk_armg_calculate_flags_c(),
+                                      mkU8(ARMG_CC_SHIFT_C)) );
        
                if (shift_imm == 0) { // RRX (ARM ARM A5-17)
                    // 33 bit ROR using carry flag as the 33rd bit
                    // op = Rm >> 1, carry flag replacing vacated bit position.  
-                   // scaled_index = (c_flag lsl 31) OR (Rm LSR 1)
+                   // scaled_index = (c_flag << 31) | (Rm >> 1)
                    assign( scaled_index, binop(Iop_Or32,
                                        binop(Iop_Shl32, mkexpr(oldFlagC), mkU32(31)),
                                        binop(Iop_Shr32, mkexpr(Rm),  mkU8(1))) );
@@ -1241,9 +1243,9 @@ IRExpr* dis_shift( Bool* decode_ok, UInt theInstr, IRTemp* carry_out )
     IRExpr* expr;
     IROp op;
 
-    assign(oldFlagC, mk_armg_calculate_flags_c());
-    // binop(Iop_Shr32, mkexpr(oldFlagC), mkU32(ARMG_CC_SHIFT_C))
-    // CAB: What to do?
+    assign( oldFlagC, binop(Iop_Shr32,
+                           mk_armg_calculate_flags_c(),
+                           mkU8(ARMG_CC_SHIFT_C)) );
 
     switch (shift_op) {
     case 0x0: case 0x8: case 0x1: op = Iop_Shl32; break;
@@ -1381,12 +1383,12 @@ IRExpr* dis_rotate ( Bool* decode_ok, UInt theInstr, IRTemp* carry_out )
     IRTemp Rm       = newTemp(Ity_I32);
     IRTemp Rs       = newTemp(Ity_I32);
     IRTemp rot_amt  = newTemp(Ity_I8);      // Rs[7:0]
-    IRTemp tmp_8    = newTemp(Ity_I8);
-    IRTemp tmp_32   = newTemp(Ity_I32);
     IRTemp oldFlagC = newTemp(Ity_I32);
     IRExpr* expr=0;
 
-    assign(oldFlagC, mk_armg_calculate_flags_c());
+    assign( oldFlagC, binop(Iop_Shr32,
+                           mk_armg_calculate_flags_c(),
+                           mkU8(ARMG_CC_SHIFT_C)) );
 
     if (by_reg) {  // Register rotate
        vex_printf("rotate: reg\n");
@@ -1407,12 +1409,11 @@ IRExpr* dis_rotate ( Bool* decode_ok, UInt theInstr, IRTemp* carry_out )
 
        // CAB: This right?
        // Rs[7:0] == 0 ? oldFlagC : (Rs[4:0] == 0 ? Rm >> 31 : Rm >> rot-1 )
-       assign( tmp_32, mkexpr(oldFlagC) );
        assign( *carry_out,
                IRExpr_Mux0X(
                    binop(Iop_CmpNE32, mkU32(0),
                          binop(Iop_And32, mkexpr(Rs), mkU32(0xFF))),
-                   mkexpr(tmp_32),
+                   mkexpr(oldFlagC),
                    IRExpr_Mux0X(
                        binop(Iop_CmpEQ8, mkexpr(rot_amt), mkU8(0)),
                        binop(Iop_Shr32, mkexpr(Rm),
@@ -1422,10 +1423,10 @@ IRExpr* dis_rotate ( Bool* decode_ok, UInt theInstr, IRTemp* carry_out )
        
 
        /* expr = (dst0 >> rot_amt) | (dst0 << (wordsize-rot_amt)) */
-       assign( tmp_8, binop(Iop_Sub8, mkU8(32), mkexpr(rot_amt)) );
-       expr = binop( Iop_Or32,
-                     binop( Iop_Shr32, mkexpr(Rm), mkexpr(rot_amt) ),
-                     binop(Iop_Shl32, mkexpr(Rm), mkexpr(tmp_8)) );
+       expr = binop(Iop_Or32,
+                    binop(Iop_Shr32, mkexpr(Rm), mkexpr(rot_amt)),
+                    binop(Iop_Shl32, mkexpr(Rm),
+                          binop(Iop_Sub8, mkU8(32), mkexpr(rot_amt))));
     }
     else {  // Immediate rotate
        vex_printf("rotate: imm\n");
@@ -1447,15 +1448,14 @@ IRExpr* dis_rotate ( Bool* decode_ok, UInt theInstr, IRTemp* carry_out )
            // op = Rm >> 1, carry flag replacing vacated bit position.  
 
            // CAB: This right?
-           assign( tmp_32, mkexpr(oldFlagC) );
            expr = binop(Iop_Or32,
-                        binop( Iop_Shl32, mkexpr(tmp_32), mkU8(31) ),
-                        binop( Iop_Shr32, mkexpr(Rm), mkU8(1) ) );
+                        binop(Iop_Shl32, mkexpr(oldFlagC), mkU8(31)),
+                        binop(Iop_Shr32, mkexpr(Rm), mkU8(1)));
        } else {
-           assign( tmp_8, binop(Iop_Sub8, mkU8(32), mkU8(rot_imm)) );
            expr = binop(Iop_Or32,
-                        binop( Iop_Shr32, mkexpr(Rm), mkU8(rot_imm) ),
-                        binop( Iop_Shl32, mkexpr(Rm), mkexpr(tmp_8) ) );
+                        binop(Iop_Shr32, mkexpr(Rm), mkU8(rot_imm)),
+                        binop(Iop_Shl32, mkexpr(Rm),
+                              binop(Iop_Sub8, mkU8(32), mkU8(rot_imm))));
        }
     }
     return expr;
@@ -1496,8 +1496,9 @@ IRExpr* dis_shifter_op ( Bool *decode_ok, UInt theInstr, IRTemp* carry_out)
        vex_printf("imm: %,b\n", imm);
 
        if (rot_imm == 0) {
-           assign(oldFlagC, mk_armg_calculate_flags_c());
-
+           assign( oldFlagC, binop(Iop_Shr32,
+                                   mk_armg_calculate_flags_c(),
+                                   mkU8(ARMG_CC_SHIFT_C)) );
            assign( *carry_out, mkexpr(oldFlagC) );
        } else {
            assign( *carry_out, binop(Iop_Shr32, mkU32(imm), mkU8(31)) );