1*c7472d91STim Shen; For ELFv2 ABI, we can avoid allocating the parameter area in the stack frame of the caller function 2*c7472d91STim Shen; if all the arguments can be passed to the callee in registers. 3*c7472d91STim Shen; For ELFv1 ABI, we always need to allocate the parameter area. 4*c7472d91STim Shen 5*c7472d91STim Shen; Tests for ELFv2 ABI 6*c7472d91STim Shen; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -target-abi elfv2 < %s | FileCheck %s -check-prefix=PPC64-ELFV2 7*c7472d91STim Shen; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -target-abi elfv2 < %s | FileCheck %s -check-prefix=PPC64-ELFV2 8*c7472d91STim Shen 9*c7472d91STim Shen; Tests for ELFv1 ABI 10*c7472d91STim Shen; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -target-abi elfv1 < %s | FileCheck %s -check-prefix=PPC64-ELFV1 11*c7472d91STim Shen; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -target-abi elfv1 < %s | FileCheck %s -check-prefix=PPC64-ELFV1 12*c7472d91STim Shen 13*c7472d91STim Shen; If the callee has at most eight integer args, parameter area can be ommited for ELFv2 ABI. 14*c7472d91STim Shen 15*c7472d91STim Shen; PPC64-ELFV2-LABEL: WithoutParamArea1: 16*c7472d91STim Shen; PPC64-ELFV2-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 17*c7472d91STim Shen; PPC64-ELFV2: stdu 1, -32(1) 18*c7472d91STim Shen; PPC64-ELFV2: addi 1, 1, 32 19*c7472d91STim Shen; PPC64-ELFV2-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 20*c7472d91STim Shen; PPC64-ELFV1-LABEL: WithoutParamArea1: 21*c7472d91STim Shen; PPC64-ELFV1-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 22*c7472d91STim Shen; PPC64-ELFV1: stdu 1, -112(1) 23*c7472d91STim Shen; PPC64-ELFV1: addi 1, 1, 112 24*c7472d91STim Shen; PPC64-ELFV1-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 25*c7472d91STim Shendefine signext i32 @WithoutParamArea1(i32 signext %a) local_unnamed_addr #0 { 26*c7472d91STim Shenentry: 27*c7472d91STim Shen %call = tail call signext i32 @onearg(i32 signext %a) #2 28*c7472d91STim Shen ret i32 %call 29*c7472d91STim Shen} 30*c7472d91STim Shen 31*c7472d91STim Shen; PPC64-ELFV2-LABEL: WithoutParamArea2: 32*c7472d91STim Shen; PPC64-ELFV2-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 33*c7472d91STim Shen; PPC64-ELFV2: stdu 1, -32(1) 34*c7472d91STim Shen; PPC64-ELFV2: addi 1, 1, 32 35*c7472d91STim Shen; PPC64-ELFV2-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 36*c7472d91STim Shen; PPC64-ELFV1-LABEL: WithoutParamArea2: 37*c7472d91STim Shen; PPC64-ELFV1-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 38*c7472d91STim Shen; PPC64-ELFV1: stdu 1, -112(1) 39*c7472d91STim Shen; PPC64-ELFV1: addi 1, 1, 112 40*c7472d91STim Shen; PPC64-ELFV1-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 41*c7472d91STim Shendefine signext i32 @WithoutParamArea2(i32 signext %a) local_unnamed_addr #0 { 42*c7472d91STim Shenentry: 43*c7472d91STim Shen %call = tail call signext i32 @eightargs(i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a) #2 44*c7472d91STim Shen ret i32 %call 45*c7472d91STim Shen} 46*c7472d91STim Shen 47*c7472d91STim Shen; If the callee has more than eight integer args or variable number of args, 48*c7472d91STim Shen; parameter area cannot be ommited even for ELFv2 ABI 49*c7472d91STim Shen 50*c7472d91STim Shen; PPC64-ELFV2-LABEL: WithParamArea1: 51*c7472d91STim Shen; PPC64-ELFV2-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 52*c7472d91STim Shen; PPC64-ELFV2: stdu 1, -96(1) 53*c7472d91STim Shen; PPC64-ELFV2: addi 1, 1, 96 54*c7472d91STim Shen; PPC64-ELFV2-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 55*c7472d91STim Shen; PPC64-ELFV1-LABEL: WithParamArea1: 56*c7472d91STim Shen; PPC64-ELFV1-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 57*c7472d91STim Shen; PPC64-ELFV1: stdu 1, -112(1) 58*c7472d91STim Shen; PPC64-ELFV1: addi 1, 1, 112 59*c7472d91STim Shen; PPC64-ELFV1-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 60*c7472d91STim Shendefine signext i32 @WithParamArea1(i32 signext %a) local_unnamed_addr #0 { 61*c7472d91STim Shenentry: 62*c7472d91STim Shen %call = tail call signext i32 (i32, ...) @varargs(i32 signext %a, i32 signext %a) #2 63*c7472d91STim Shen ret i32 %call 64*c7472d91STim Shen} 65*c7472d91STim Shen 66*c7472d91STim Shen; PPC64-ELFV2-LABEL: WithParamArea2: 67*c7472d91STim Shen; PPC64-ELFV2-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 68*c7472d91STim Shen; PPC64-ELFV2: stdu 1, -112(1) 69*c7472d91STim Shen; PPC64-ELFV2: addi 1, 1, 112 70*c7472d91STim Shen; PPC64-ELFV2-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 71*c7472d91STim Shen; PPC64-ELFV1-LABEL: WithParamArea2: 72*c7472d91STim Shen; PPC64-ELFV1-NOT: stw {{[0-9]+}}, -{{[0-9]+}}(1) 73*c7472d91STim Shen; PPC64-ELFV1: stdu 1, -128(1) 74*c7472d91STim Shen; PPC64-ELFV1: addi 1, 1, 128 75*c7472d91STim Shen; PPC64-ELFV1-NOT: lwz {{[0-9]+}}, -{{[0-9]+}}(1) 76*c7472d91STim Shendefine signext i32 @WithParamArea2(i32 signext %a) local_unnamed_addr #0 { 77*c7472d91STim Shenentry: 78*c7472d91STim Shen %call = tail call signext i32 @nineargs(i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a, i32 signext %a) #2 79*c7472d91STim Shen ret i32 %call 80*c7472d91STim Shen} 81*c7472d91STim Shen 82*c7472d91STim Shendeclare signext i32 @onearg(i32 signext) local_unnamed_addr #1 83*c7472d91STim Shendeclare signext i32 @eightargs(i32 signext, i32 signext, i32 signext, i32 signext, i32 signext, i32 signext, i32 signext, i32 signext) local_unnamed_addr #1 84*c7472d91STim Shendeclare signext i32 @nineargs(i32 signext, i32 signext, i32 signext, i32 signext, i32 signext, i32 signext, i32 signext, i32 signext, i32 signext) local_unnamed_addr #1 85*c7472d91STim Shendeclare signext i32 @varargs(i32 signext, ...) local_unnamed_addr #1 86*c7472d91STim Shen 87