mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
50bbc2de6d
The REX prefix should be used on indirect jmps, but not direct ones. For direct jumps, the unwinder looks at the offset to determine if it's inside the current function. Differential Revision: https://reviews.llvm.org/D24359 llvm-svn: 281003
37 lines
827 B
LLVM
37 lines
827 B
LLVM
; RUN: llc -mtriple=x86_64-windows -show-mc-encoding < %s | FileCheck %s
|
|
|
|
; The Win64 ABI wants tail jmps to use a REX_W prefix so it can distinguish
|
|
; in-function jumps from function exiting jumps.
|
|
|
|
define void @tail_jmp_reg(i32, i32, void ()* %fptr) {
|
|
tail call void () %fptr()
|
|
ret void
|
|
}
|
|
|
|
; Check that we merge the REX prefixes into 0x49 instead of 0x48, 0x41.
|
|
|
|
; CHECK-LABEL: tail_jmp_reg:
|
|
; CHECK: rex64 jmpq *%r8
|
|
; CHECK: encoding: [0x49,0xff,0xe0]
|
|
|
|
declare void @tail_tgt()
|
|
|
|
define void @tail_jmp_imm() {
|
|
tail call void @tail_tgt()
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: tail_jmp_imm:
|
|
; CHECK: jmp tail_tgt
|
|
|
|
@g_fptr = global void ()* @tail_tgt
|
|
|
|
define void @tail_jmp_mem() {
|
|
%fptr = load void ()*, void ()** @g_fptr
|
|
tail call void () %fptr()
|
|
ret void
|
|
}
|
|
|
|
; CHECK-LABEL: tail_jmp_mem:
|
|
; CHECK: rex64 jmpq *g_fptr(%rip)
|