]> granicus.if.org Git - llvm/commitdiff
[X86][Asm]Allow far jmp/call to be picked when using explicit FWORD size specifier
authorCoby Tayree <coby.tayree@intel.com>
Wed, 9 Aug 2017 15:34:55 +0000 (15:34 +0000)
committerCoby Tayree <coby.tayree@intel.com>
Wed, 9 Aug 2017 15:34:55 +0000 (15:34 +0000)
Currently, far jmp/call which utilizes a 48bit memory operand would have been invoked via the 'lcall/ljmp' mnemonic (intel style).
This patch align those variants to formal intel spec

Differential Revision: https://reviews.llvm.org/D35846

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

lib/Target/X86/X86InstrControl.td
test/MC/X86/intel-syntax.s
test/MC/X86/x86-64.s

index 4ea223e82be9cc683acdc7446138aca6c0bbca4b..8f9226cf228d6f0eb570ddb6b166bf980592e94d 100644 (file)
@@ -171,7 +171,7 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
                      "ljmp{w}\t{*}$dst", [], IIC_JMP_FAR_MEM>, OpSize16,
                    Sched<[WriteJumpLd]>;
   def FARJMP32m  : I<0xFF, MRM5m, (outs), (ins opaque48mem:$dst),
-                     "ljmp{l}\t{*}$dst", [], IIC_JMP_FAR_MEM>, OpSize32,
+                     "{l}jmp{l}\t{*}$dst", [], IIC_JMP_FAR_MEM>, OpSize32,
                    Sched<[WriteJumpLd]>;
 }
 
@@ -233,7 +233,7 @@ let isCall = 1 in
                         "lcall{w}\t{*}$dst", [], IIC_CALL_FAR_MEM>, OpSize16,
                       Sched<[WriteJumpLd]>;
     def FARCALL32m  : I<0xFF, MRM3m, (outs), (ins opaque48mem:$dst),
-                        "lcall{l}\t{*}$dst", [], IIC_CALL_FAR_MEM>, OpSize32,
+                        "{l}call{l}\t{*}$dst", [], IIC_CALL_FAR_MEM>, OpSize32,
                       Sched<[WriteJumpLd]>;
   }
 
index e52255f8889120fa2190e7a3279a8032008acd2f..d4a69337c6881aa905efcadfde91f9aa34ac04b5 100644 (file)
@@ -50,6 +50,15 @@ main:
 // CHECK: leaq    8(%rax), %rdx
   lea RDX, [8 + RAX]
 
+// CHECK: lcalll *(%rax)
+  call FWORD ptr [rax]
+// CHECK: lcalll *(%rax)
+  lcall [rax]
+// CHECK: ljmpl *(%rax)
+  jmp FWORD ptr [rax]
+// CHECK: ljmpl *(%rax)
+  ljmp [rax]
+
 // CHECK:      movl    $257, -4(%rsp)
        mov     DWORD PTR [RSP - 4], 257
 // CHECK:      movl    $258, 4(%rsp)
index 8612b9974f75547428b375d063a5ae1c37b3368b..3d7ab87f5eacdf7e8609cce943b398bdac4a6dea 100644 (file)
@@ -394,11 +394,14 @@ shrd  %cl, %bx, (%rax)
 sldt   %ecx
 sldt   %cx
 
-// CHECK: lcalll       *3135175374 
-// CHECK: ljmpl        *3135175374
-lcall  *0xbadeface
-ljmp   *0xbadeface
-
+// CHECK: lcalll *3135175374 
+// CHECK: ljmpl  *3135175374
+// CHECK: lcalll *(%rax)
+// CHECK: ljmpl *(%rax)
+lcall  *0xbadeface
+ljmp *0xbadeface
+lcall *(%rax)
+ljmpl *(%rax)
 
 // rdar://8444631
 // CHECK: enter        $31438, $0