blob: a88d7b8b466a929b4d575e831fd78833523fb31f [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s
; Tail call through addrspace(270) (__ptr32 __sptr) function pointer.
; The callee should be sign-extended from i32 to i64.
define i32 @tailcall_sptr(ptr addrspace(270) %fptr, i32 %arg) {
; CHECK-LABEL: tailcall_sptr:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movslq %edi, %rax
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: jmpq *%rax # TAILCALL
entry:
%call = tail call addrspace(270) i32 %fptr(i32 %arg)
ret i32 %call
}
; Tail call through addrspace(271) (__ptr32 __uptr) function pointer.
; The callee should be zero-extended from i32 to i64.
define i32 @tailcall_uptr(ptr addrspace(271) %fptr, i32 %arg) {
; CHECK-LABEL: tailcall_uptr:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: jmpq *%rax # TAILCALL
entry:
%call = tail call addrspace(271) i32 %fptr(i32 %arg)
ret i32 %call
}
; Non-tail call through addrspace(270) (__ptr32 __sptr) function pointer.
define i32 @call_sptr(ptr addrspace(270) %fptr, i32 %arg) {
; CHECK-LABEL: call_sptr:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: movslq %edi, %rax
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: callq *%rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
entry:
%call = call addrspace(270) i32 %fptr(i32 %arg)
ret i32 %call
}
; Non-tail call through addrspace(271) (__ptr32 __uptr) function pointer.
define i32 @call_uptr(ptr addrspace(271) %fptr, i32 %arg) {
; CHECK-LABEL: call_uptr:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: callq *%rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
entry:
%call = call addrspace(271) i32 %fptr(i32 %arg)
ret i32 %call
}