forked from OSchip/llvm-project
142 lines
5.1 KiB
LLVM
142 lines
5.1 KiB
LLVM
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s
|
|
|
|
; Paramater Save Area is not needed if number of parameter does not exceed
|
|
; number of registers
|
|
; ------------------------------------------------------------------------------
|
|
|
|
; Max number of GPR is 8
|
|
define linkonce_odr void
|
|
@WithoutParamArea(i8* %a, i32 signext %b) align 2 {
|
|
entry:
|
|
call fastcc void @fastccFunc(i32 signext 1)
|
|
ret void
|
|
|
|
; CHECK-LABEL: WithoutParamArea
|
|
; CHECK: stdu 1, -32(1)
|
|
; CHECK: blr
|
|
}
|
|
declare fastcc void @fastccFunc(i32 signext %level) unnamed_addr
|
|
|
|
; No need for Parameter Save Area if only 8 GPRs is needed.
|
|
define linkonce_odr void @WithoutParamArea2(i8* %a, i32 signext %b) align 2 {
|
|
entry:
|
|
call fastcc void @eightArgs(i32 signext 1, i32 signext 2, i32 signext 3,
|
|
i32 signext 4, i32 signext 5, i32 signext 6,
|
|
i32 signext 7, i32 signext 8)
|
|
ret void
|
|
|
|
; CHECK-LABEL: WithoutParamArea2
|
|
; CHECK: stdu 1, -32(1)
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fastcc void
|
|
@eightArgs(i32 signext %level, i32 signext %level2, i32 signext %level3,
|
|
i32 signext %level4, i32 signext %level5, i32 signext %level6,
|
|
i32 signext %level7, i32 signext %level8) unnamed_addr
|
|
|
|
; No need for Parameter Save Area for calls that utiliizes 8 GPR and 2 FPR.
|
|
define linkonce_odr void @WithoutParamArea3(i8* %a, i32 signext %b) align 2 {
|
|
entry:
|
|
call fastcc void
|
|
@mixedArgs(i32 signext 1, float 1.0, i32 signext 2, float 2.0,
|
|
i32 signext 3, i32 signext 4, i32 signext 5, i32 signext 6,
|
|
i32 signext 7, i32 signext 8) ret void
|
|
ret void
|
|
|
|
; CHECK-LABEL: WithoutParamArea3
|
|
; CHECK: stdu 1, -32(1)
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fastcc void
|
|
@mixedArgs(i32 signext %level, float %levelf1, i32 signext %level2,
|
|
float %levelf2, i32 signext %level3, i32 signext %level4,
|
|
i32 signext %level5, i32 signext %level6, i32 signext %level7,
|
|
i32 signext %level8) unnamed_addr
|
|
|
|
; Pass by value usage requiring less GPR then available
|
|
%"myClass::Mem" = type { i8, i8, i16, i32, i32, i32, i64 }
|
|
|
|
define internal fastcc void @CallPassByValue(%"myClass::Mem"* %E) align 2 {
|
|
entry:
|
|
call fastcc void @PassByValue(%"myClass::Mem"* byval(%"myClass::Mem") nonnull align 8 undef);
|
|
ret void
|
|
|
|
; CHECK-LABEL: PassByValue
|
|
; CHECK: stdu 1, -32(1)
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare dso_local fastcc void
|
|
@PassByValue(%"myClass::Mem"* byval(%"myClass::Mem") nocapture readonly align 8) align 2
|
|
|
|
; Verify Paramater Save Area is allocated if parameter exceed the number that
|
|
; can be passed via registers
|
|
; ------------------------------------------------------------------------------
|
|
|
|
; Max number of GPR is 8
|
|
define linkonce_odr void @WithParamArea(i8 * %a, i32 signext %b) align 2 {
|
|
entry:
|
|
call fastcc void @nineArgs(i32 signext 1, i32 signext 2, i32 signext 3,
|
|
i32 signext 4, i32 signext 5, i32 signext 6,
|
|
i32 signext 7, i32 signext 8, i32 signext 9)
|
|
ret void
|
|
|
|
; CHECK-LABEL: WithParamArea
|
|
; CHECK: stdu 1, -96(1)
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fastcc void @nineArgs(i32 signext %level, i32 signext %level2,
|
|
i32 signext %level3, i32 signext %level4, i32 signext %level5,
|
|
i32 signext %level6, i32 signext %level7, i32 signext %level8,
|
|
i32 signext %level9) unnamed_addr
|
|
|
|
; Max number of FPR for parameter passing is 13
|
|
define linkonce_odr void @WithParamArea2(i8* %a, i32 signext %b) align 2 {
|
|
entry:
|
|
call fastcc void @funcW14FloatArgs(float 1.0, float 2.0, float 3.0,
|
|
float 4.0, float 5.0, float 6.0, float 7.0, float 8.0, float 1.0,
|
|
float 2.0, float 3.0, float 4.0, float 5.0, float 14.0)
|
|
ret void
|
|
|
|
; CHECK-LABEL: WithParamArea2
|
|
; CHECK: stdu 1, -96(1)
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare fastcc void
|
|
@funcW14FloatArgs(float %level, float %level2, float %level3,
|
|
float %level4, float %level5, float %level6,
|
|
float %level7, float %level8, float %level9,
|
|
float %level10, float %level11, float %level12,
|
|
float %level13, float %level14);
|
|
|
|
|
|
; Pass by value usage requires more GPR then available
|
|
%"myClass::MemA" = type { i8, i8, i16, i32, i32, i32, i64 }
|
|
%"myClass::MemB" = type { i32*, i32, i32, %"myClass::MemB"** }
|
|
%"myClass::MemC" = type { %"myClass::MemD"*, %"myClass::MemC"*, i64 }
|
|
%"myClass::MemD" = type { %"myClass::MemB"*, %"myClass::MemC"*, i8, i8, i16,
|
|
i32 }
|
|
%"myStruct::MemF" = type { i32, %"myClass::MemA"*, %"myClass::MemA"*, i64, i64 }
|
|
%"myClass::MemK" = type { i32, %"myClass::MemD"*, %"myClass::MemD"*, i64, i32,
|
|
i64, i8, i32, %"myStruct::MemF",
|
|
i8, %"myClass::MemA"* }
|
|
|
|
define internal fastcc void @AggMemExprEmitter(%"myClass::MemK"* %E) align 2 {
|
|
entry:
|
|
call fastcc void @MemExprEmitterInitialization(%"myClass::MemK"*
|
|
byval(%"myClass::MemK") nonnull align 8 undef);
|
|
ret void
|
|
|
|
; CHECK-LABEL: AggMemExprEmitter
|
|
; CHECK: stdu 1, -144(1)
|
|
; CHECK: blr
|
|
}
|
|
|
|
declare dso_local fastcc void
|
|
@MemExprEmitterInitialization(%"myClass::MemK"*
|
|
byval(%"myClass::MemK") nocapture readonly align 8) align 2
|