Index: src/ia32/disasm-ia32.cc |
=================================================================== |
--- src/ia32/disasm-ia32.cc (revision 9327) |
+++ src/ia32/disasm-ia32.cc (working copy) |
@@ -55,6 +55,7 @@ |
static const ByteMnemonic two_operands_instr[] = { |
+ {0x01, "add", OPER_REG_OP_ORDER}, |
{0x03, "add", REG_OPER_OP_ORDER}, |
{0x09, "or", OPER_REG_OP_ORDER}, |
{0x0B, "or", REG_OPER_OP_ORDER}, |
@@ -117,6 +118,19 @@ |
}; |
+// Generally we don't want to generate these because they are subject to partial |
+// register stalls. They are included for completeness and because the cmp |
+// variant is used by the RecordWrite stub. Because it does not update the |
+// register it is not subject to partial register stalls. |
+static ByteMnemonic byte_immediate_instr[] = { |
+ {0x0c, "or", UNSET_OP_ORDER}, |
+ {0x24, "and", UNSET_OP_ORDER}, |
+ {0x34, "xor", UNSET_OP_ORDER}, |
+ {0x3c, "cmp", UNSET_OP_ORDER}, |
+ {-1, "", UNSET_OP_ORDER} |
+}; |
+ |
+ |
static const char* const jump_conditional_mnem[] = { |
/*0*/ "jo", "jno", "jc", "jnc", |
/*4*/ "jz", "jnz", "jna", "ja", |
@@ -149,7 +163,8 @@ |
REGISTER_INSTR, |
MOVE_REG_INSTR, |
CALL_JUMP_INSTR, |
- SHORT_IMMEDIATE_INSTR |
+ SHORT_IMMEDIATE_INSTR, |
+ BYTE_IMMEDIATE_INSTR |
}; |
@@ -198,6 +213,7 @@ |
CopyTable(zero_operands_instr, ZERO_OPERANDS_INSTR); |
CopyTable(call_jump_instr, CALL_JUMP_INSTR); |
CopyTable(short_immediate_instr, SHORT_IMMEDIATE_INSTR); |
+ CopyTable(byte_immediate_instr, BYTE_IMMEDIATE_INSTR); |
AddJumpConditionalShort(); |
SetTableRange(REGISTER_INSTR, 0x40, 0x47, "inc"); |
SetTableRange(REGISTER_INSTR, 0x48, 0x4F, "dec"); |
@@ -912,6 +928,12 @@ |
break; |
} |
+ case BYTE_IMMEDIATE_INSTR: { |
+ AppendToBuffer("%s al, 0x%x", idesc.mnem, data[1]); |
+ data += 2; |
+ break; |
+ } |
+ |
case NO_INSTR: |
processed = false; |
break; |
@@ -1346,11 +1368,6 @@ |
data += 2; |
break; |
- case 0x2C: |
- AppendToBuffer("subb eax,0x%x", *reinterpret_cast<uint8_t*>(data+1)); |
- data += 2; |
- break; |
- |
case 0xA9: |
AppendToBuffer("test eax,0x%x", *reinterpret_cast<int32_t*>(data+1)); |
data += 5; |