Remove special FP opcode maps and instead add enough MRM_XX formats to handle all the FP operations. This increases format by 1 bit, but decreases opcode map by 1 bit so the TSFlags size doesn't change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201649 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Craig Topper
2014-02-19 08:25:02 +00:00
parent 52fb0a59d0
commit fa0cf99585
7 changed files with 207 additions and 225 deletions

View File

@@ -46,10 +46,34 @@ using namespace llvm;
MAP(DE, 52) \
MAP(DF, 53) \
MAP(E0, 54) \
MAP(E8, 55) \
MAP(F0, 56) \
MAP(F8, 57) \
MAP(F9, 58)
MAP(E1, 55) \
MAP(E2, 56) \
MAP(E3, 57) \
MAP(E4, 58) \
MAP(E5, 59) \
MAP(E8, 60) \
MAP(E9, 61) \
MAP(EA, 62) \
MAP(EB, 63) \
MAP(EC, 64) \
MAP(ED, 65) \
MAP(EE, 66) \
MAP(F0, 67) \
MAP(F1, 68) \
MAP(F2, 69) \
MAP(F3, 70) \
MAP(F4, 71) \
MAP(F5, 72) \
MAP(F6, 73) \
MAP(F7, 74) \
MAP(F8, 75) \
MAP(F9, 76) \
MAP(FA, 77) \
MAP(FB, 78) \
MAP(FC, 79) \
MAP(FD, 80) \
MAP(FE, 81) \
MAP(FF, 82)
// A clone of X86 since we can't depend on something that is generated.
namespace X86Local {
@@ -79,9 +103,7 @@ namespace X86Local {
};
enum {
OB = 0, TB = 1, T8 = 2, TA = 3, XOP8 = 4, XOP9 = 5, XOPA = 6,
D8 = 7, D9 = 8, DA = 9, DB = 10,
DC = 11, DD = 12, DE = 13, DF = 14
OB = 0, TB = 1, T8 = 2, TA = 3, XOP8 = 4, XOP9 = 5, XOPA = 6
};
enum {
@@ -732,32 +754,23 @@ void RecognizableInstr::emitInstructionSpecifier() {
HANDLE_OPERAND(relocation)
}
break;
case X86Local::MRM_C0:
case X86Local::MRM_C1:
case X86Local::MRM_C2:
case X86Local::MRM_C3:
case X86Local::MRM_C4:
case X86Local::MRM_C8:
case X86Local::MRM_C9:
case X86Local::MRM_CA:
case X86Local::MRM_CB:
case X86Local::MRM_E8:
case X86Local::MRM_F0:
case X86Local::MRM_F9:
case X86Local::MRM_D0:
case X86Local::MRM_D1:
case X86Local::MRM_D4:
case X86Local::MRM_D5:
case X86Local::MRM_D6:
case X86Local::MRM_D8:
case X86Local::MRM_D9:
case X86Local::MRM_DA:
case X86Local::MRM_DB:
case X86Local::MRM_DC:
case X86Local::MRM_DD:
case X86Local::MRM_DE:
case X86Local::MRM_DF:
case X86Local::MRM_E0:
case X86Local::MRM_C0: case X86Local::MRM_C1: case X86Local::MRM_C2:
case X86Local::MRM_C3: case X86Local::MRM_C4: case X86Local::MRM_C8:
case X86Local::MRM_C9: case X86Local::MRM_CA: case X86Local::MRM_CB:
case X86Local::MRM_D0: case X86Local::MRM_D1: case X86Local::MRM_D4:
case X86Local::MRM_D5: case X86Local::MRM_D6: case X86Local::MRM_D8:
case X86Local::MRM_D9: case X86Local::MRM_DA: case X86Local::MRM_DB:
case X86Local::MRM_DC: case X86Local::MRM_DD: case X86Local::MRM_DE:
case X86Local::MRM_DF: case X86Local::MRM_E0: case X86Local::MRM_E1:
case X86Local::MRM_E2: case X86Local::MRM_E3: case X86Local::MRM_E4:
case X86Local::MRM_E5: case X86Local::MRM_E8: case X86Local::MRM_E9:
case X86Local::MRM_EA: case X86Local::MRM_EB: case X86Local::MRM_EC:
case X86Local::MRM_ED: case X86Local::MRM_EE: case X86Local::MRM_F0:
case X86Local::MRM_F1: case X86Local::MRM_F2: case X86Local::MRM_F3:
case X86Local::MRM_F4: case X86Local::MRM_F5: case X86Local::MRM_F6:
case X86Local::MRM_F7: case X86Local::MRM_F9: case X86Local::MRM_FA:
case X86Local::MRM_FB: case X86Local::MRM_FC: case X86Local::MRM_FD:
case X86Local::MRM_FE: case X86Local::MRM_FF:
// Ignored.
break;
}
@@ -825,20 +838,6 @@ void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const {
opcodeToSet = Opcode;
break;
case X86Local::D8:
case X86Local::D9:
case X86Local::DA:
case X86Local::DB:
case X86Local::DC:
case X86Local::DD:
case X86Local::DE:
case X86Local::DF:
assert(Opcode >= 0xc0 && "Unexpected opcode for an escape opcode");
assert(Form == X86Local::RawFrm);
opcodeType = ONEBYTE;
filter = new ExactFilter(Opcode);
opcodeToSet = 0xd8 + (OpMap - X86Local::D8);
break;
} // switch (OpMap)
assert(opcodeType != (OpcodeType)-1 &&