diff options
author | Craig Topper <craig.topper@gmail.com> | 2017-01-16 06:49:09 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@gmail.com> | 2017-01-16 06:49:09 +0000 |
commit | fba613e407d5f6e1d468bd511c881c5785bc7da7 (patch) | |
tree | 60c4b827d84588dd2248c46da50c554ef112f0bb /llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp | |
parent | ad944a1cac1476ae17c8723f3f6821a66d43fb1d (diff) | |
download | llvm-fba613e407d5f6e1d468bd511c881c5785bc7da7.zip llvm-fba613e407d5f6e1d468bd511c881c5785bc7da7.tar.gz llvm-fba613e407d5f6e1d468bd511c881c5785bc7da7.tar.bz2 |
[X86] Merge the disassemblers handling of the different TYPE_RELs by getting the size information from the ENCODING field. NFCI
llvm-svn: 292096
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp')
-rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp index d5c00f5..36ad23b 100644 --- a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp +++ b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp @@ -368,27 +368,45 @@ static void translateImmediate(MCInst &mcInst, uint64_t immediate, bool isBranch = false; uint64_t pcrel = 0; - if (type == TYPE_RELv) { + if (type == TYPE_REL) { isBranch = true; pcrel = insn.startLocation + insn.immediateOffset + insn.immediateSize; - switch (insn.displacementSize) { + switch (operand.encoding) { default: break; - case 1: + case ENCODING_Iv: + switch (insn.displacementSize) { + default: + break; + case 1: + if(immediate & 0x80) + immediate |= ~(0xffull); + break; + case 2: + if(immediate & 0x8000) + immediate |= ~(0xffffull); + break; + case 4: + if(immediate & 0x80000000) + immediate |= ~(0xffffffffull); + break; + case 8: + break; + } + break; + case ENCODING_IB: if(immediate & 0x80) immediate |= ~(0xffull); break; - case 2: + case ENCODING_IW: if(immediate & 0x8000) immediate |= ~(0xffffull); break; - case 4: + case ENCODING_ID: if(immediate & 0x80000000) immediate |= ~(0xffffffffull); break; - case 8: - break; } } // By default sign-extend all X86 immediates based on their encoding. @@ -630,25 +648,6 @@ static void translateImmediate(MCInst &mcInst, uint64_t immediate, return; case TYPE_BNDR: mcInst.addOperand(MCOperand::createReg(X86::BND0 + (immediate >> 4))); - case TYPE_REL8: - isBranch = true; - pcrel = insn.startLocation + insn.immediateOffset + insn.immediateSize; - if (immediate & 0x80) - immediate |= ~(0xffull); - break; - case TYPE_REL16: - isBranch = true; - pcrel = insn.startLocation + insn.immediateOffset + insn.immediateSize; - if (immediate & 0x8000) - immediate |= ~(0xffffull); - break; - case TYPE_REL32: - case TYPE_REL64: - isBranch = true; - pcrel = insn.startLocation + insn.immediateOffset + insn.immediateSize; - if(immediate & 0x80000000) - immediate |= ~(0xffffffffull); - break; default: // operand is 64 bits wide. Do nothing. break; |