; 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