CVS commit by nethercote:
Made code more concise. In particular:
- introduced DIS() and DIP() macros to shorten debug printing
- introduce jmp_lit(), jcc_lit(), jmp_treg() for common UCode sequences
- replace many unnecessary dis?dis_buf:NULL tests with dis_buf, by
changing the tests in disAMode()
Overall, reduced code size by about 230 lines.
M +505 -744 vg_to_ucode.c 1.127
--- valgrind/coregrind/vg_to_ucode.c #1.126:1.127
@@ -34,9 +34,14 @@
/*------------------------------------------------------------*/
-/*--- Renamings of frequently-used global functions. ---*/
+/*--- Debugging output ---*/
/*------------------------------------------------------------*/
-#define dis VG_(print_codegen)
+#define DIP(format, args...) \
+ if (VG_(print_codegen)) \
+ VG_(printf)(format, ## args)
+#define DIS(buf, format, args...) \
+ if (VG_(print_codegen)) \
+ VG_(sprintf)(buf, format, ## args)
/*------------------------------------------------------------*/
@@ -389,4 +393,32 @@ void VG_(set_cond_field) ( UCodeBlock* c
}
+/*------------------------------------------------------------*/
+/*--- JMP helpers ---*/
+/*------------------------------------------------------------*/
+
+static __inline__
+void jmp_lit( UCodeBlock* cb, Addr d32 )
+{
+ uInstr1 (cb, JMP, 0, Literal, 0);
+ uLiteral(cb, d32);
+ uCond (cb, CondAlways);
+}
+
+static __inline__
+void jmp_treg( UCodeBlock* cb, Int t )
+{
+ uInstr1 (cb, JMP, 0, TempReg, t);
+ uCond (cb, CondAlways);
+}
+
+static __inline__
+void jcc_lit( UCodeBlock* cb, Addr d32, Condcode cond )
+{
+ uInstr1 (cb, JMP, 0, Literal, 0);
+ uLiteral (cb, d32);
+ uCond (cb, cond);
+ uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
+}
+
/*------------------------------------------------------------*/
@@ -443,6 +475,6 @@ void handleSegOverride ( UCodeBlock* cb,
returned, as a pair (length << 24) | temp. Note that this fn should
not be called if the R/M part of the address denotes a register
- instead of memory. If buf is non-NULL, text of the addressing mode
- is placed therein. */
+ instead of memory. If VG_(print_codegen) is true, text of the addressing
+ mode is placed therein. */
static
@@ -469,6 +501,5 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr2(cb, GET, 4, ArchReg, rm, TempReg, tmp);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s(%s)", sorbTxt(sorb),
- nameIReg(4,rm));
+ DIS(buf, "%s(%s)", sorbTxt(sorb), nameIReg(4,rm));
return (1<<24 | tmp);
}
@@ -484,8 +515,7 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr2(cb, GET, 4, ArchReg, rm, TempReg, tmq);
uInstr2(cb, LEA1, 4, TempReg, tmq, TempReg, tmp);
- LAST_UINSTR(cb).lit32 = d;
+ uLiteral(cb, d);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s%d(%s)", sorbTxt(sorb),
- d, nameIReg(4,rm));
+ DIS(buf, "%s%d(%s)", sorbTxt(sorb), d, nameIReg(4,rm));
return (2<<24 | tmp);
}
@@ -501,8 +531,7 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr2(cb, GET, 4, ArchReg, rm, TempReg, tmq);
uInstr2(cb, LEA1, 4, TempReg, tmq, TempReg, tmp);
- LAST_UINSTR(cb).lit32 = d;
+ uLiteral(cb, d);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s0x%x(%s)", sorbTxt(sorb),
- d, nameIReg(4,rm));
+ DIS(buf, "%s0x%x(%s)", sorbTxt(sorb), d, nameIReg(4,rm));
return (5<<24 | tmp);
}
@@ -521,5 +550,5 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uLiteral(cb, d);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s(0x%x)", sorbTxt(sorb), d);
+ DIS(buf, "%s(0x%x)", sorbTxt(sorb), d);
return (5<<24 | tmp);
}
@@ -557,10 +586,9 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr3(cb, LEA2, 4, TempReg, base_tmp, TempReg, index_tmp,
TempReg, tmp);
- LAST_UINSTR(cb).lit32 = 0;
+ uLiteral(cb, 0);
LAST_UINSTR(cb).extra4b = 1 << scale;
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s(%s,%s,%d)", sorbTxt(sorb),
- nameIReg(4,base_r),
- nameIReg(4,index_r),1<<scale);
+ DIS(buf, "%s(%s,%s,%d)", sorbTxt(sorb),
+ nameIReg(4,base_r), nameIReg(4,index_r), 1<<scale);
return (2<<24 | tmp);
}
@@ -574,9 +602,9 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr3(cb, LEA2, 4, TempReg, tmp, TempReg, index_tmp,
TempReg, tmp);
- LAST_UINSTR(cb).lit32 = d;
+ uLiteral(cb, d);
LAST_UINSTR(cb).extra4b = 1 << scale;
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s0x%x(,%s,%d)", sorbTxt(sorb), d,
- nameIReg(4,index_r),1<<scale);
+ DIS(buf, "%s0x%x(,%s,%d)", sorbTxt(sorb), d,
+ nameIReg(4,index_r), 1<<scale);
return (6<<24 | tmp);
}
@@ -585,6 +613,5 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr2(cb, GET, 4, ArchReg, base_r, TempReg, tmp);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s(%s,,)",
- sorbTxt(sorb), nameIReg(4,base_r));
+ DIS(buf, "%s(%s,,)", sorbTxt(sorb), nameIReg(4,base_r));
return (2<<24 | tmp);
}
@@ -595,5 +622,5 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uLiteral(cb, d);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s0x%x()", sorbTxt(sorb), d);
+ DIS(buf, "%s0x%x()", sorbTxt(sorb), d);
return (6<<24 | tmp);
}
@@ -622,8 +649,7 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr2(cb, GET, 4, ArchReg, base_r, TempReg, tmq);
uInstr2(cb, LEA1, 4, TempReg, tmq, TempReg, tmp);
- LAST_UINSTR(cb).lit32 = d;
+ uLiteral(cb, d);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s%d(%s,,)", sorbTxt(sorb),
- d, nameIReg(4,base_r));
+ DIS(buf, "%s%d(%s,,)", sorbTxt(sorb), d, nameIReg(4,base_r));
return (3<<24 | tmp);
} else {
@@ -634,10 +660,9 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr3(cb, LEA2, 4, TempReg, base_tmp, TempReg, index_tmp,
TempReg, tmp);
- LAST_UINSTR(cb).lit32 = d;
+ uLiteral(cb, d);
LAST_UINSTR(cb).extra4b = 1 << scale;
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s%d(%s,%s,%d)",
- sorbTxt(sorb), d, nameIReg(4,base_r),
- nameIReg(4,index_r), 1<<scale);
+ DIS(buf, "%s%d(%s,%s,%d)", sorbTxt(sorb), d,
+ nameIReg(4,base_r), nameIReg(4,index_r), 1<<scale);
return (3<<24 | tmp);
}
@@ -665,8 +690,7 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr2(cb, GET, 4, ArchReg, base_r, TempReg, tmq);
uInstr2(cb, LEA1, 4, TempReg, tmq, TempReg, tmp);
- LAST_UINSTR(cb).lit32 = d;
+ uLiteral(cb, d);
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s%d(%s,,)",
- sorbTxt(sorb), d, nameIReg(4,base_r));
+ DIS(buf, "%s%d(%s,,)", sorbTxt(sorb), d, nameIReg(4,base_r));
return (6<<24 | tmp);
} else {
@@ -677,10 +701,9 @@ UInt disAMode ( UCodeBlock* cb, UChar so
uInstr3(cb, LEA2, 4, TempReg, base_tmp, TempReg, index_tmp,
TempReg, tmp);
- LAST_UINSTR(cb).lit32 = d;
+ uLiteral(cb, d);
LAST_UINSTR(cb).extra4b = 1 << scale;
handleSegOverride(cb, sorb, tmp);
- if (buf) VG_(sprintf)(buf,"%s%d(%s,%s,%d)",
- sorbTxt(sorb), d, nameIReg(4,base_r),
- nameIReg(4,index_r), 1<<scale);
+ DIS(buf, "%s%d(%s,%s,%d)", sorbTxt(sorb), d,
+ nameIReg(4,base_r), nameIReg(4,index_r), 1<<scale);
return (6<<24 | tmp);
}
@@ -783,6 +806,5 @@ void codegen_XOR_reg_with_itself ( UCode
Int ge_reg, Int tmp )
{
- if (dis)
- VG_(printf)("xor%c %s, %s\n", nameISize(size),
+ DIP("xor%c %s, %s\n", nameISize(size),
nameIReg(size,ge_reg), nameIReg(size,ge_reg) );
uInstr2(cb, MOV, size, Literal, 0, TempReg, tmp);
@@ -857,5 +879,5 @@ Addr dis_op2_E_G ( UCodeBlock* cb,
if (keep)
uInstr2(cb, PUT, size, TempReg, tmp, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("%s%c %s,%s\n", t_x86opc, nameISize(size),
+ DIP("%s%c %s,%s\n", t_x86opc, nameISize(size),
nameIReg(size,eregOfRM(rm)),
nameIReg(size,gregOfRM(rm)));
@@ -868,5 +890,5 @@ Addr dis_op2_E_G ( UCodeBlock* cb,
? True : False;
if (reversible) {
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf);
Int tmpa = LOW24(pair);
uInstr2(cb, LOAD, size, TempReg, tmpa, TempReg, tmpa);
@@ -883,9 +905,9 @@ Addr dis_op2_E_G ( UCodeBlock* cb,
if (keep)
uInstr2(cb, PUT, size, TempReg, tmpa, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("%s%c %s,%s\n", t_x86opc, nameISize(size),
+ DIP("%s%c %s,%s\n", t_x86opc, nameISize(size),
dis_buf,nameIReg(size,gregOfRM(rm)));
return HI8(pair)+eip0;
} else {
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf);
Int tmpa = LOW24(pair);
Int tmp2 = newTemp(cb);
@@ -896,5 +918,5 @@ Addr dis_op2_E_G ( UCodeBlock* cb,
if (keep)
uInstr2(cb, PUT, size, TempReg, tmp2, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("%s%c %s,%s\n", t_x86opc, nameISize(size),
+ DIP("%s%c %s,%s\n", t_x86opc, nameISize(size),
dis_buf,nameIReg(size,gregOfRM(rm)));
return HI8(pair)+eip0;
@@ -960,5 +982,5 @@ Addr dis_op2_G_E ( UCodeBlock* cb,
if (keep)
uInstr2(cb, PUT, size, TempReg, tmp, ArchReg, eregOfRM(rm));
- if (dis) VG_(printf)("%s%c %s,%s\n", t_x86opc, nameISize(size),
+ DIP("%s%c %s,%s\n", t_x86opc, nameISize(size),
nameIReg(size,gregOfRM(rm)),
nameIReg(size,eregOfRM(rm)));
@@ -968,5 +990,5 @@ Addr dis_op2_G_E ( UCodeBlock* cb,
/* E refers to memory */
{
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf);
Int tmpa = LOW24(pair);
Int tmpv = newTemp(cb);
@@ -985,5 +1007,5 @@ Addr dis_op2_G_E ( UCodeBlock* cb,
uInstr2(cb, STORE, size, TempReg, tmpv, TempReg, tmpa);
}
- if (dis) VG_(printf)("%s%c %s,%s\n", t_x86opc, nameISize(size),
+ DIP("%s%c %s,%s\n", t_x86opc, nameISize(size),
nameIReg(size,gregOfRM(rm)), dis_buf);
return HI8(pair)+eip0;
@@ -1021,5 +1043,5 @@ Addr dis_mov_E_G ( UCodeBlock* cb,
uInstr2(cb, GET, size, ArchReg, eregOfRM(rm), TempReg, tmpv);
uInstr2(cb, PUT, size, TempReg, tmpv, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("mov%c %s,%s\n", nameISize(size),
+ DIP("mov%c %s,%s\n", nameISize(size),
nameIReg(size,eregOfRM(rm)),
nameIReg(size,gregOfRM(rm)));
@@ -1029,10 +1051,10 @@ Addr dis_mov_E_G ( UCodeBlock* cb,
/* E refers to memory */
{
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf);
Int tmpa = LOW24(pair);
Int tmpb = newTemp(cb);
uInstr2(cb, LOAD, size, TempReg, tmpa, TempReg, tmpb);
uInstr2(cb, PUT, size, TempReg, tmpb, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("mov%c %s,%s\n", nameISize(size),
+ DIP("mov%c %s,%s\n", nameISize(size),
dis_buf,nameIReg(size,gregOfRM(rm)));
return HI8(pair)+eip0;
@@ -1070,5 +1092,5 @@ Addr dis_mov_G_E ( UCodeBlock* cb,
uInstr2(cb, GET, size, ArchReg, gregOfRM(rm), TempReg, tmpv);
uInstr2(cb, PUT, size, TempReg, tmpv, ArchReg, eregOfRM(rm));
- if (dis) VG_(printf)("mov%c %s,%s\n", nameISize(size),
+ DIP("mov%c %s,%s\n", nameISize(size),
nameIReg(size,gregOfRM(rm)),
nameIReg(size,eregOfRM(rm)));
@@ -1078,10 +1100,10 @@ Addr dis_mov_G_E ( UCodeBlock* cb,
/* E refers to memory */
{
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf);
Int tmpa = LOW24(pair);
Int tmpv = newTemp(cb);
uInstr2(cb, GET, size, ArchReg, gregOfRM(rm), TempReg, tmpv);
uInstr2(cb, STORE, size, TempReg, tmpv, TempReg, tmpa);
- if (dis) VG_(printf)("mov%c %s,%s\n", nameISize(size),
+ DIP("mov%c %s,%s\n", nameISize(size),
nameIReg(size,gregOfRM(rm)), dis_buf);
return HI8(pair)+eip0;
@@ -1115,5 +1137,5 @@ Addr dis_op_imm_A ( UCodeBlock* cb,
if (keep)
uInstr2(cb, PUT, size, TempReg, tmp, ArchReg, R_EAX);
- if (dis) VG_(printf)("%s%c $0x%x, %s\n", t_x86opc, nameISize(size),
+ DIP("%s%c $0x%x, %s\n", t_x86opc, nameISize(size),
lit, nameIReg(size,R_EAX));
return eip+size;
@@ -1136,6 +1158,5 @@ Addr dis_movx_E_G ( UCodeBlock* cb,
LAST_UINSTR(cb).signed_widen = sign_extend;
uInstr2(cb, PUT, szd, TempReg, tmpv, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("mov%c%c%c %s,%s\n",
- sign_extend ? 's' : 'z',
+ DIP("mov%c%c%c %s,%s\n", sign_extend ? 's' : 'z',
nameISize(szs), nameISize(szd),
nameIReg(szs,eregOfRM(rm)),
@@ -1146,5 +1167,5 @@ Addr dis_movx_E_G ( UCodeBlock* cb,
/* E refers to memory */
{
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf);
Int tmpa = LOW24(pair);
uInstr2(cb, LOAD, szs, TempReg, tmpa, TempReg, tmpa);
@@ -1153,9 +1174,7 @@ Addr dis_movx_E_G ( UCodeBlock* cb,
LAST_UINSTR(cb).signed_widen = sign_extend;
uInstr2(cb, PUT, szd, TempReg, tmpa, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("mov%c%c%c %s,%s\n",
- sign_extend ? 's' : 'z',
+ DIP("mov%c%c%c %s,%s\n", sign_extend ? 's' : 'z',
nameISize(szs), nameISize(szd),
- dis_buf,
- nameIReg(szd,gregOfRM(rm)));
+ dis_buf, nameIReg(szd,gregOfRM(rm)));
return HI8(pair)+eip;
}
@@ -1251,10 +1270,8 @@ Addr dis_Grp1 ( UCodeBlock* cb,
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, eregOfRM(modrm));
eip += (am_sz + d_sz);
- if (dis)
- VG_(printf)("%s%c $0x%x, %s\n",
- nameGrp1(gregOfRM(modrm)), nameISize(sz), d32,
+ DIP("%s%c $0x%x, %s\n", nameGrp1(gregOfRM(modrm)), nameISize(sz), d32,
nameIReg(sz,eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL);
+ pair = disAMode ( cb, sorb, eip, dis_buf);
t1 = LOW24(pair);
t2 = newTemp(cb);
@@ -1283,8 +1300,6 @@ Addr dis_Grp1 ( UCodeBlock* cb,
uInstr2(cb, STORE, sz, TempReg, t2, TempReg, t1);
}
- if (dis)
- VG_(printf)("%s%c $0x%x, %s\n",
- nameGrp1(gregOfRM(modrm)), nameISize(sz), d32,
- dis_buf);
+ DIP("%s%c $0x%x, %s\n", nameGrp1(gregOfRM(modrm)), nameISize(sz),
+ d32, dis_buf);
}
return eip;
@@ -1338,5 +1353,5 @@ Addr dis_Grp2 ( UCodeBlock* cb,
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, eregOfRM(modrm));
eip += (am_sz + d_sz);
- if (dis) {
+ if (VG_(print_codegen)) {
if (orig_src_tag == Literal)
VG_(printf)("%s%c $0x%x, %s\n",
@@ -1350,5 +1365,5 @@ Addr dis_Grp2 ( UCodeBlock* cb,
}
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL);
+ pair = disAMode ( cb, sorb, eip, dis_buf);
t1 = LOW24(pair);
t2 = newTemp(cb);
@@ -1371,5 +1386,5 @@ Addr dis_Grp2 ( UCodeBlock* cb,
setFlagsFromUOpcode(cb, uopc);
uInstr2(cb, STORE, sz, TempReg, t2, TempReg, t1);
- if (dis) {
+ if (VG_(print_codegen)) {
if (orig_src_tag == Literal)
VG_(printf)("%s%c $0x%x, %s\n",
@@ -1424,5 +1439,5 @@ Addr dis_Grp8_BT ( UCodeBlock* cb,
Int t1, t2, t_fetched, t_mask;
UInt pair;
- UChar dis_buf[50];
+ Char dis_buf[50];
UInt v_mask;
@@ -1473,11 +1488,8 @@ Addr dis_Grp8_BT ( UCodeBlock* cb,
eip += (am_sz + 1);
- if (dis)
- VG_(printf)("%s%c $0x%x, %s\n",
- nameGrp8(gregOfRM(modrm)), nameISize(sz),
- src_val,
- nameIReg(sz,eregOfRM(modrm)));
+ DIP("%s%c $0x%x, %s\n", nameGrp8(gregOfRM(modrm)), nameISize(sz),
+ src_val, nameIReg(sz,eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL);
+ pair = disAMode ( cb, sorb, eip, dis_buf);
t1 = LOW24(pair);
t2 = newTemp(cb);
@@ -1493,8 +1505,6 @@ Addr dis_Grp8_BT ( UCodeBlock* cb,
uInstr2(cb, STORE, sz, TempReg, t2, TempReg, t1);
}
- if (dis)
- VG_(printf)("%s%c $0x%x, %s\n",
- nameGrp8(gregOfRM(modrm)), nameISize(sz), src_val,
- dis_buf);
+ DIP("%s%c $0x%x, %s\n", nameGrp8(gregOfRM(modrm)), nameISize(sz),
+ src_val, dis_buf);
}
return eip;
@@ -1540,5 +1550,5 @@ static void codegen_mul_A_D_Reg ( UCodeB
}
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("%s%c %s\n", signed_multiply ? "imul" : "mul",
+ DIP("%s%c %s\n", signed_multiply ? "imul" : "mul",
nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
@@ -1579,5 +1589,5 @@ static void codegen_mul_A_D_Temp ( UCode
}
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("%s%c %s\n", signed_multiply ? "imul" : "mul",
+ DIP("%s%c %s\n", signed_multiply ? "imul" : "mul",
nameISize(sz), dis_buf);
}
@@ -1607,6 +1617,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
uInstr2(cb, AND, sz, TempReg, tao, TempReg, t1);
setFlagsFromUOpcode(cb, AND);
- if (dis)
- VG_(printf)("test%c $0x%x, %s\n",
+ DIP("test%c $0x%x, %s\n",
nameISize(sz), d32, nameIReg(sz, eregOfRM(modrm)));
break;
@@ -1618,7 +1627,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
setFlagsFromUOpcode(cb, NOT);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, eregOfRM(modrm));
- if (dis)
- VG_(printf)("not%c %s\n",
- nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
+ DIP("not%c %s\n", nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
break;
case 3: /* NEG */
@@ -1628,7 +1635,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
setFlagsFromUOpcode(cb, NEG);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, eregOfRM(modrm));
- if (dis)
- VG_(printf)("neg%c %s\n",
- nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
+ DIP("neg%c %s\n", nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
break;
case 4: /* MUL */
@@ -1644,7 +1649,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
uInstr2(cb, GET, sz, ArchReg, eregOfRM(modrm), TempReg, t1);
codegen_div ( cb, sz, t1, False );
- if (dis)
- VG_(printf)("div%c %s\n", nameISize(sz),
- nameIReg(sz, eregOfRM(modrm)));
+ DIP("div%c %s\n", nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
break;
case 7: /* IDIV */
@@ -1652,7 +1655,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
uInstr2(cb, GET, sz, ArchReg, eregOfRM(modrm), TempReg, t1);
codegen_div ( cb, sz, t1, True );
- if (dis)
- VG_(printf)("idiv%c %s\n", nameISize(sz),
- nameIReg(sz, eregOfRM(modrm)));
+ DIP("idiv%c %s\n", nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
break;
default:
@@ -1662,5 +1663,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
}
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t2 = LOW24(pair);
t1 = newTemp(cb);
@@ -1675,7 +1676,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
uInstr2(cb, AND, sz, TempReg, tao, TempReg, t1);
setFlagsFromUOpcode(cb, AND);
- if (dis)
- VG_(printf)("test%c $0x%x, %s\n",
- nameISize(sz), d32, dis_buf);
+ DIP("test%c $0x%x, %s\n", nameISize(sz), d32, dis_buf);
break;
}
@@ -1684,6 +1683,5 @@ Addr dis_Grp3 ( UCodeBlock* cb,
setFlagsFromUOpcode(cb, NOT);
uInstr2(cb, STORE, sz, TempReg, t1, TempReg, t2);
- if (dis)
- VG_(printf)("not%c %s\n", nameISize(sz), dis_buf);
+ DIP("not%c %s\n", nameISize(sz), dis_buf);
break;
case 3: /* NEG */
@@ -1691,23 +1689,20 @@ Addr dis_Grp3 ( UCodeBlock* cb,
setFlagsFromUOpcode(cb, NEG);
uInstr2(cb, STORE, sz, TempReg, t1, TempReg, t2);
- if (dis)
- VG_(printf)("neg%c %s\n", nameISize(sz), dis_buf);
+ DIP("neg%c %s\n", nameISize(sz), dis_buf);
break;
case 4: /* MUL */
codegen_mul_A_D_Temp ( cb, sz, t1, False,
- dis?dis_buf:NULL );
+ dis_buf );
break;
case 5: /* IMUL */
- codegen_mul_A_D_Temp ( cb, sz, t1, True, dis?dis_buf:NULL );
+ codegen_mul_A_D_Temp ( cb, sz, t1, True, dis_buf );
break;
case 6: /* DIV */
codegen_div ( cb, sz, t1, False );
- if (dis)
- VG_(printf)("div%c %s\n", nameISize(sz), dis_buf);
+ DIP("div%c %s\n", nameISize(sz), dis_buf);
break;
case 7: /* IDIV */
codegen_div ( cb, sz, t1, True );
- if (dis)
- VG_(printf)("idiv%c %s\n", nameISize(sz), dis_buf);
+ DIP("idiv%c %s\n", nameISize(sz), dis_buf);
break;
default:
@@ -1754,9 +1749,8 @@ Addr dis_Grp4 ( UCodeBlock* cb,
}
eip++;
- if (dis)
- VG_(printf)("%sb %s\n", nameGrp4(gregOfRM(modrm)),
+ DIP("%sb %s\n", nameGrp4(gregOfRM(modrm)),
nameIReg(1, eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t2 = LOW24(pair);
t1 = newTemp(cb);
@@ -1779,6 +1773,5 @@ Addr dis_Grp4 ( UCodeBlock* cb,
}
eip += HI8(pair);
- if (dis)
- VG_(printf)("%sb %s\n", nameGrp4(gregOfRM(modrm)), dis_buf);
+ DIP("%sb %s\n", nameGrp4(gregOfRM(modrm)), dis_buf);
}
return eip;
@@ -1822,12 +1815,10 @@ Addr dis_Grp5 ( UCodeBlock* cb,
uLiteral(cb, eip+1);
uInstr2(cb, STORE, 4, TempReg, t4, TempReg, t3);
- uInstr1(cb, JMP, 0, TempReg, t1);
- uCond(cb, CondAlways);
+ jmp_treg(cb, t1);
LAST_UINSTR(cb).jmpkind = JmpCall;
*isEnd = True;
break;
case 4: /* jmp Ev */
- uInstr1(cb, JMP, 0, TempReg, t1);
- uCond(cb, CondAlways);
+ jmp_treg(cb, t1);
*isEnd = True;
break;
@@ -1838,9 +1829,8 @@ Addr dis_Grp5 ( UCodeBlock* cb,
}
eip++;
- if (dis)
- VG_(printf)("%s%c %s\n", nameGrp5(gregOfRM(modrm)),
+ DIP("%s%c %s\n", nameGrp5(gregOfRM(modrm)),
nameISize(sz), nameIReg(sz, eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t2 = LOW24(pair);
t1 = newTemp(cb);
@@ -1866,12 +1856,10 @@ Addr dis_Grp5 ( UCodeBlock* cb,
uLiteral(cb, eip+HI8(pair));
uInstr2(cb, STORE, 4, TempReg, t4, TempReg, t3);
- uInstr1(cb, JMP, 0, TempReg, t1);
- uCond(cb, CondAlways);
+ jmp_treg(cb, t1);
LAST_UINSTR(cb).jmpkind = JmpCall;
*isEnd = True;
break;
case 4: /* JMP Ev */
- uInstr1(cb, JMP, 0, TempReg, t1);
- uCond(cb, CondAlways);
+ jmp_treg(cb, t1);
*isEnd = True;
break;
@@ -1890,6 +1878,5 @@ Addr dis_Grp5 ( UCodeBlock* cb,
}
eip += HI8(pair);
- if (dis)
- VG_(printf)("%s%c %s\n", nameGrp5(gregOfRM(modrm)),
+ DIP("%s%c %s\n", nameGrp5(gregOfRM(modrm)),
nameISize(sz), dis_buf);
}
@@ -1897,12 +1884,4 @@ Addr dis_Grp5 ( UCodeBlock* cb,
}
-static __inline__
-void dis_JMP_d32( UCodeBlock* cb, Addr d32 )
-{
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, d32);
- uCond(cb, CondAlways);
-}
-
/*------------------------------------------------------------*/
/*--- Disassembling string ops (including REP prefixes) ---*/
@@ -1938,5 +1917,5 @@ void dis_string_op( UCodeBlock* cb, void
dis_string_op_increment(cb, sz, t_inc);
dis_OP( cb, sz, t_inc );
- if (dis) VG_(printf)("%s%c\n", name, nameISize(sz));
+ DIP("%s%c\n", name, nameISize(sz));
}
@@ -2055,14 +2034,10 @@ void dis_REP_op ( UCodeBlock* cb, Int co
if (cond == CondAlways) {
- dis_JMP_d32 (cb, eip);
+ jmp_lit(cb, eip);
} else {
- uInstr1 (cb, JMP, 0, Literal, 0);
- uLiteral (cb, eip);
- uCond (cb, cond);
- uFlagsRWU (cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
-
- dis_JMP_d32 (cb, eip_next);
+ jcc_lit(cb, eip, cond);
+ jmp_lit(cb, eip_next);
}
- if (dis) VG_(printf)("%s%c\n", name, nameISize(sz));
+ DIP("%s%c\n", name, nameISize(sz));
}
@@ -2092,6 +2067,5 @@ Addr dis_mul_E_G ( UCodeBlock* cb,
setFlagsFromUOpcode(cb, MUL);
uInstr2(cb, PUT, size, TempReg, tg, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("%smul%c %s, %s\n",
- signed_multiply ? "i" : "",
+ DIP("%smul%c %s, %s\n", signed_multiply ? "i" : "",
nameISize(size),
nameIReg(size,eregOfRM(rm)),
@@ -2101,5 +2075,5 @@ Addr dis_mul_E_G ( UCodeBlock* cb,
UInt pair;
vg_assert(signed_multiply);
- pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ pair = disAMode ( cb, sorb, eip0, dis_buf );
ta = LOW24(pair);
uInstr2(cb, LOAD, size, TempReg, ta, TempReg, te);
@@ -2109,8 +2083,7 @@ Addr dis_mul_E_G ( UCodeBlock* cb,
uInstr2(cb, PUT, size, TempReg, tg, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("%smul%c %s, %s\n",
- signed_multiply ? "i" : "",
+ DIP("%smul%c %s, %s\n", signed_multiply ? "i" : "",
nameISize(size),
- dis_buf,nameIReg(size,gregOfRM(rm)));
+ dis_buf, nameIReg(size,gregOfRM(rm)));
return HI8(pair)+eip0;
}
@@ -2127,5 +2100,5 @@ Addr dis_imul_I_E_G ( UCodeBlock* cb,
{
Int ta, te, tl, d32;
- UChar dis_buf[50];
+ Char dis_buf[50];
UChar rm = getUChar(eip);
ta = INVALID_TEMPREG;
@@ -2137,5 +2110,5 @@ Addr dis_imul_I_E_G ( UCodeBlock* cb,
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
ta = LOW24(pair);
uInstr2(cb, LOAD, size, TempReg, ta, TempReg, te);
@@ -2152,13 +2125,7 @@ Addr dis_imul_I_E_G ( UCodeBlock* cb,
uInstr2(cb, PUT, size, TempReg, te, ArchReg, gregOfRM(rm));
- if (dis) {
- if (epartIsReg(rm)) {
- VG_(printf)("imul %d, %s, %s\n", d32, nameIReg(size,eregOfRM(rm)),
- nameIReg(size,gregOfRM(rm)));
- } else {
- VG_(printf)("imul %d, %s, %s\n", d32, dis_buf,
- nameIReg(size,gregOfRM(rm)));
- }
- }
+ DIP("imul %d, %s, %s\n", d32,
+ ( epartIsReg(rm) ? nameIReg(size,eregOfRM(rm)) : dis_buf ),
+ nameIReg(size,gregOfRM(rm)) );
return eip;
@@ -2180,5 +2147,5 @@ Addr dis_fpu_mem ( UCodeBlock* cb,
vg_assert(second_byte < 0xC0);
second_byte &= 0x38;
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
ta = LOW24(pair);
eip += HI8(pair);
@@ -2187,14 +2154,10 @@ Addr dis_fpu_mem ( UCodeBlock* cb,
(((UShort)first_byte) << 8) | ((UShort)second_byte),
TempReg, ta);
- if (dis) {
- if (is_write)
- VG_(printf)("fpu_w_%d 0x%x:0x%x, %s\n",
- size, (UInt)first_byte,
- (UInt)second_byte, dis_buf );
- else
- VG_(printf)("fpu_r_%d %s, 0x%x:0x%x\n",
- size, dis_buf,
- (UInt)first_byte,
- (UInt)second_byte );
+ if (is_write) {
+ DIP("fpu_w_%d 0x%x:0x%x, %s\n",
+ size, (UInt)first_byte, (UInt)second_byte, dis_buf );
+ } else {
+ DIP("fpu_r_%d %s, 0x%x:0x%x\n",
+ size, dis_buf, (UInt)first_byte, (UInt)second_byte );
}
return eip;
@@ -2265,6 +2228,5 @@ Addr dis_fpu_no_mem ( UCodeBlock* cb, Ad
}
- if (dis) VG_(printf)("fpu 0x%x:0x%x%s%s\n",
- (UInt)first_byte, (UInt)second_byte,
+ DIP("fpu 0x%x:0x%x%s%s\n", (UInt)first_byte, (UInt)second_byte,
uses_ZCP ? " -rZCP" : "",
sets_ZCP ? " -wZCP" : "" );
@@ -2296,5 +2258,5 @@ Addr dis_fpu ( UCodeBlock* cb,
uInstr2(cb, PUT, 2, TempReg, t1, ArchReg, R_EAX);
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("fstsw %%ax\n");
+ DIP("fstsw %%ax\n");
eip++;
return eip;
@@ -2498,11 +2460,9 @@ Addr dis_SHLRD_Gv_Ev ( UCodeBlock* cb,
uInstr1(cb, POP, sz, TempReg, t);
uInstr2(cb, PUT, sz, TempReg, t, ArchReg, eregOfRM(modrm));
- if (dis)
- VG_(printf)("sh%cd%c %%cl, %s, %s\n",
- ( left_shift ? 'l' : 'r' ),
- nameISize(sz), nameIReg(sz, gregOfRM(modrm)),
- nameIReg(sz, eregOfRM(modrm)));
+ DIP("sh%cd%c %%cl, %s, %s\n",
+ ( left_shift ? 'l' : 'r' ), nameISize(sz),
+ nameIReg(sz, gregOfRM(modrm)), nameIReg(sz, eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
ta = LOW24(pair);
eip += HI8(pair);
@@ -2513,9 +2473,6 @@ Addr dis_SHLRD_Gv_Ev ( UCodeBlock* cb,
uInstr1(cb, POP, sz, TempReg, t);
uInstr2(cb, STORE, sz, TempReg, t, TempReg, ta);
- if (dis)
- VG_(printf)("sh%cd%c %%cl, %s, %s\n",
- ( left_shift ? 'l' : 'r' ),
- nameISize(sz), nameIReg(sz, gregOfRM(modrm)),
- dis_buf);
+ DIP("sh%cd%c %%cl, %s, %s\n", ( left_shift ? 'l' : 'r' ),
+ nameISize(sz), nameIReg(sz, gregOfRM(modrm)), dis_buf);
}
@@ -2551,5 +2508,5 @@ Addr dis_bt_G_E ( UCodeBlock* cb,
{
UInt pair;
- UChar dis_buf[50];
+ Char dis_buf[50];
UChar modrm;
@@ -2592,5 +2549,5 @@ Addr dis_bt_G_E ( UCodeBlock* cb,
uInstr2(cb, AND, 4, TempReg, lit, TempReg, t_bitno);
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t_addr = LOW24(pair);
eip += HI8(pair);
@@ -2668,17 +2625,7 @@ Addr dis_bt_G_E ( UCodeBlock* cb,
}
- if (epartIsReg(modrm)) {
- if (dis)
- VG_(printf)("bt%s%c %s, %s\n",
- nameBtOp(op),
- nameISize(sz), nameIReg(sz, gregOfRM(modrm)),
- nameIReg(sz, eregOfRM(modrm)));
- } else {
- if (dis)
- VG_(printf)("bt%s%c %s, %s\n",
- nameBtOp(op),
- nameISize(sz), nameIReg(sz, gregOfRM(modrm)),
- dis_buf);
- }
+ DIP("bt%s%c %s, %s\n",
+ nameBtOp(op), nameISize(sz), nameIReg(sz, gregOfRM(modrm)),
+ ( epartIsReg(modrm) ? nameIReg(sz, eregOfRM(modrm)) : dis_buf ) );
return eip;
@@ -2696,6 +2642,7 @@ Addr dis_bs_E_G ( UCodeBlock* cb,
Int t, t1, ta, helper;
UInt pair;
- UChar dis_buf[50];
+ Char dis_buf[50];
UChar modrm;
+ Bool isReg;
vg_assert(sz == 2 || sz == 4);
@@ -2711,23 +2658,18 @@ Addr dis_bs_E_G ( UCodeBlock* cb,
uInstr1(cb, PUSH, sz, TempReg, t1);
- if (epartIsReg(modrm)) {
+ isReg = epartIsReg(modrm);
+ if (isReg) {
eip++;
uInstr2(cb, GET, sz, ArchReg, eregOfRM(modrm), TempReg, t);
- if (dis)
- VG_(printf)("bs%c%c %s, %s\n",
- fwds ? 'f' : 'r',
- nameISize(sz), nameIReg(sz, eregOfRM(modrm)),
- nameIReg(sz, gregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
ta = LOW24(pair);
eip += HI8(pair);
uInstr2(cb, LOAD, sz, TempReg, ta, TempReg, t);
- if (dis)
- VG_(printf)("bs%c%c %s, %s\n",
- fwds ? 'f' : 'r',
- nameISize(sz), dis_buf,
- nameIReg(sz, gregOfRM(modrm)));
}
+ DIP("bs%c%c %s, %s\n",
+ fwds ? 'f' : 'r', nameISize(sz),
+ ( isReg ? nameIReg(sz, eregOfRM(modrm)) : dis_buf ),
+ nameIReg(sz, gregOfRM(modrm)));
uInstr1(cb, PUSH, sz, TempReg, t);
@@ -2754,7 +2696,6 @@ void codegen_xchg_eAX_Reg ( UCodeBlock*
uInstr2(cb, PUT, sz, TempReg, t2, ArchReg, R_EAX);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, reg);
- if (dis)
- VG_(printf)("xchg%c %s, %s\n", nameISize(sz),
- nameIReg(sz, R_EAX), nameIReg(sz, reg));
+ DIP("xchg%c %s, %s\n",
+ nameISize(sz), nameIReg(sz, R_EAX), nameIReg(sz, reg));
}
@@ -2830,14 +2771,13 @@ Addr dis_cmpxchg_G_E ( UCodeBlock* cb,
uInstr2(cb, GET, size, ArchReg, eregOfRM(rm), TempReg, dest);
eip0++;
- if (dis) VG_(printf)("cmpxchg%c %s,%s\n",
- nameISize(size),
+ DIP("cmpxchg%c %s,%s\n", nameISize(size),
nameIReg(size,gregOfRM(rm)),
nameIReg(size,eregOfRM(rm)) );
} else {
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf );
ta = LOW24(pair);
uInstr2(cb, LOAD, size, TempReg, ta, TempReg, dest);
eip0 += HI8(pair);
- if (dis) VG_(printf)("cmpxchg%c %s,%s\n", nameISize(size),
+ DIP("cmpxchg%c %s,%s\n", nameISize(size),
nameIReg(size,gregOfRM(rm)), dis_buf);
}
@@ -2889,5 +2829,5 @@ Addr dis_cmpxchg8b ( UCodeBlock* cb,
vg_assert(!epartIsReg(rm));
- pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip0, dis_buf );
tal = LOW24(pair);
tah = newTemp(cb);
@@ -2896,5 +2836,5 @@ Addr dis_cmpxchg8b ( UCodeBlock* cb,
uLiteral(cb, 4);
eip0 += HI8(pair);
- if (dis) VG_(printf)("cmpxchg8b %s\n", dis_buf);
+ DIP("cmpxchg8b %s\n", dis_buf);
uInstr0(cb, CALLM_S, 0);
@@ -2972,6 +2912,5 @@ Addr dis_cmov_E_G ( UCodeBlock* cb,
uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
uInstr2(cb, PUT, size, TempReg, tmpd, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("cmov%c%s %s,%s\n",
- nameISize(size),
+ DIP("cmov%c%s %s,%s\n", nameISize(size),
VG_(name_UCondcode)(cond),
nameIReg(size,eregOfRM(rm)),
@@ -2982,5 +2921,5 @@ Addr dis_cmov_E_G ( UCodeBlock* cb,
/* E refers to memory */
{
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf );
Int tmpa = LOW24(pair);
uInstr2(cb, LOAD, size, TempReg, tmpa, TempReg, tmps);
@@ -2990,6 +2929,5 @@ Addr dis_cmov_E_G ( UCodeBlock* cb,
uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
uInstr2(cb, PUT, size, TempReg, tmpd, ArchReg, gregOfRM(rm));
- if (dis) VG_(printf)("cmov%c%s %s,%s\n",
- nameISize(size),
+ DIP("cmov%c%s %s,%s\n", nameISize(size),
VG_(name_UCondcode)(cond),
dis_buf,
@@ -3019,11 +2957,9 @@ Addr dis_xadd_G_E ( UCodeBlock* cb,
uInstr2(cb, PUT, sz, TempReg, tmpt, ArchReg, eregOfRM(rm));
uInstr2(cb, PUT, sz, TempReg, tmpd, ArchReg, gregOfRM(rm));
- if (dis)
- VG_(printf)("xadd%c %s, %s\n", nameISize(sz),
- nameIReg(sz,gregOfRM(rm)),
- nameIReg(sz,eregOfRM(rm)));
+ DIP("xadd%c %s, %s\n",
+ nameISize(sz), nameIReg(sz,gregOfRM(rm)), nameIReg(sz,eregOfRM(rm)));
return 1+eip0;
} else {
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf );
Int tmpa = LOW24(pair);
uInstr2(cb, LOAD, sz, TempReg, tmpa, TempReg, tmpd);
@@ -3033,8 +2969,6 @@ Addr dis_xadd_G_E ( UCodeBlock* cb,
uInstr2(cb, STORE, sz, TempReg, tmpt, TempReg, tmpa);
uInstr2(cb, PUT, sz, TempReg, tmpd, ArchReg, gregOfRM(rm));
- if (dis)
- VG_(printf)("xadd%c %s, %s\n", nameISize(sz),
- nameIReg(sz,gregOfRM(rm)),
- dis_buf);
+ DIP("xadd%c %s, %s\n",
+ nameISize(sz), nameIReg(sz,gregOfRM(rm)), dis_buf);
return HI8(pair)+eip0;
}
@@ -3070,7 +3004,5 @@ Addr dis_mov_Ew_Sw ( UCodeBlock* cb,
uInstr2(cb, GET, 2, ArchReg, eregOfRM(rm), TempReg, tmpv);
uInstr2(cb, PUTSEG, 2, TempReg, tmpv, ArchRegS, gregOfRM(rm));
- if (dis) VG_(printf)("movw %s,%s\n",
- nameIReg(2,eregOfRM(rm)),
- nameSReg(gregOfRM(rm)));
+ DIP("movw %s,%s\n", nameIReg(2,eregOfRM(rm)), nameSReg(gregOfRM(rm)));
return 1+eip0;
}
@@ -3078,11 +3010,10 @@ Addr dis_mov_Ew_Sw ( UCodeBlock* cb,
/* E refers to memory */
{
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf );
Int tmpa = LOW24(pair);
Int tmpb = newTemp(cb);
uInstr2(cb, LOAD, 2, TempReg, tmpa, TempReg, tmpb);
uInstr2(cb, PUTSEG, 2, TempReg, tmpb, ArchRegS, gregOfRM(rm));
- if (dis) VG_(printf)("movw %s,%s\n",
- dis_buf,nameSReg(gregOfRM(rm)));
+ DIP("movw %s,%s\n", dis_buf,nameSReg(gregOfRM(rm)));
return HI8(pair)+eip0;
}
@@ -3118,7 +3049,5 @@ Addr dis_mov_Sw_Ew ( UCodeBlock* cb,
uInstr2(cb, GETSEG, 2, ArchRegS, gregOfRM(rm), TempReg, tmpv);
uInstr2(cb, PUT, 2, TempReg, tmpv, ArchReg, eregOfRM(rm));
- if (dis) VG_(printf)("movw %s,%s\n",
- nameSReg(gregOfRM(rm)),
- nameIReg(2,eregOfRM(rm)));
+ DIP("movw %s,%s\n", nameSReg(gregOfRM(rm)), nameIReg(2,eregOfRM(rm)));
return 1+eip0;
}
@@ -3126,11 +3055,10 @@ Addr dis_mov_Sw_Ew ( UCodeBlock* cb,
/* E refers to memory */
{
- UInt pair = disAMode ( cb, sorb, eip0, dis?dis_buf:NULL);
+ UInt pair = disAMode ( cb, sorb, eip0, dis_buf );
Int tmpa = LOW24(pair);
Int tmpv = newTemp(cb);
uInstr2(cb, GETSEG, 2, ArchRegS, gregOfRM(rm), TempReg, tmpv);
uInstr2(cb, STORE, 2, TempReg, tmpv, TempReg, tmpa);
- if (dis) VG_(printf)("mov %s,%s\n",
- nameSReg(gregOfRM(rm)), dis_buf);
+ DIP("mov %s,%s\n", nameSReg(gregOfRM(rm)), dis_buf);
return HI8(pair)+eip0;
}
@@ -3153,20 +3081,15 @@ Addr dis_MMXop_regmem_to_reg ( UCodeBloc
Bool show_granularity )
{
- UChar dis_buf[50];
- UChar modrm;
- modrm = getUChar(eip);
- if (epartIsReg(modrm)) {
+ Char dis_buf[50];
+ UChar modrm = getUChar(eip);
+ Bool isReg = epartIsReg(modrm);
+
+ if (isReg) {
eip++;
uInstr1(cb, MMX2, 0,
Lit16,
(((UShort)(opc)) << 8) | ((UShort)modrm) );
- if (dis)
- VG_(printf)("%s%s %s, %s\n",
- name,
- show_granularity ? nameMMXGran(opc & 3) : (Char*)"",
- nameMMXReg(eregOfRM(modrm)),
- nameMMXReg(gregOfRM(modrm)));
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3175,11 +3098,11 @@ Addr dis_MMXop_regmem_to_reg ( UCodeBloc
(((UShort)(opc)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s%s %s, %s\n",
- name,
- show_granularity ? nameMMXGran(opc & 3) : (Char*)"",
- dis_buf,
- nameMMXReg(gregOfRM(modrm)));
}
+
+ DIP("%s%s %s, %s\n",
+ name, show_granularity ? nameMMXGran(opc & 3) : (Char*)"",
+ ( isReg ? nameMMXReg(eregOfRM(modrm)) : dis_buf ),
+ nameMMXReg(gregOfRM(modrm)) );
+
return eip;
}
@@ -3204,18 +3127,16 @@ Addr dis_SSE3_reg_or_mem ( UCodeBlock* c
UChar opc3 )
{
- UChar dis_buf[50];
+ Char dis_buf[50];
UChar modrm = getUChar(eip);
- if (epartIsReg(modrm)) {
+ Bool isReg = epartIsReg(modrm);
+
+ if (isReg) {
/* Completely internal SSE insn. */
uInstr2(cb, SSE4, 0, /* ignore sz for internal ops */
Lit16, (((UShort)opc1) << 8) | (UShort)opc2,
Lit16, (((UShort)opc3) << 8) | (UShort)modrm );
- if (dis)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)) );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3224,10 +3145,11 @@ Addr dis_SSE3_reg_or_mem ( UCodeBlock* c
Lit16, (((UShort)(opc3)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s %s, %s\n",
- name,
- dis_buf,
- nameXMMReg(gregOfRM(modrm)));
}
+
+ DIP("%s %s, %s\n",
+ name,
+ ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ),
+ nameXMMReg(gregOfRM(modrm)) );
+
return eip;
}
@@ -3250,18 +3172,16 @@ Addr dis_SSE2_reg_or_mem ( UCodeBlock* c
UChar opc2 )
{
- UChar dis_buf[50];
+ Char dis_buf[50];
UChar modrm = getUChar(eip);
- if (epartIsReg(modrm)) {
+ Bool isReg = epartIsReg(modrm);
+
+ if (isReg) {
/* Completely internal SSE insn. */
uInstr2(cb, SSE3, 0, /* ignore sz for internal ops */
Lit16, (((UShort)opc1) << 8) | (UShort)opc2,
Lit16, (UShort)modrm );
- if (dis)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)) );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3270,10 +3190,10 @@ Addr dis_SSE2_reg_or_mem ( UCodeBlock* c
Lit16, (UShort)modrm,
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s %s, %s\n",
- name,
- dis_buf,
- nameXMMReg(gregOfRM(modrm)));
}
+ DIP("%s %s, %s\n",
+ name,
+ ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ),
+ nameXMMReg(gregOfRM(modrm)) );
+
return eip;
}
@@ -3296,8 +3216,10 @@ Addr dis_SSE2_reg_or_mem_Imm8 ( UCodeBlo
UChar opc2 )
{
- UChar dis_buf[50];
+ Char dis_buf[50];
UChar modrm = getUChar(eip);
UChar imm8;
- if (epartIsReg(modrm)) {
+ Bool isReg = epartIsReg(modrm);
+
+ if (isReg) {
/* Completely internal SSE insn. */
eip++;
@@ -3306,11 +3228,7 @@ Addr dis_SSE2_reg_or_mem_Imm8 ( UCodeBlo
Lit16, (((UShort)opc1) << 8) | (UShort)opc2,
Lit16, (((UShort)modrm) << 8) | (UShort)imm8 );
- if (dis)
- VG_(printf)("%s %s, %s, $%d\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)), (Int)imm8 );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3321,10 +3239,8 @@ Addr dis_SSE2_reg_or_mem_Imm8 ( UCodeBlo
Lit16, (((UShort)(modrm)) << 8) | ((UShort)imm8),
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s %s, %s, $%d\n",
- name,
- dis_buf,
- nameXMMReg(gregOfRM(modrm)), (Int)imm8 );
}
+ DIP("%s %s, %s, $%d\n",
+ name, ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ),
+ nameXMMReg(gregOfRM(modrm)), (Int)imm8 );
return eip;
}
@@ -3348,8 +3264,10 @@ Addr dis_SSE3_reg_or_mem_Imm8 ( UCodeBlo
UChar opc3 )
{
- UChar dis_buf[50];
+ Char dis_buf[50];
UChar modrm = getUChar(eip);
UChar imm8;
- if (epartIsReg(modrm)) {
+ Bool isReg = epartIsReg(modrm);
+
+ if (isReg) {
/* Completely internal SSE insn. */
eip++;
@@ -3359,11 +3277,7 @@ Addr dis_SSE3_reg_or_mem_Imm8 ( UCodeBlo
Lit16, (((UShort)opc3) << 8) | (UShort)modrm,
Lit16, (UShort)imm8 );
- if (dis)
- VG_(printf)("%s %s, %s, $%d\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)), (Int)imm8 );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3375,10 +3289,8 @@ Addr dis_SSE3_reg_or_mem_Imm8 ( UCodeBlo
TempReg, tmpa);
uLiteral(cb, imm8);
- if (dis)
- VG_(printf)("%s %s, %s, $%d\n",
- name,
- dis_buf,
- nameXMMReg(gregOfRM(modrm)), (Int)imm8 );
}
+ DIP("%s %s, %s, $%d\n",
+ name, ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ),
+ nameXMMReg(gregOfRM(modrm)), (Int)imm8 );
return eip;
}
@@ -3400,10 +3312,11 @@ Addr dis_SSE3_load_store_or_mov ( UCodeB
UChar insn2 )
{
- UChar dis_buf[50];
- UChar modrm;
+ Char dis_buf[50];
+ UChar modrm = getUChar(eip);
+ Bool isReg = epartIsReg(modrm);
UInt pair;
Int t1;
- modrm = getUChar(eip);
- if (epartIsReg(modrm)) {
+
+ if (isReg) {
/* Completely internal; we can issue SSE4. */
eip++;
@@ -3411,14 +3324,6 @@ Addr dis_SSE3_load_store_or_mov ( UCodeB
Lit16, (((UShort)insn0) << 8) | (UShort)insn1,
Lit16, (((UShort)insn2) << 8) | (UShort)modrm );
- if (dis && is_store)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(gregOfRM(modrm)),
- nameXMMReg(eregOfRM(modrm)) );
- if (dis && !is_store)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)) );
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t1 = LOW24(pair);
eip += HI8(pair);
@@ -3427,10 +3332,16 @@ Addr dis_SSE3_load_store_or_mov ( UCodeB
Lit16, (((UShort)insn2) << 8) | (UShort)modrm,
TempReg, t1 );
- if (dis && is_store)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(gregOfRM(modrm)), dis_buf );
- if (dis && !is_store)
- VG_(printf)("%s %s, %s\n", name,
- dis_buf, nameXMMReg(gregOfRM(modrm)) );
+ }
+
+ if (is_store) {
+ DIP("%s %s, %s\n",
+ name,
+ nameXMMReg(gregOfRM(modrm)),
+ ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ) );
+ } else {
+ DIP("%s %s, %s\n",
+ name,
+ ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ),
+ nameXMMReg(gregOfRM(modrm)) );
}
return eip;
@@ -3451,10 +3362,11 @@ Addr dis_SSE2_load_store_or_mov ( UCodeB
UChar insn1 )
{
- UChar dis_buf[50];
- UChar modrm;
+ Char dis_buf[50];
+ UChar modrm = getUChar(eip);
+ Bool isReg = epartIsReg(modrm);
UInt pair;
Int t1;
- modrm = getUChar(eip);
- if (epartIsReg(modrm)) {
+
+ if (isReg) {
/* Completely internal; we can issue SSE3. */
eip++;
@@ -3462,14 +3374,6 @@ Addr dis_SSE2_load_store_or_mov ( UCodeB
Lit16, (((UShort)insn0) << 8) | (UShort)insn1,
Lit16, (UShort)modrm );
- if (dis && is_store)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(gregOfRM(modrm)),
- nameXMMReg(eregOfRM(modrm)) );
- if (dis && !is_store)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)) );
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t1 = LOW24(pair);
eip += HI8(pair);
@@ -3478,10 +3382,16 @@ Addr dis_SSE2_load_store_or_mov ( UCodeB
Lit16, (UShort)modrm,
TempReg, t1 );
- if (dis && is_store)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(gregOfRM(modrm)), dis_buf );
- if (dis && !is_store)
- VG_(printf)("%s %s, %s\n", name,
- dis_buf, nameXMMReg(gregOfRM(modrm)) );
+ }
+
+ if (is_store) {
+ DIP("%s %s, %s\n",
+ name,
+ nameXMMReg(gregOfRM(modrm)),
+ ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ) );
+ } else {
+ DIP("%s %s, %s\n",
+ name,
+ ( isReg ? nameXMMReg(eregOfRM(modrm)) : dis_buf ),
+ nameXMMReg(gregOfRM(modrm)) );
}
return eip;
@@ -3512,11 +3422,9 @@ Addr dis_SSE2_to_MMX ( UCodeBlock *cb,
Lit16, (((UShort)opc1) << 8) | (UShort)opc2,
Lit16, (UShort)modrm );
- if (dis)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameMMXReg(gregOfRM(modrm)) );
+ DIP("%s %s, %s\n",
+ name, nameXMMReg(eregOfRM(modrm)), nameMMXReg(gregOfRM(modrm)) );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3525,9 +3433,5 @@ Addr dis_SSE2_to_MMX ( UCodeBlock *cb,
Lit16, ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s %s, %s\n",
- name,
- dis_buf,
- nameMMXReg(gregOfRM(modrm)));
+ DIP("%s %s, %s\n", name, dis_buf, nameMMXReg(gregOfRM(modrm)));
}
return eip;
@@ -3558,11 +3462,9 @@ Addr dis_SSE2_from_MMX ( UCodeBlock *cb,
Lit16, (((UShort)opc1) << 8) | (UShort)opc2,
Lit16, (UShort)modrm );
- if (dis)
- VG_(printf)("%s %s, %s\n", name,
- nameMMXReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)) );
+ DIP("%s %s, %s\n",
+ name, nameMMXReg(eregOfRM(modrm)), nameXMMReg(gregOfRM(modrm)) );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3571,9 +3473,5 @@ Addr dis_SSE2_from_MMX ( UCodeBlock *cb,
Lit16, ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s %s, %s\n",
- name,
- dis_buf,
- nameXMMReg(gregOfRM(modrm)));
+ DIP("%s %s, %s\n", name, dis_buf, nameXMMReg(gregOfRM(modrm)));
}
return eip;
@@ -3605,11 +3503,9 @@ Addr dis_SSE3_to_MMX ( UCodeBlock *cb,
Lit16, (((UShort)opc1) << 8) | (UShort)opc2,
Lit16, (((UShort)opc3) << 8) | (UShort)modrm );
- if (dis)
- VG_(printf)("%s %s, %s\n", name,
- nameXMMReg(eregOfRM(modrm)),
- nameMMXReg(gregOfRM(modrm)) );
+ DIP("%s %s, %s\n",
+ name, nameXMMReg(eregOfRM(modrm)), nameMMXReg(gregOfRM(modrm)) );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3618,9 +3514,5 @@ Addr dis_SSE3_to_MMX ( UCodeBlock *cb,
Lit16, (((UShort)(opc3)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s %s, %s\n",
- name,
- dis_buf,
- nameMMXReg(gregOfRM(modrm)));
+ DIP("%s %s, %s\n", name, dis_buf, nameMMXReg(gregOfRM(modrm)));
}
return eip;
@@ -3652,11 +3544,9 @@ Addr dis_SSE3_from_MMX ( UCodeBlock *cb,
Lit16, (((UShort)opc1) << 8) | (UShort)opc2,
Lit16, (((UShort)opc3) << 8) | (UShort)modrm );
- if (dis)
- VG_(printf)("%s %s, %s\n", name,
- nameMMXReg(eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)) );
+ DIP("%s %s, %s\n",
+ name, nameMMXReg(eregOfRM(modrm)), nameXMMReg(gregOfRM(modrm)) );
eip++;
} else {
- UInt pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ UInt pair = disAMode ( cb, sorb, eip, dis_buf );
Int tmpa = LOW24(pair);
eip += HI8(pair);
@@ -3665,9 +3555,5 @@ Addr dis_SSE3_from_MMX ( UCodeBlock *cb,
Lit16, (((UShort)(opc3)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("%s %s, %s\n",
- name,
- dis_buf,
- nameXMMReg(gregOfRM(modrm)));
+ DIP("%s %s, %s\n", name, dis_buf, nameXMMReg(gregOfRM(modrm)));
}
return eip;
@@ -3686,6 +3572,5 @@ void dis_push_segreg ( UCodeBlock* cb, U
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_ESP);
uInstr2(cb, STORE, 2, TempReg, t1, TempReg, t2);
- if (dis)
- VG_(printf)("push %s\n", VG_(name_of_seg_reg)(sreg));
+ DIP("push %s\n", VG_(name_of_seg_reg)(sreg));
}
@@ -3701,6 +3586,5 @@ void dis_pop_segreg ( UCodeBlock* cb, UI
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_ESP);
uInstr2(cb, PUTSEG, 2, TempReg, t1, ArchRegS, sreg);
- if (dis)
- VG_(printf)("pop %s\n", VG_(name_of_seg_reg)(sreg));
+ DIP("pop %s\n", VG_(name_of_seg_reg)(sreg));
}
@@ -3711,5 +3595,5 @@ void dis_pop_segreg ( UCodeBlock* cb, UI
/* Disassemble a single instruction into ucode, returning the updated
eip, and setting *isEnd to True if this is the last insn in a basic
- block. Also do debug printing if (dis). */
+ block. Also do debug printing if necessary. */
static Addr disInstr ( UCodeBlock* cb, Addr eip, Bool* isEnd )
@@ -3739,5 +3623,5 @@ static Addr disInstr ( UCodeBlock* cb, A
t1 = t2 = t3 = t4 = INVALID_TEMPREG;
- if (dis) VG_(printf)("\t0x%x: ", eip);
+ DIP("\t0x%x: ", eip);
/* Spot the client-request magic sequence. */
@@ -3760,11 +3644,8 @@ static Addr disInstr ( UCodeBlock* cb, A
) {
eip += 18;
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, CondAlways);
+ jmp_lit(cb, eip);
LAST_UINSTR(cb).jmpkind = JmpClientReq;
*isEnd = True;
- if (dis)
- VG_(printf)("%%edx = client_request ( %%eax )\n");
+ DIP("%%edx = client_request ( %%eax )\n");
return eip;
}
@@ -3829,5 +3710,5 @@ static Addr disInstr ( UCodeBlock* cb, A
Bool store = gregOfRM(insn[2]) == 0;
vg_assert(sz == 4);
- pair = disAMode ( cb, sorb, eip+2, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip+2, dis_buf );
t1 = LOW24(pair);
eip += 2+HI8(pair);
@@ -3836,6 +3717,5 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (UShort)insn[2],
TempReg, t1 );
- if (dis)
- VG_(printf)("fx%s %s\n", store ? "save" : "rstor", dis_buf );
+ DIP("fx%s %s\n", store ? "save" : "rstor", dis_buf );
goto decode_success;
}
@@ -3847,5 +3727,5 @@ static Addr disInstr ( UCodeBlock* cb, A
Bool store = gregOfRM(insn[2]) == 3;
vg_assert(sz == 4);
- pair = disAMode ( cb, sorb, eip+2, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip+2, dis_buf );
t1 = LOW24(pair);
eip += 2+HI8(pair);
@@ -3854,6 +3734,5 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (UShort)insn[2],
TempReg, t1 );
- if (dis)
- VG_(printf)("%smxcsr %s\n", store ? "st" : "ld", dis_buf );
+ DIP("%smxcsr %s\n", store ? "st" : "ld", dis_buf );
goto decode_success;
}
@@ -3869,6 +3748,5 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (((UShort)0x0F) << 8) | (UShort)0xAE,
Lit16, (UShort)insn[2] );
- if (dis)
- VG_(printf)("sfence\n");
+ DIP("sfence\n");
goto decode_success;
}
@@ -3880,5 +3758,5 @@ static Addr disInstr ( UCodeBlock* cb, A
{
vg_assert(sz == 4);
- pair = disAMode ( cb, sorb, eip+2, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip+2, dis_buf );
t1 = LOW24(pair);
eip += 2+HI8(pair);
@@ -3887,6 +3765,5 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (UShort)insn[2],
TempReg, t1 );
- if (dis)
- VG_(printf)("clflush %s\n", dis_buf);
+ DIP("clflush %s\n", dis_buf);
goto decode_success;
}
@@ -3953,8 +3830,6 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, gregOfRM(modrm));
- if (dis)
- VG_(printf)("cvt{t}s{s,d}2si %s, %s\n",
- nameXMMReg(eregOfRM(modrm)),
- nameIReg(4,gregOfRM(modrm)) );
+ DIP("cvt{t}s{s,d}2si %s, %s\n",
+ nameXMMReg(eregOfRM(modrm)), nameIReg(4,gregOfRM(modrm)) );
} else {
/* So, we're reading memory and writing an ireg. This calls
@@ -3967,5 +3842,5 @@ static Addr disInstr ( UCodeBlock* cb, A
usual. */
t1 = newTemp(cb); /* t1 holds value on its way to ireg */
- pair = disAMode ( cb, sorb, eip+3, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip+3, dis_buf );
t2 = LOW24(pair); /* t2 holds addr */
eip += 3+HI8(pair);
@@ -3978,8 +3853,6 @@ static Addr disInstr ( UCodeBlock* cb, A
| ((UInt)modrm) );
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, gregOfRM(modrm));
- if (dis)
- VG_(printf)("cvt{t}s{s,d}2si %s, %s\n",
- dis_buf,
- nameIReg(4,gregOfRM(modrm)) );
+ DIP("cvt{t}s{s,d}2si %s, %s\n",
+ dis_buf, nameIReg(4,gregOfRM(modrm)) );
}
goto decode_success;
@@ -4004,10 +3877,8 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
eip += 4;
- if (dis)
- VG_(printf)("cvtsi2s%s %s, %s\n", s_or_d,
- nameIReg(4,eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)));
+ DIP("cvtsi2s%s %s, %s\n", s_or_d,
+ nameIReg(4,eregOfRM(modrm)), nameXMMReg(gregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip+3, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip+3, dis_buf );
t2 = LOW24(pair);
eip += 3+HI8(pair);
@@ -4016,8 +3887,6 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (((UShort)insn[2]) << 8) | (UShort)modrm,
TempReg, t2 );
- if (dis)
- VG_(printf)("cvtsi2s%s %s, %s\n", s_or_d,
- dis_buf,
- nameXMMReg(gregOfRM(modrm)));
+ DIP("cvtsi2s%s %s, %s\n",
+ s_or_d, dis_buf, nameXMMReg(gregOfRM(modrm)));
}
goto decode_success;
@@ -4878,8 +4747,6 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, eregOfRM(modrm));
- if (dis)
- VG_(printf)("movd %s, %s\n",
- nameXMMReg(gregOfRM(modrm)),
- nameIReg(4,eregOfRM(modrm)));
+ DIP("movd %s, %s\n",
+ nameXMMReg(gregOfRM(modrm)), nameIReg(4,eregOfRM(modrm)));
eip += 3;
} else
@@ -4891,8 +4758,6 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (((UShort)insn[1]) << 8) | (UShort)modrm,
TempReg, t1 );
- if (dis)
- VG_(printf)("movd %s, %s\n",
- nameIReg(4,eregOfRM(modrm)),
- nameXMMReg(gregOfRM(modrm)));
+ DIP("movd %s, %s\n",
+ nameIReg(4,eregOfRM(modrm)), nameXMMReg(gregOfRM(modrm)));
eip += 3;
} else {
@@ -4916,6 +4781,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, insn[3]);
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, gregOfRM(modrm));
- if (dis)
- VG_(printf)("pextrw %s, %d, %s\n",
+ DIP("pextrw %s, %d, %s\n",
nameXMMReg(eregOfRM(modrm)), (Int)insn[3],
nameIReg(4, gregOfRM(modrm)));
@@ -4936,8 +4800,6 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uLiteral(cb, insn[3]);
- if (dis)
- VG_(printf)("pinsrw %s, %d, %s\n",
- nameIReg(2, eregOfRM(modrm)),
- (Int)insn[3],
+ DIP("pinsrw %s, %d, %s\n",
+ nameIReg(2, eregOfRM(modrm)), (Int)insn[3],
nameXMMReg(gregOfRM(modrm)));
eip += 4;
@@ -5008,9 +4870,6 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, gregOfRM(modrm));
}
- if (dis)
- VG_(printf)("movmskp%c %s, %s\n",
- sz == 4 ? 's' : 'd',
- nameXMMReg(eregOfRM(modrm)),
- nameIReg(4,gregOfRM(modrm)));
+ DIP("movmskp%c %s, %s\n", sz == 4 ? 's' : 'd',
+ nameXMMReg(eregOfRM(modrm)), nameIReg(4,gregOfRM(modrm)));
eip += 3;
goto decode_success;
@@ -5096,8 +4955,6 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, gregOfRM(modrm));
- if (dis)
- VG_(printf)("pmovmskb %s, %s\n",
- nameXMMReg(eregOfRM(modrm)),
- nameIReg(4,gregOfRM(modrm)));
+ DIP("pmovmskb %s, %s\n",
+ nameXMMReg(eregOfRM(modrm)), nameIReg(4,gregOfRM(modrm)));
eip += 3;
goto decode_success;
@@ -5161,13 +5018,11 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, 4+d32);
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, R_ESP);
- uInstr1(cb, JMP, 0, TempReg, t2);
- uCond(cb, CondAlways);
+ jmp_treg(cb, t2);
LAST_UINSTR(cb).jmpkind = JmpRet;
*isEnd = True;
- if (dis) {
- if (d32 == 0) VG_(printf)("ret\n");
- else VG_(printf)("ret %d\n", d32);
- }
+ if (d32 == 0) { DIP("ret\n"); }
+ else { DIP("ret %d\n", d32); }
+
break;
@@ -5190,6 +5045,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, archReg);
eip++; /* Step over the POP */
- if (dis)
- VG_(printf)("call 0x%x ; popl %s\n",d32,nameIReg(4,archReg));
+ DIP("call 0x%x ; popl %s\n",d32,nameIReg(4,archReg));
} else {
/* The normal sequence for a call. */
@@ -5203,10 +5057,8 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, eip);
uInstr2(cb, STORE, 4, TempReg, t2, TempReg, t1);
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, d32);
- uCond(cb, CondAlways);
+ jmp_lit(cb, d32);
LAST_UINSTR(cb).jmpkind = JmpCall;
*isEnd = True;
- if (dis) VG_(printf)("call 0x%x\n",d32);
+ DIP("call 0x%x\n",d32);
}
break;
@@ -5232,5 +5084,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_ESP);
}
- if (dis) VG_(printf)("enter 0x%x, 0x%x", d32, abyte);
+ DIP("enter 0x%x, 0x%x", d32, abyte);
break;
@@ -5246,5 +5098,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, 4);
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, R_ESP);
- if (dis) VG_(printf)("leave");
+ DIP("leave");
break;
@@ -5267,5 +5119,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr0(cb, CALLM_E, 0);
uInstr2(cb, PUT, 1, TempReg, t1, ArchReg, R_AL);
- if (dis) VG_(printf)(opc == 0x27 ? "daa\n" : "das\n");
+ DIP(opc == 0x27 ? "daa\n" : "das\n");
break;
@@ -5280,5 +5132,5 @@ static Addr disInstr ( UCodeBlock* cb, A
LAST_UINSTR(cb).signed_widen = True;
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, R_EAX);
- if (dis) VG_(printf)("cwd\n");
+ DIP("cwd\n");
} else {
vg_assert(sz == 2);
@@ -5288,5 +5140,5 @@ static Addr disInstr ( UCodeBlock* cb, A
LAST_UINSTR(cb).signed_widen = True;
uInstr2(cb, PUT, 2, TempReg, t1, ArchReg, R_EAX);
- if (dis) VG_(printf)("cbw\n");
+ DIP("cbw\n");
}
break;
@@ -5298,5 +5150,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, sz == 2 ? 15 : 31);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, R_EDX);
- if (dis) VG_(printf)(sz == 2 ? "cwdq\n" : "cdqq\n");
+ DIP(sz == 2 ? "cwdq\n" : "cdqq\n");
break;
@@ -5305,15 +5157,15 @@ static Addr disInstr ( UCodeBlock* cb, A
case 0x9E: /* SAHF */
codegen_SAHF ( cb );
- if (dis) VG_(printf)("sahf\n");
+ DIP("sahf\n");
break;
case 0x9F: /* LAHF */
codegen_LAHF ( cb );
- if (dis) VG_(printf)("lahf\n");
+ DIP("lahf\n");
break;
case 0x9B: /* FWAIT */
/* ignore? */
- if (dis) VG_(printf)("fwait\n");
+ DIP("fwait\n");
break;
@@ -5346,6 +5198,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg,
(UInt)(opc - 0x40));
- if (dis)
- VG_(printf)("inc%c %s\n", nameISize(sz), nameIReg(sz,opc-0x40));
+ DIP("inc%c %s\n", nameISize(sz), nameIReg(sz,opc-0x40));
break;
@@ -5365,6 +5216,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg,
(UInt)(opc - 0x48));
- if (dis)
- VG_(printf)("dec%c %s\n", nameISize(sz), nameIReg(sz,opc-0x48));
+ DIP("dec%c %s\n", nameISize(sz), nameIReg(sz,opc-0x48));
break;
@@ -5377,10 +5227,8 @@ static Addr disInstr ( UCodeBlock* cb, A
at this point. So we declare an end-of-block here, which
forces any TempRegs caching ArchRegs to be flushed. */
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, CondAlways);
+ jmp_lit(cb, eip);
LAST_UINSTR(cb).jmpkind = JmpSyscall;
*isEnd = True;
- if (dis) VG_(printf)("int $0x80\n");
+ DIP("int $0x80\n");
break;
@@ -5389,20 +5237,14 @@ static Addr disInstr ( UCodeBlock* cb, A
case 0xEB: /* Jb (jump, byte offset) */
d32 = (eip+1) + getSDisp8(eip); eip++;
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, d32);
- uCond(cb, CondAlways);
+ jmp_lit(cb, d32);
*isEnd = True;
- if (dis)
- VG_(printf)("jmp-8 0x%x\n", d32);
+ DIP("jmp-8 0x%x\n", d32);
break;
case 0xE9: /* Jv (jump, 16/32 offset) */
d32 = (eip+sz) + getSDisp(sz,eip); eip += sz;
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, d32);
- uCond(cb, CondAlways);
+ jmp_lit(cb, d32);
*isEnd = True;
- if (dis)
- VG_(printf)("jmp 0x%x\n", d32);
+ DIP("jmp 0x%x\n", d32);
break;
@@ -5424,8 +5266,5 @@ static Addr disInstr ( UCodeBlock* cb, A
case 0x7F: /* JGb/JNLEb (jump greater) */
d32 = (eip+1) + getSDisp8(eip); eip++;
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, d32);
- uCond(cb, (Condcode)(opc - 0x70));
- uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
+ jcc_lit(cb, d32, (Condcode)(opc - 0x70));
/* It's actually acceptable not to end this basic block at a
control transfer, reducing the number of jumps through
@@ -5433,12 +5272,9 @@ static Addr disInstr ( UCodeBlock* cb, A
following this jump twice. This does give faster code, but
on the whole I don't think the effort is worth it. */
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, CondAlways);
+ jmp_lit(cb, eip);
*isEnd = True;
/* The above 3 lines would be removed if the bb was not to end
here. */
- if (dis)
- VG_(printf)("j%s-8 0x%x\n", VG_(name_UCondcode)(opc - 0x70), d32);
+ DIP("j%s-8 0x%x\n", VG_(name_UCondcode)(opc - 0x70), d32);
break;
@@ -5451,6 +5287,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, JIFZ, 4, TempReg, t1, Literal, 0);
uLiteral(cb, d32);
- if (dis)
- VG_(printf)("j%sz 0x%x\n", nameIReg(sz, R_ECX), d32);
+ DIP("j%sz 0x%x\n", nameIReg(sz, R_ECX), d32);
break;
@@ -5470,15 +5305,9 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, eip);
if (opc == 0xE0 || opc == 0xE1) { /* LOOPE/LOOPNE */
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, (opc == 0xE1 ? CondNZ : CondZ));
- uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
+ jcc_lit(cb, eip, (opc == 0xE1 ? CondNZ : CondZ));
}
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, d32);
- uCond(cb, CondAlways);
+ jmp_lit(cb, d32);
*isEnd = True;
- if (dis)
- VG_(printf)("loop 0x%x\n", d32);
+ DIP("loop 0x%x\n", d32);
break;
@@ -5517,10 +5346,9 @@ static Addr disInstr ( UCodeBlock* cb, A
has no effect on the address calculation. Therefore we pass
zero instead of sorb here. */
- pair = disAMode ( cb, /*sorb*/ 0, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, /*sorb*/ 0, eip, dis_buf );
eip += HI8(pair);
t1 = LOW24(pair);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, gregOfRM(modrm));
- if (dis)
- VG_(printf)("lea%c %s, %s\n", nameISize(sz), dis_buf,
+ DIP("lea%c %s, %s\n", nameISize(sz), dis_buf,
nameIReg(sz,gregOfRM(modrm)));
break;
@@ -5545,6 +5373,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, LOAD, sz, TempReg, t2, TempReg, t1);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, R_EAX);
- if (dis) VG_(printf)("mov%c %s0x%x, %s\n", nameISize(sz),
- sorbTxt(sorb),
+ DIP("mov%c %s0x%x, %s\n", nameISize(sz), sorbTxt(sorb),
d32, nameIReg(sz,R_EAX));
break;
@@ -5561,6 +5388,5 @@ static Addr disInstr ( UCodeBlock* cb, A
handleSegOverride(cb, sorb, t2);
uInstr2(cb, STORE, sz, TempReg, t1, TempReg, t2);
- if (dis) VG_(printf)("mov%c %s, %s0x%x\n", nameISize(sz),
- nameIReg(sz,R_EAX),
+ DIP("mov%c %s, %s0x%x\n", nameISize(sz), nameIReg(sz,R_EAX),
sorbTxt(sorb), d32);
break;
@@ -5579,6 +5405,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, d32);
uInstr2(cb, PUT, 1, TempReg, t1, ArchReg, opc-0xB0);
- if (dis) VG_(printf)("movb $0x%x,%s\n", d32,
- nameIReg(1,opc-0xB0));
+ DIP("movb $0x%x,%s\n", d32, nameIReg(1,opc-0xB0));
break;
@@ -5596,6 +5421,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, d32);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, opc-0xB8);
- if (dis) VG_(printf)("mov%c $0x%x,%s\n", nameISize(sz), d32,
- nameIReg(sz,opc-0xB8));
+ DIP("mov%c $0x%x,%s\n", nameISize(sz), d32, nameIReg(sz,opc-0xB8));
break;
@@ -5615,8 +5439,8 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, d32);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, eregOfRM(modrm));
- if (dis) VG_(printf)("mov%c $0x%x, %s\n", nameISize(sz), d32,
+ DIP("mov%c $0x%x, %s\n", nameISize(sz), d32,
nameIReg(sz,eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
eip += HI8(pair);
d32 = getUDisp(sz,eip); eip += sz;
@@ -5626,5 +5450,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, d32);
uInstr2(cb, STORE, sz, TempReg, t1, TempReg, t2);
- if (dis) VG_(printf)("mov%c $0x%x, %s\n", nameISize(sz), d32, dis_buf);
+ DIP("mov%c $0x%x, %s\n", nameISize(sz), d32, dis_buf);
}
break;
@@ -5829,6 +5653,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_ESP);
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, opc-0x58);
- if (dis)
- VG_(printf)("pop%c %s\n", nameISize(sz), nameIReg(sz,opc-0x58));
+ DIP("pop%c %s\n", nameISize(sz), nameIReg(sz,opc-0x58));
break;
@@ -5844,6 +5667,5 @@ static Addr disInstr ( UCodeBlock* cb, A
/* PUTF writes all the flags we are interested in */
uFlagsRWU(cb, FlagsEmpty, FlagsALL, FlagsEmpty);
- if (dis)
- VG_(printf)("popf%c\n", nameISize(sz));
+ DIP("popf%c\n", nameISize(sz));
break;
@@ -5884,6 +5706,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, sz * 8); /* One 'sz' per register */
uInstr2(cb, PUT, 4, TempReg, t3, ArchReg, R_ESP);
- if (dis)
- VG_(printf)("popa%c\n", nameISize(sz));
+ DIP("popa%c\n", nameISize(sz));
break;
}
@@ -5916,5 +5737,5 @@ static Addr disInstr ( UCodeBlock* cb, A
/* resolve MODR/M */
- pair1 = disAMode ( cb, sorb, eip, dis?dis_buf:NULL);
+ pair1 = disAMode ( cb, sorb, eip, dis_buf );
tmpa = LOW24(pair1);
@@ -5923,6 +5744,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, STORE, 4, TempReg, t3, TempReg, tmpa);
- if (dis)
- VG_(printf)("popl %s\n", dis_buf);
+ DIP("popl %s\n", dis_buf);
eip += HI8(pair1);
@@ -5958,6 +5778,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_ESP);
uInstr2(cb, STORE, sz, TempReg, t1, TempReg, t2);
- if (dis)
- VG_(printf)("push%c %s\n", nameISize(sz), nameIReg(sz,opc-0x50));
+ DIP("push%c %s\n", nameISize(sz), nameIReg(sz,opc-0x50));
break;
@@ -5977,6 +5796,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, d32);
uInstr2(cb, STORE, sz, TempReg, t2, TempReg, t1);
- if (dis)
- VG_(printf)("push%c $0x%x\n", nameISize(sz), d32);
+ DIP("push%c $0x%x\n", nameISize(sz), d32);
break;
@@ -5993,6 +5811,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_ESP);
uInstr2(cb, STORE, sz, TempReg, t1, TempReg, t2);
- if (dis)
- VG_(printf)("pushf%c\n", nameISize(sz));
+ DIP("pushf%c\n", nameISize(sz));
break;
@@ -6036,6 +5853,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, STORE, sz, TempReg, t1, TempReg, t2);
}
- if (dis)
- VG_(printf)("pusha%c\n", nameISize(sz));
+ DIP("pusha%c\n", nameISize(sz));
break;
}
@@ -6083,5 +5899,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uFlagsRWU(cb, FlagsEmpty, FlagD, FlagsEmpty);
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("cld\n");
+ DIP("cld\n");
break;
@@ -6091,5 +5907,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uFlagsRWU(cb, FlagsEmpty, FlagD, FlagsEmpty);
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("std\n");
+ DIP("std\n");
break;
@@ -6099,5 +5915,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uFlagsRWU(cb, FlagsEmpty, FlagC, FlagsOSZAP);
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("clc\n");
+ DIP("clc\n");
break;
@@ -6107,5 +5923,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uFlagsRWU(cb, FlagsEmpty, FlagC, FlagsOSZCP);
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("stc\n");
+ DIP("stc\n");
break;
@@ -6161,8 +5977,7 @@ static Addr disInstr ( UCodeBlock* cb, A
else
if (abyte == 0x90) { /* REP NOP (PAUSE) */
- if (dis) VG_(printf)("rep nop (P4 pause)\n");
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, CondAlways);
+ /* a hint to the P4 re spin-wait loop */
+ DIP("rep nop (P4 pause)\n");
+ jmp_lit(cb, eip);
LAST_UINSTR(cb).jmpkind = JmpYield;
*isEnd = True;
@@ -6188,10 +6003,9 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, sz, TempReg, t2, ArchReg, eregOfRM(modrm));
eip++;
- if (dis)
- VG_(printf)("xchg%c %s, %s\n", nameISize(sz),
- nameIReg(sz,gregOfRM(modrm)),
+ DIP("xchg%c %s, %s\n",
+ nameISize(sz), nameIReg(sz,gregOfRM(modrm)),
nameIReg(sz,eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL);
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t3 = LOW24(pair);
uInstr2(cb, LOAD, sz, TempReg, t3, TempReg, t1);
@@ -6200,13 +6014,11 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, sz, TempReg, t1, ArchReg, gregOfRM(modrm));
eip += HI8(pair);
- if (dis)
- VG_(printf)("xchg%c %s, %s\n", nameISize(sz),
- nameIReg(sz,gregOfRM(modrm)),
- dis_buf);
+ DIP("xchg%c %s, %s\n", nameISize(sz),
+ nameIReg(sz,gregOfRM(modrm)), dis_buf);
}
break;
case 0x90: /* XCHG eAX,eAX */
- if (dis) VG_(printf)("nop\n");
+ DIP("nop\n");
break;
case 0x91: /* XCHG eAX,eCX */
@@ -6235,6 +6047,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 1, TempReg, t2, ArchReg, R_AL); /* put byte into AL */
- if (dis)
- VG_(printf)("xlat%c [ebx]\n", nameISize(sz));
+ DIP("xlat%c [ebx]\n", nameISize(sz));
break;
@@ -6270,9 +6081,8 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr0(cb, CALLM_E, 0);
uInstr2(cb, PUT, 4, TempReg, t2, ArchReg, R_EAX);
- if (dis) {
- if ( opc == 0xE4 || opc == 0xE5 )
- VG_(printf)("in 0x%x, %%eax/%%ax/%%al\n", getUChar(eip-1) );
- else
- VG_(printf)("in (%%dx), %%eax/%%ax/%%al\n");
+ if ( opc == 0xE4 || opc == 0xE5 ) {
+ DIP("in 0x%x, %%eax/%%ax/%%al\n", getUChar(eip-1) );
+ } else {
+ DIP("in (%%dx), %%eax/%%ax/%%al\n");
}
break;
@@ -6305,9 +6115,8 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr1(cb, CLEAR, 0, Lit16, 12);
uInstr0(cb, CALLM_E, 0);
- if (dis) {
- if ( opc == 0xE4 || opc == 0xE5 )
- VG_(printf)("out %%eax/%%ax/%%al, 0x%x\n", getUChar(eip-1) );
- else
- VG_(printf)("out %%eax/%%ax/%%al, (%%dx)\n");
+ if ( opc == 0xE4 || opc == 0xE5 ) {
+ DIP("out %%eax/%%ax/%%al, 0x%x\n", getUChar(eip-1) );
+ } else {
+ DIP("out %%eax/%%ax/%%al, (%%dx)\n");
}
break;
@@ -6452,5 +6261,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr1(cb, BSWAP, 4, TempReg, t1);
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, opc-0xC8);
- if (dis) VG_(printf)("bswapl %s\n", nameIReg(4, opc-0xC8));
+ DIP("bswapl %s\n", nameIReg(4, opc-0xC8));
break;
@@ -6546,5 +6355,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("cpuid\n");
+ DIP("cpuid\n");
break;
@@ -6573,12 +6382,9 @@ static Addr disInstr ( UCodeBlock* cb, A
t1 = newTemp(cb);
uInstr2(cb, GET, 4, ArchReg, gregOfRM(modrm), TempReg, t1);
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t2 = LOW24(pair);
eip += HI8(pair);
uInstr2(cb, STORE, 4, TempReg, t1, TempReg, t2);
- if (dis)
- VG_(printf)("movnti %s,%s\n",
- nameIReg(4,gregOfRM(modrm)),
- dis_buf);
+ DIP("movnti %s,%s\n", nameIReg(4,gregOfRM(modrm)), dis_buf);
break;
@@ -6607,15 +6413,8 @@ static Addr disInstr ( UCodeBlock* cb, A
case 0x8F: /* JGb/JNLEb (jump greater) */
d32 = (eip+4) + getUDisp32(eip); eip += 4;
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, d32);
- uCond(cb, (Condcode)(opc - 0x80));
- uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, CondAlways);
+ jcc_lit(cb, d32, (Condcode)(opc - 0x80));
+ jmp_lit(cb, eip);
*isEnd = True;
- if (dis)
- VG_(printf)("j%s-32 0x%x\n",
- VG_(name_UCondcode)(opc - 0x80), d32);
+ DIP("j%s-32 0x%x\n", VG_(name_UCondcode)(opc - 0x80), d32);
break;
@@ -6640,5 +6439,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uInstr2(cb, PUT, 4, TempReg, t3, ArchReg, R_EAX);
uInstr0(cb, CALLM_E, 0);
- if (dis) VG_(printf)("rdtsc\n");
+ DIP("rdtsc\n");
break;
@@ -6668,9 +6467,8 @@ static Addr disInstr ( UCodeBlock* cb, A
uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
uInstr2(cb, PUT, 1, TempReg, t1, ArchReg, eregOfRM(modrm));
- if (dis) VG_(printf)("set%s %s\n",
- VG_(name_UCondcode)(opc-0x90),
+ DIP("set%s %s\n", VG_(name_UCondcode)(opc-0x90),
nameIReg(1,eregOfRM(modrm)));
} else {
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
t2 = LOW24(pair);
eip += HI8(pair);
@@ -6679,7 +6477,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uFlagsRWU(cb, FlagsOSZACP, FlagsEmpty, FlagsEmpty);
uInstr2(cb, STORE, 1, TempReg, t1, TempReg, t2);
- if (dis) VG_(printf)("set%s %s\n",
- VG_(name_UCondcode)(opc-0x90),
- dis_buf);
+ DIP("set%s %s\n", VG_(name_UCondcode)(opc-0x90), dis_buf);
}
break;
@@ -6733,7 +6529,7 @@ static Addr disInstr ( UCodeBlock* cb, A
}
eip += lengthAMode(eip);
- if (dis) {
+ if (VG_(print_codegen)) {
UChar* hintstr;
- if(opc == 0x0D) {
+ if (opc == 0x0D) {
switch (gregOfRM(modrm)) {
case 0: hintstr = ""; break;
@@ -6755,8 +6551,7 @@ static Addr disInstr ( UCodeBlock* cb, A
break;
- case 0x71: case 0x72: case 0x73:
+ case 0x71: case 0x72: case 0x73: {
/* (sz==4): PSLL/PSRA/PSRL mmxreg by imm8 */
/* (sz==2): PSLL/PSRA/PSRL xmmreg by imm8 */
- {
UChar byte1, byte2, byte3, subopc, mmreg;
vg_assert(sz == 4 || sz == 2);
@@ -6784,13 +6579,10 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (((UShort)byte1) << 8) | ((UShort)byte2),
Lit16, ((UShort)byte3) );
- if (dis)
- VG_(printf)("ps%s%s $%d, %s\n",
- (subopc == 2 ? "rl"
+ DIP("ps%s%s $%d, %s\n",
+ ( subopc == 2 ? "rl"
: subopc == 6 ? "ll"
: subopc == 4 ? "ra"
: "??"),
- nameMMXGran(opc & 3),
- (Int)byte3,
- nameMMXReg(mmreg) );
+ nameMMXGran(opc & 3), (Int)byte3, nameMMXReg(mmreg) );
} else {
/* Whereas we have to include it for SSE. */
@@ -6799,7 +6591,6 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16, (((UShort)byte1) << 8) | ((UShort)byte2),
Lit16, ((UShort)byte3) );
- if (dis)
- VG_(printf)("ps%s%s $%d, %s\n",
- (subopc == 2 ? "rl"
+ DIP("ps%s%s $%d, %s\n",
+ ( subopc == 2 ? "rl"
: subopc == 6 ? "ll"
: subopc == 4 ? "ra"
@@ -6807,16 +6598,13 @@ static Addr disInstr ( UCodeBlock* cb, A
: subopc == 7 ? "(PSLLDQ)"
: "??"),
- nameMMXGran(opc & 3),
- (Int)byte3,
- nameXMMReg(mmreg) );
- }
+ nameMMXGran(opc & 3), (Int)byte3, nameXMMReg(mmreg) );
}
break;
+ }
case 0x77: /* EMMS */
vg_assert(sz == 4);
uInstr1(cb, MMX1, 0, Lit16, ((UShort)(opc)) );
- if (dis)
- VG_(printf)("emms\n");
+ DIP("emms\n");
break;
@@ -6832,11 +6620,9 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, eregOfRM(modrm));
- if (dis)
- VG_(printf)("movd %s, %s\n",
- nameMMXReg(gregOfRM(modrm)),
- nameIReg(4,eregOfRM(modrm)));
+ DIP("movd %s, %s\n",
+ nameMMXReg(gregOfRM(modrm)), nameIReg(4,eregOfRM(modrm)));
} else {
Int tmpa;
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
tmpa = LOW24(pair);
eip += HI8(pair);
@@ -6845,8 +6631,5 @@ static Addr disInstr ( UCodeBlock* cb, A
(((UShort)(opc)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("movd %s, %s\n",
- nameMMXReg(gregOfRM(modrm)),
- dis_buf);
+ DIP("movd %s, %s\n", nameMMXReg(gregOfRM(modrm)), dis_buf);
}
break;
@@ -6863,11 +6646,9 @@ static Addr disInstr ( UCodeBlock* cb, A
(((UShort)(opc)) << 8) | ((UShort)modrm),
TempReg, t1 );
- if (dis)
- VG_(printf)("movd %s, %s\n",
- nameIReg(4,eregOfRM(modrm)),
- nameMMXReg(gregOfRM(modrm)));
+ DIP("movd %s, %s\n",
+ nameIReg(4,eregOfRM(modrm)), nameMMXReg(gregOfRM(modrm)));
} else {
Int tmpa;
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
tmpa = LOW24(pair);
eip += HI8(pair);
@@ -6876,8 +6657,5 @@ static Addr disInstr ( UCodeBlock* cb, A
(((UShort)(opc)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("movd %s, %s\n",
- dis_buf,
- nameMMXReg(gregOfRM(modrm)));
+ DIP("movd %s, %s\n", dis_buf, nameMMXReg(gregOfRM(modrm)));
}
break;
@@ -6891,11 +6669,9 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16,
(((UShort)(opc)) << 8) | ((UShort)modrm) );
- if (dis)
- VG_(printf)("movq %s, %s\n",
- nameMMXReg(eregOfRM(modrm)),
- nameMMXReg(gregOfRM(modrm)));
+ DIP("movq %s, %s\n",
+ nameMMXReg(eregOfRM(modrm)), nameMMXReg(gregOfRM(modrm)));
} else {
Int tmpa;
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
tmpa = LOW24(pair);
eip += HI8(pair);
@@ -6904,8 +6680,6 @@ static Addr disInstr ( UCodeBlock* cb, A
(((UShort)(opc)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("movq %s, %s\n",
- dis_buf,
- nameMMXReg(gregOfRM(modrm)));
+ DIP("movq %s, %s\n",
+ dis_buf, nameMMXReg(gregOfRM(modrm)));
}
break;
@@ -6920,11 +6694,9 @@ static Addr disInstr ( UCodeBlock* cb, A
Lit16,
(((UShort)(opc)) << 8) | ((UShort)modrm) );
- if (dis)
- VG_(printf)("movq %s, %s\n",
- nameMMXReg(gregOfRM(modrm)),
- nameMMXReg(eregOfRM(modrm)));
+ DIP("movq %s, %s\n",
+ nameMMXReg(gregOfRM(modrm)), nameMMXReg(eregOfRM(modrm)));
} else {
Int tmpa;
- pair = disAMode ( cb, sorb, eip, dis?dis_buf:NULL );
+ pair = disAMode ( cb, sorb, eip, dis_buf );
tmpa = LOW24(pair);
eip += HI8(pair);
@@ -6933,8 +6705,6 @@ static Addr disInstr ( UCodeBlock* cb, A
(((UShort)(opc)) << 8) | ((UShort)modrm),
TempReg, tmpa);
- if (dis)
- VG_(printf)("mov(nt)q %s, %s\n",
- nameMMXReg(gregOfRM(modrm)),
- dis_buf);
+ DIP("mov(nt)q %s, %s\n",
+ nameMMXReg(gregOfRM(modrm)), dis_buf);
}
break;
@@ -7137,8 +6907,6 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, gregOfRM(modrm));
- if (dis)
- VG_(printf)("pmovmskb %s, %s\n",
- nameMMXReg(eregOfRM(modrm)),
- nameIReg(4,gregOfRM(modrm)));
+ DIP("pmovmskb %s, %s\n",
+ nameMMXReg(eregOfRM(modrm)), nameIReg(4,gregOfRM(modrm)));
eip++;
break;
@@ -7157,6 +6925,5 @@ static Addr disInstr ( UCodeBlock* cb, A
uLiteral(cb, abyte);
uInstr2(cb, PUT, 4, TempReg, t1, ArchReg, gregOfRM(modrm));
- if (dis)
- VG_(printf)("pextrw %s, %d, %s\n",
+ DIP("pextrw %s, %d, %s\n",
nameMMXReg(eregOfRM(modrm)), (Int)abyte,
nameIReg(4, gregOfRM(modrm)));
@@ -7176,9 +6943,6 @@ static Addr disInstr ( UCodeBlock* cb, A
TempReg, t1 );
uLiteral(cb, abyte);
- if (dis)
- VG_(printf)("pinsrw %s, %d, %s\n",
- nameIReg(2, eregOfRM(modrm)),
- (Int)abyte,
- nameMMXReg(gregOfRM(modrm)));
+ DIP("pinsrw %s, %d, %s\n", nameIReg(2, eregOfRM(modrm)),
+ (Int)abyte, nameMMXReg(gregOfRM(modrm)));
break;
@@ -7224,7 +6988,5 @@ static Addr disInstr ( UCodeBlock* cb, A
/* just because everything else insists the last instruction of
a BB is a jmp */
- uInstr1(cb, JMP, 0, Literal, 0);
- uCond(cb, CondAlways);
- uLiteral(cb, eip);
+ jmp_lit(cb, eip);
*isEnd = True;
break;
@@ -7235,9 +6997,8 @@ static Addr disInstr ( UCodeBlock* cb, A
decode_success:
/* All decode successes end up here. */
- if (dis)
- VG_(printf)("\n");
+ DIP("\n");
for (; first_uinstr < cb->used; first_uinstr++) {
Bool sane = VG_(saneUInstr)(True, True, &cb->instrs[first_uinstr]);
- if (dis)
+ if (VG_(print_codegen))
VG_(pp_UInstr)(first_uinstr, &cb->instrs[first_uinstr]);
else if (!sane)
@@ -7260,5 +7021,5 @@ Int VG_(disBB) ( UCodeBlock* cb, Addr ei
Int delta = 0;
- if (dis) VG_(printf)("Original x86 code to UCode:\n\n");
+ DIP("Original x86 code to UCode:\n\n");
/* After every x86 instruction do an INCEIP, except for the final one
@@ -7276,11 +7037,10 @@ Int VG_(disBB) ( UCodeBlock* cb, Addr ei
* which occurs if the x86 instr was a nop */
if (cb->used == 0 || LAST_UINSTR(cb).opcode != JMP) {
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, CondAlways);
+ jmp_lit(cb, eip);
/* Print added JMP */
- if (dis) VG_(pp_UInstr)(cb->used-1, &cb->instrs[cb->used-1]);
+ if (VG_(print_codegen))
+ VG_(pp_UInstr)(cb->used-1, &cb->instrs[cb->used-1]);
}
- if (dis) VG_(printf)("\n");
+ DIP("\n");
delta = eip - eip0;
@@ -7298,9 +7058,8 @@ Int VG_(disBB) ( UCodeBlock* cb, Addr ei
"Warning: splitting giant basic block into pieces at %p %(y",
eip, eip);
- uInstr1(cb, JMP, 0, Literal, 0);
- uLiteral(cb, eip);
- uCond(cb, CondAlways);
+ jmp_lit(cb, eip);
/* Print added JMP */
- if (dis) VG_(pp_UInstr)(cb->used-1, &cb->instrs[cb->used-1]);
+ if (VG_(print_codegen))
+ VG_(pp_UInstr)(cb->used-1, &cb->instrs[cb->used-1]);
isEnd = True;
@@ -7308,7 +7067,8 @@ Int VG_(disBB) ( UCodeBlock* cb, Addr ei
uInstr1(cb, INCEIP, 0, Lit16, delta);
/* Print added INCEIP */
- if (dis) VG_(pp_UInstr)(cb->used-1, &cb->instrs[cb->used-1]);
+ if (VG_(print_codegen))
+ VG_(pp_UInstr)(cb->used-1, &cb->instrs[cb->used-1]);
}
- if (dis) VG_(printf)("\n");
+ DIP("\n");
}
}
@@ -7326,5 +7086,6 @@ Int VG_(disBB) ( UCodeBlock* cb, Addr ei
}
-#undef dis
+#undef DIP
+#undef DIS
/*--------------------------------------------------------------------*/
|