[X86]: Correctly sign-extend 16-bit immediate in CALL instruction.
authorDouglas Katzman <dougk@google.com>
Fri, 26 Jun 2015 16:58:59 +0000 (16:58 +0000)
committerDouglas Katzman <dougk@google.com>
Fri, 26 Jun 2015 16:58:59 +0000 (16:58 +0000)
Patch by Matthew Barney. Thanks!

Differential Revision: http://reviews.llvm.org/D9514

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240795 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/Disassembler/X86Disassembler.cpp
test/MC/Disassembler/X86/x86-16.txt
test/MC/Disassembler/X86/x86-32.txt
test/MC/Disassembler/X86/x86-64.txt

index 6e99c37c2bc7df95d47fb83e5ecbf33175b6d0f5..cfc3ee2fb08fe67d95b0e1e167424589892af441 100644 (file)
@@ -551,9 +551,15 @@ static void translateImmediate(MCInst &mcInst, uint64_t immediate,
   case TYPE_REL8:
     isBranch = true;
     pcrel = insn.startLocation + insn.immediateOffset + insn.immediateSize;
-    if(immediate & 0x80)
+    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;
index c6844cd3cef448aca8892b6f928fae85533bec5f..021cb2371812b2800df993cb15eec1caa9caec88 100644 (file)
 # CHECK: lretl
 0x66 0xcb
 
+# CHECK: callw -1
+0xe8 0xff 0xff
index 830b830663024042031c1c21560b89746c5ff84a..c51e0a3dc379841c52400f29f18a8b13b8d6320b 100644 (file)
@@ -54,6 +54,9 @@
 # CHECK: calll -1234
 0xe8 0x2e 0xfb 0xff 0xff
 
+# CHECK: callw -1
+0x66 0xe8 0xff 0xff
+
 # CHECK: lfence
 0x0f 0xae 0xe8
 
index 5699f40d2d331fe7b39082f9a9d9d3119b20673e..065b2a57c844e279620be39149298acdcd2cca1b 100644 (file)
 # CHECK: vaddps (%rdx,%xmm1), %zmm20, %zmm15
 # FIXME: vaddps (%rdx,%rcx), %zmm20, %zmm15
 0x62 0x71 0x5c 0x40 0x58 0x3c 0x0a
+
+# CHECK: callq 32767
+0xe8 0xff 0x7f 0x00 0x00
+
+# CHECK: callq -32769
+0xe8 0xff 0x7f 0xff 0xff