281 lines
5.7 KiB
NASM
281 lines
5.7 KiB
NASM
; RUN: llvm-ml -m64 -filetype=s %s /Fo - | FileCheck %s --check-prefixes=CHECK-64,CHECK
|
|
; RUN: llvm-ml -m32 -filetype=s %s /Fo - | FileCheck %s --check-prefixes=CHECK-32,CHECK
|
|
|
|
ifdef rax
|
|
extern fn_ref_extern : qword
|
|
else
|
|
extern fn_ref_extern : dword
|
|
endif
|
|
|
|
extern fn_proc_extern : proc
|
|
extern fn_ref_extern_word : word
|
|
|
|
.data
|
|
|
|
ifdef rax
|
|
fn_ref qword 1
|
|
else
|
|
fn_ref dword 1
|
|
endif
|
|
|
|
fn_ref_word word 2
|
|
fn PROC
|
|
|
|
BranchTargetStruc struc
|
|
member0 dword ?
|
|
ifdef rax
|
|
member1 dword ?
|
|
endif
|
|
BranchTargetStruc ends
|
|
|
|
|
|
ifdef rax
|
|
fn_ref_struc BranchTargetStruc {3, 3}
|
|
else
|
|
fn_ref_struc BranchTargetStruc {3}
|
|
endif
|
|
|
|
.code
|
|
|
|
t0:
|
|
call fn_ref
|
|
jmp fn_ref
|
|
; CHECK-LABEL: t0:
|
|
; CHECK-64: call qword ptr [rip + fn_ref]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref]
|
|
; CHECK-32: call dword ptr [fn_ref]
|
|
; CHECK-32: jmp dword ptr [fn_ref]
|
|
|
|
t1:
|
|
call [fn_ref]
|
|
jmp [fn_ref]
|
|
; CHECK-LABEL: t1:
|
|
; CHECK-64: call qword ptr [rip + fn_ref]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref]
|
|
; CHECK-32: call dword ptr [fn_ref]
|
|
; CHECK-32: jmp dword ptr [fn_ref]
|
|
|
|
ifdef rax
|
|
t2:
|
|
call qword ptr [fn_ref]
|
|
jmp qword ptr [fn_ref]
|
|
; CHECK-64-LABEL: t2:
|
|
; CHECK-64: call qword ptr [rip + fn_ref]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref]
|
|
else
|
|
t2:
|
|
call dword ptr [fn_ref]
|
|
jmp dword ptr [fn_ref]
|
|
; CHECK-32-LABEL: t2:
|
|
; CHECK-32: call dword ptr [fn_ref]
|
|
; CHECK-32: jmp dword ptr [fn_ref]
|
|
|
|
t3:
|
|
call fn_ref_word
|
|
jmp fn_ref_word
|
|
; CHECK-32-LABEL: t3:
|
|
; CHECK-32: call word ptr [fn_ref_word]
|
|
; CHECK-32-NEXT: jmp word ptr [fn_ref_word]
|
|
|
|
t4:
|
|
call [fn_ref_word]
|
|
jmp [fn_ref_word]
|
|
; CHECK-32-LABEL: t4:
|
|
; CHECK-32: call word ptr [fn_ref_word]
|
|
; CHECK-32-NEXT: jmp word ptr [fn_ref_word]
|
|
|
|
t5:
|
|
call word ptr [fn_ref_word]
|
|
jmp word ptr [fn_ref_word]
|
|
; CHECK-32-LABEL: t5:
|
|
; CHECK-32: call word ptr [fn_ref_word]
|
|
; CHECK-32-NEXT: jmp word ptr [fn_ref_word]
|
|
endif
|
|
|
|
t6:
|
|
call t6
|
|
jmp t6
|
|
; CHECK-LABEL: t6:
|
|
; CHECK: call t6
|
|
; CHECK-NEXT: jmp t6
|
|
|
|
t7:
|
|
call [t7]
|
|
jmp [t7]
|
|
; CHECK-LABEL: t7:
|
|
; CHECK: call t7
|
|
; CHECK-NEXT: jmp t7
|
|
|
|
ifdef rax
|
|
t8:
|
|
call qword ptr [t8]
|
|
jmp qword ptr [t8]
|
|
; CHECK-64-LABEL: t8:
|
|
; CHECK-64: call qword ptr [rip + t8]
|
|
; CHECK-64-NEXT: jmp qword ptr [rip + t8]
|
|
else
|
|
t8:
|
|
call dword ptr [t8]
|
|
jmp dword ptr [t8]
|
|
; CHECK-32-LABEL: t8:
|
|
; CHECK-32: call dword ptr [t8]
|
|
; CHECK-32-NEXT: jmp dword ptr [t8]
|
|
endif
|
|
|
|
t9:
|
|
call fn
|
|
jmp fn
|
|
; CHECK-LABEL: t9:
|
|
; CHECK: call fn
|
|
; CHECK-NEXT: jmp fn
|
|
|
|
t10:
|
|
call [fn]
|
|
jmp [fn]
|
|
; CHECK-LABEL: t10:
|
|
; CHECK: call fn
|
|
; CHECK-NEXT: jmp fn
|
|
|
|
ifdef rax
|
|
t11:
|
|
call qword ptr [fn]
|
|
jmp qword ptr [fn]
|
|
; CHECK-64-LABEL: t11:
|
|
; CHECK-64: call qword ptr [rip + fn]
|
|
; CHECK-64-NEXT: jmp qword ptr [rip + fn]
|
|
else
|
|
t11:
|
|
call dword ptr [fn]
|
|
jmp dword ptr [fn]
|
|
; CHECK-32-LABEL: t11:
|
|
; CHECK-32: call dword ptr [fn]
|
|
; CHECK-32-NEXT: jmp dword ptr [fn]
|
|
endif
|
|
|
|
t12:
|
|
call fn_ref_struc
|
|
jmp fn_ref_struc
|
|
; CHECK-LABEL: t12:
|
|
; CHECK-64: call qword ptr [rip + fn_ref_struc]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref_struc]
|
|
; CHECK-32: call dword ptr [fn_ref_struc]
|
|
; CHECK-32: jmp dword ptr [fn_ref_struc]
|
|
|
|
t13:
|
|
call [fn_ref_struc]
|
|
jmp [fn_ref_struc]
|
|
; CHECK-LABEL: t13:
|
|
; CHECK-64: call qword ptr [rip + fn_ref_struc]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref_struc]
|
|
; CHECK-32: call dword ptr [fn_ref_struc]
|
|
; CHECK-32: jmp dword ptr [fn_ref_struc]
|
|
|
|
ifdef rax
|
|
t14:
|
|
call qword ptr [fn_ref_struc]
|
|
jmp qword ptr [fn_ref_struc]
|
|
; CHECK-64-LABEL: t14:
|
|
; CHECK-64: call qword ptr [rip + fn_ref_struc]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref_struc]
|
|
else
|
|
t14:
|
|
call dword ptr [fn_ref_struc]
|
|
jmp dword ptr [fn_ref_struc]
|
|
; CHECK-32-LABEL: t14:
|
|
; CHECK-32: call dword ptr [fn_ref_struc]
|
|
; CHECK-32: jmp dword ptr [fn_ref_struc]
|
|
endif
|
|
|
|
t15:
|
|
je t15
|
|
; CHECK-LABEL: t15:
|
|
; CHECK: je t15
|
|
|
|
t16:
|
|
je [t16];
|
|
; CHECK-LABEL: t16:
|
|
; CHECK: je t16
|
|
|
|
t17:
|
|
call fn_ref_extern
|
|
jmp fn_ref_extern
|
|
; CHECK-LABEL: t17:
|
|
; CHECK-64: call qword ptr [rip + fn_ref_extern]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
|
|
; CHECK-32: call dword ptr [fn_ref_extern]
|
|
; CHECK-32: jmp dword ptr [fn_ref_extern]
|
|
|
|
t18:
|
|
call [fn_ref_extern]
|
|
jmp [fn_ref_extern]
|
|
; CHECK-LABEL: t18:
|
|
; CHECK-64: call qword ptr [rip + fn_ref_extern]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
|
|
; CHECK-32: call dword ptr [fn_ref_extern]
|
|
; CHECK-32: jmp dword ptr [fn_ref_extern]
|
|
|
|
ifdef rax
|
|
t19:
|
|
call qword ptr [fn_ref_extern]
|
|
jmp qword ptr [fn_ref_extern]
|
|
; CHECK-64-LABEL: t19:
|
|
; CHECK-64: call qword ptr [rip + fn_ref_extern]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
|
|
else
|
|
t19:
|
|
call dword ptr [fn_ref_extern]
|
|
jmp dword ptr [fn_ref_extern]
|
|
; CHECK-32-LABEL: t19:
|
|
; CHECK-32: call dword ptr [fn_ref_extern]
|
|
; CHECK-32: jmp dword ptr [fn_ref_extern]
|
|
|
|
t20:
|
|
call fn_ref_extern_word
|
|
jmp fn_ref_extern_word
|
|
; CHECK-32-LABEL: t20:
|
|
; CHECK-32: call word ptr [fn_ref_extern_word]
|
|
; CHECK-32-NEXT: jmp word ptr [fn_ref_extern_word]
|
|
|
|
t21:
|
|
call [fn_ref_extern_word]
|
|
jmp [fn_ref_extern_word]
|
|
; CHECK-32-LABEL: t21:
|
|
; CHECK-32: call word ptr [fn_ref_extern_word]
|
|
; CHECK-32-NEXT: jmp word ptr [fn_ref_extern_word]
|
|
|
|
t22:
|
|
call word ptr [fn_ref_extern_word]
|
|
jmp word ptr [fn_ref_extern_word]
|
|
; CHECK-32-LABEL: t22:
|
|
; CHECK-32: call word ptr [fn_ref_extern_word]
|
|
; CHECK-32-NEXT: jmp word ptr [fn_ref_extern_word]
|
|
endif
|
|
|
|
t23:
|
|
call fn_proc_extern
|
|
jmp fn_proc_extern
|
|
; CHECK-LABEL: t23:
|
|
; CHECK: call fn_proc_extern
|
|
|
|
t24:
|
|
call [fn_proc_extern]
|
|
jmp [fn_proc_extern]
|
|
; CHECK-LABEL: t24:
|
|
; CHECK: call fn_proc_extern
|
|
|
|
t25:
|
|
; CHECK-LABEL: t25:
|
|
ifdef rax
|
|
call qword ptr [fn_ref_extern]
|
|
jmp qword ptr [fn_ref_extern]
|
|
; CHECK-64: call qword ptr [rip + fn_ref_extern]
|
|
; CHECK-64: jmp qword ptr [rip + fn_ref_extern]
|
|
else
|
|
call dword ptr [fn_ref_extern]
|
|
jmp dword ptr [fn_ref_extern]
|
|
; CHECK-32: call dword ptr [fn_ref_extern]
|
|
; CHECK-32: jmp dword ptr [fn_ref_extern]
|
|
endif
|
|
|
|
end
|