From 3638655325839ade51b6c7b3a4c48dd0ae772128 Mon Sep 17 00:00:00 2001 From: Coby Tayree Date: Wed, 9 Aug 2017 15:34:55 +0000 Subject: [PATCH] [X86][Asm]Allow far jmp/call to be picked when using explicit FWORD size specifier 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 llvm-svn: 310485 --- llvm/lib/Target/X86/X86InstrControl.td | 4 ++-- llvm/test/MC/X86/intel-syntax.s | 9 +++++++++ llvm/test/MC/X86/x86-64.s | 13 ++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/X86/X86InstrControl.td b/llvm/lib/Target/X86/X86InstrControl.td index 4ea223e..8f9226c 100644 --- a/llvm/lib/Target/X86/X86InstrControl.td +++ b/llvm/lib/Target/X86/X86InstrControl.td @@ -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]>; } diff --git a/llvm/test/MC/X86/intel-syntax.s b/llvm/test/MC/X86/intel-syntax.s index e52255f..d4a6933 100644 --- a/llvm/test/MC/X86/intel-syntax.s +++ b/llvm/test/MC/X86/intel-syntax.s @@ -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) diff --git a/llvm/test/MC/X86/x86-64.s b/llvm/test/MC/X86/x86-64.s index 8612b99..3d7ab87 100644 --- a/llvm/test/MC/X86/x86-64.s +++ b/llvm/test/MC/X86/x86-64.s @@ -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 -- 2.7.4