mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-03 08:51:43 +00:00
[arm-fast-isel] Add support for fastcc.
Without fastcc support, the caller just falls through to CallingConv::C for fastcc, but callee still uses fastcc, this inconsistency of calling convention is a problem, and fastcc support can fix it. llvm-svn: 162013
This commit is contained in:
parent
161fc750a1
commit
767c82d4e0
@ -1821,9 +1821,12 @@ CCAssignFn *ARMFastISel::CCAssignFnForCall(CallingConv::ID CC,
|
||||
default:
|
||||
llvm_unreachable("Unsupported calling convention");
|
||||
case CallingConv::Fast:
|
||||
// Ignore fastcc. Silence compiler warnings.
|
||||
(void)RetFastCC_ARM_APCS;
|
||||
(void)FastCC_ARM_APCS;
|
||||
if (Subtarget->hasVFP2() && !isVarArg) {
|
||||
if (!Subtarget->isAAPCS_ABI())
|
||||
return (Return ? RetFastCC_ARM_APCS : FastCC_ARM_APCS);
|
||||
// For AAPCS ABI targets, just use VFP variant of the calling convention.
|
||||
return (Return ? RetCC_ARM_AAPCS_VFP : CC_ARM_AAPCS_VFP);
|
||||
}
|
||||
// Fallthrough
|
||||
case CallingConv::C:
|
||||
// Use target triple & subtarget features to do actual dispatch.
|
||||
|
@ -2,6 +2,8 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -arm-long-calls | FileCheck %s --check-prefix=ARM-LONG
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -arm-long-calls | FileCheck %s --check-prefix=THUMB-LONG
|
||||
; RUN: llc < %s -O0 -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -mattr=-vfp2 | FileCheck %s --check-prefix=ARM-NOVFP
|
||||
; RUN: llc < %s -O0 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -mattr=-vfp2 | FileCheck %s --check-prefix=THUMB-NOVFP
|
||||
|
||||
define i32 @t0(i1 zeroext %a) nounwind {
|
||||
%1 = zext i1 %a to i32
|
||||
@ -221,3 +223,67 @@ entry:
|
||||
}
|
||||
|
||||
declare i32 @CallVariadic(i32, ...)
|
||||
|
||||
; Test fastcc
|
||||
|
||||
define fastcc void @fast_callee(float %i) ssp {
|
||||
entry:
|
||||
; ARM: fast_callee
|
||||
; ARM: vmov r0, s0
|
||||
; THUMB: fast_callee
|
||||
; THUMB: vmov r0, s0
|
||||
; ARM-NOVFP: fast_callee
|
||||
; ARM-NOVFP-NOT: s0
|
||||
; THUMB-NOVFP: fast_callee
|
||||
; THUMB-NOVFP-NOT: s0
|
||||
call void @print(float %i)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @fast_caller() ssp {
|
||||
entry:
|
||||
; ARM: fast_caller
|
||||
; ARM: vldr s0,
|
||||
; THUMB: fast_caller
|
||||
; THUMB: vldr s0,
|
||||
; ARM-NOVFP: fast_caller
|
||||
; ARM-NOVFP: movw r0, #13107
|
||||
; ARM-NOVFP: movt r0, #16611
|
||||
; THUMB-NOVFP: fast_caller
|
||||
; THUMB-NOVFP: movw r0, #13107
|
||||
; THUMB-NOVFP: movt r0, #16611
|
||||
call fastcc void @fast_callee(float 0x401C666660000000)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @no_fast_callee(float %i) ssp {
|
||||
entry:
|
||||
; ARM: no_fast_callee
|
||||
; ARM: vmov s0, r0
|
||||
; THUMB: no_fast_callee
|
||||
; THUMB: vmov s0, r0
|
||||
; ARM-NOVFP: no_fast_callee
|
||||
; ARM-NOVFP-NOT: s0
|
||||
; THUMB-NOVFP: no_fast_callee
|
||||
; THUMB-NOVFP-NOT: s0
|
||||
call void @print(float %i)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @no_fast_caller() ssp {
|
||||
entry:
|
||||
; ARM: no_fast_caller
|
||||
; ARM: vmov r0, s0
|
||||
; THUMB: no_fast_caller
|
||||
; THUMB: vmov r0, s0
|
||||
; ARM-NOVFP: no_fast_caller
|
||||
; ARM-NOVFP: movw r0, #13107
|
||||
; ARM-NOVFP: movt r0, #16611
|
||||
; THUMB-NOVFP: no_fast_caller
|
||||
; THUMB-NOVFP: movw r0, #13107
|
||||
; THUMB-NOVFP: movt r0, #16611
|
||||
call void @no_fast_callee(float 0x401C666660000000)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @print(float)
|
||||
|
Loading…
Reference in New Issue
Block a user