142 lines · plain
1; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu < %s | FileCheck %s2 3; Paramater Save Area is not needed if number of parameter does not exceed4; number of registers5; ------------------------------------------------------------------------------6 7; Max number of GPR is 88define linkonce_odr void9 @WithoutParamArea(ptr %a, i32 signext %b) align 2 {10entry:11 call fastcc void @fastccFunc(i32 signext 1)12 ret void13 14; CHECK-LABEL: WithoutParamArea15; CHECK: stdu 1, -32(1)16; CHECK: blr17}18declare fastcc void @fastccFunc(i32 signext %level) unnamed_addr19 20; No need for Parameter Save Area if only 8 GPRs is needed.21define linkonce_odr void @WithoutParamArea2(ptr %a, i32 signext %b) align 2 {22entry:23 call fastcc void @eightArgs(i32 signext 1, i32 signext 2, i32 signext 3,24 i32 signext 4, i32 signext 5, i32 signext 6,25 i32 signext 7, i32 signext 8)26 ret void27 28; CHECK-LABEL: WithoutParamArea229; CHECK: stdu 1, -32(1)30; CHECK: blr31}32 33declare fastcc void34 @eightArgs(i32 signext %level, i32 signext %level2, i32 signext %level3,35 i32 signext %level4, i32 signext %level5, i32 signext %level6,36 i32 signext %level7, i32 signext %level8) unnamed_addr37 38; No need for Parameter Save Area for calls that utiliizes 8 GPR and 2 FPR.39define linkonce_odr void @WithoutParamArea3(ptr %a, i32 signext %b) align 2 {40entry:41 call fastcc void42 @mixedArgs(i32 signext 1, float 1.0, i32 signext 2, float 2.0,43 i32 signext 3, i32 signext 4, i32 signext 5, i32 signext 6,44 i32 signext 7, i32 signext 8) ret void45 ret void46 47; CHECK-LABEL: WithoutParamArea348; CHECK: stdu 1, -32(1)49; CHECK: blr50}51 52declare fastcc void53 @mixedArgs(i32 signext %level, float %levelf1, i32 signext %level2,54 float %levelf2, i32 signext %level3, i32 signext %level4,55 i32 signext %level5, i32 signext %level6, i32 signext %level7,56 i32 signext %level8) unnamed_addr57 58; Pass by value usage requiring less GPR then available59%"myClass::Mem" = type { i8, i8, i16, i32, i32, i32, i64 }60 61define internal fastcc void @CallPassByValue(ptr %E) align 2 {62entry:63 call fastcc void @PassByValue(ptr byval(%"myClass::Mem") nonnull align 8 undef);64 ret void65 66; CHECK-LABEL: PassByValue67; CHECK: stdu 1, -32(1)68; CHECK: blr69}70 71declare dso_local fastcc void72 @PassByValue(ptr byval(%"myClass::Mem") nocapture readonly align 8) align 273 74; Verify Paramater Save Area is allocated if parameter exceed the number that75; can be passed via registers76; ------------------------------------------------------------------------------77 78; Max number of GPR is 879define linkonce_odr void @WithParamArea(ptr %a, i32 signext %b) align 2 {80entry:81 call fastcc void @nineArgs(i32 signext 1, i32 signext 2, i32 signext 3,82 i32 signext 4, i32 signext 5, i32 signext 6,83 i32 signext 7, i32 signext 8, i32 signext 9)84 ret void85 86; CHECK-LABEL: WithParamArea87; CHECK: stdu 1, -96(1)88; CHECK: blr89}90 91declare fastcc void @nineArgs(i32 signext %level, i32 signext %level2,92 i32 signext %level3, i32 signext %level4, i32 signext %level5,93 i32 signext %level6, i32 signext %level7, i32 signext %level8,94 i32 signext %level9) unnamed_addr95 96; Max number of FPR for parameter passing is 1397define linkonce_odr void @WithParamArea2(ptr %a, i32 signext %b) align 2 {98entry:99 call fastcc void @funcW14FloatArgs(float 1.0, float 2.0, float 3.0,100 float 4.0, float 5.0, float 6.0, float 7.0, float 8.0, float 1.0,101 float 2.0, float 3.0, float 4.0, float 5.0, float 14.0)102 ret void103 104; CHECK-LABEL: WithParamArea2105; CHECK: stdu 1, -96(1)106; CHECK: blr107}108 109declare fastcc void110 @funcW14FloatArgs(float %level, float %level2, float %level3,111 float %level4, float %level5, float %level6,112 float %level7, float %level8, float %level9,113 float %level10, float %level11, float %level12,114 float %level13, float %level14);115 116 117; Pass by value usage requires more GPR then available118%"myClass::MemA" = type { i8, i8, i16, i32, i32, i32, i64 }119%"myClass::MemB" = type { ptr, i32, i32, ptr }120%"myClass::MemC" = type { ptr, ptr, i64 }121%"myClass::MemD" = type { ptr, ptr, i8, i8, i16,122 i32 }123%"myStruct::MemF" = type { i32, ptr, ptr, i64, i64 }124%"myClass::MemK" = type { i32, ptr, ptr, i64, i32,125 i64, i8, i32, %"myStruct::MemF",126 i8, ptr }127 128define internal fastcc void @AggMemExprEmitter(ptr %E) align 2 {129entry:130 call fastcc void @MemExprEmitterInitialization(ptr131 byval(%"myClass::MemK") nonnull align 8 undef);132 ret void133 134; CHECK-LABEL: AggMemExprEmitter135; CHECK: stdu 1, -144(1)136; CHECK: blr137}138 139declare dso_local fastcc void140 @MemExprEmitterInitialization(ptr141 byval(%"myClass::MemK") nocapture readonly align 8) align 2142