1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc64le -mcpu=pwr8 -mattr=+altivec -mattr=-vsx | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc64le -mattr=+altivec -mattr=-vsx | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Currently VSX support is disabled for this test because we generate lxsdx 5*9880d681SAndroid Build Coastguard Worker; instead of lfd, and stxsdx instead of stfd. That is a poor choice when we 6*9880d681SAndroid Build Coastguard Worker; have reg+imm addressing, and is on the list of things to be fixed. 7*9880d681SAndroid Build Coastguard Worker; The second run step is to ensure that -march=ppc64le is adequate to select 8*9880d681SAndroid Build Coastguard Worker; the same feature set as with -mcpu=pwr8 since that is the baseline for ppc64le. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-n32:64" 11*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64le-unknown-linux-gnu" 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; 14*9880d681SAndroid Build Coastguard Worker; Verify use of registers for float/vector aggregate return. 15*9880d681SAndroid Build Coastguard Worker; 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine [8 x float] @return_float([8 x float] %x) { 18*9880d681SAndroid Build Coastguard Workerentry: 19*9880d681SAndroid Build Coastguard Worker ret [8 x float] %x 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_float 22*9880d681SAndroid Build Coastguard Worker; CHECK: %entry 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workerdefine [8 x double] @return_double([8 x double] %x) { 26*9880d681SAndroid Build Coastguard Workerentry: 27*9880d681SAndroid Build Coastguard Worker ret [8 x double] %x 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_double 30*9880d681SAndroid Build Coastguard Worker; CHECK: %entry 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerdefine [4 x ppc_fp128] @return_ppcf128([4 x ppc_fp128] %x) { 34*9880d681SAndroid Build Coastguard Workerentry: 35*9880d681SAndroid Build Coastguard Worker ret [4 x ppc_fp128] %x 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_ppcf128 38*9880d681SAndroid Build Coastguard Worker; CHECK: %entry 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdefine [8 x <4 x i32>] @return_v4i32([8 x <4 x i32>] %x) { 42*9880d681SAndroid Build Coastguard Workerentry: 43*9880d681SAndroid Build Coastguard Worker ret [8 x <4 x i32>] %x 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_v4i32 46*9880d681SAndroid Build Coastguard Worker; CHECK: %entry 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker; 51*9880d681SAndroid Build Coastguard Worker; Verify amount of space taken up by aggregates in the parameter save area. 52*9880d681SAndroid Build Coastguard Worker; 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_float([7 x float] %a, [7 x float] %b, i64 %c) { 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker ret i64 %c 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_float 59*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 96(1) 60*9880d681SAndroid Build Coastguard Worker; CHECK: blr 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerdefine void @caller_float(i64 %x, [7 x float] %y) { 63*9880d681SAndroid Build Coastguard Workerentry: 64*9880d681SAndroid Build Coastguard Worker tail call void @test_float([7 x float] %y, [7 x float] %y, i64 %x) 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_float 68*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 96(1) 69*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_float 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdeclare void @test_float([7 x float], [7 x float], i64) 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_double(i64 %a, [7 x double] %b, i64 %c) { 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker ret i64 %c 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_double 78*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 96(1) 79*9880d681SAndroid Build Coastguard Worker; CHECK: blr 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerdefine void @caller_double(i64 %x, [7 x double] %y) { 82*9880d681SAndroid Build Coastguard Workerentry: 83*9880d681SAndroid Build Coastguard Worker tail call void @test_double(i64 %x, [7 x double] %y, i64 %x) 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_double 87*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 96(1) 88*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_double 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdeclare void @test_double(i64, [7 x double], i64) 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_ppcf128(i64 %a, [4 x ppc_fp128] %b, i64 %c) { 93*9880d681SAndroid Build Coastguard Workerentry: 94*9880d681SAndroid Build Coastguard Worker ret i64 %c 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_ppcf128 97*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 104(1) 98*9880d681SAndroid Build Coastguard Worker; CHECK: blr 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdefine void @caller_ppcf128(i64 %x, [4 x ppc_fp128] %y) { 101*9880d681SAndroid Build Coastguard Workerentry: 102*9880d681SAndroid Build Coastguard Worker tail call void @test_ppcf128(i64 %x, [4 x ppc_fp128] %y, i64 %x) 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_ppcf128 106*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 104(1) 107*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_ppcf128 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdeclare void @test_ppcf128(i64, [4 x ppc_fp128], i64) 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_i64(i64 %a, [7 x i64] %b, i64 %c) { 112*9880d681SAndroid Build Coastguard Workerentry: 113*9880d681SAndroid Build Coastguard Worker ret i64 %c 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_i64 116*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 96(1) 117*9880d681SAndroid Build Coastguard Worker; CHECK: blr 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine void @caller_i64(i64 %x, [7 x i64] %y) { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker tail call void @test_i64(i64 %x, [7 x i64] %y, i64 %x) 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_i64 125*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 96(1) 126*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_i64 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdeclare void @test_i64(i64, [7 x i64], i64) 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_i128(i64 %a, [4 x i128] %b, i64 %c) { 131*9880d681SAndroid Build Coastguard Workerentry: 132*9880d681SAndroid Build Coastguard Worker ret i64 %c 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_i128 135*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 112(1) 136*9880d681SAndroid Build Coastguard Worker; CHECK: blr 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Workerdefine void @caller_i128(i64 %x, [4 x i128] %y) { 139*9880d681SAndroid Build Coastguard Workerentry: 140*9880d681SAndroid Build Coastguard Worker tail call void @test_i128(i64 %x, [4 x i128] %y, i64 %x) 141*9880d681SAndroid Build Coastguard Worker ret void 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_i128 144*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 112(1) 145*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_i128 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Workerdeclare void @test_i128(i64, [4 x i128], i64) 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_v4i32(i64 %a, [4 x <4 x i32>] %b, i64 %c) { 150*9880d681SAndroid Build Coastguard Workerentry: 151*9880d681SAndroid Build Coastguard Worker ret i64 %c 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_v4i32 154*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 112(1) 155*9880d681SAndroid Build Coastguard Worker; CHECK: blr 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdefine void @caller_v4i32(i64 %x, [4 x <4 x i32>] %y) { 158*9880d681SAndroid Build Coastguard Workerentry: 159*9880d681SAndroid Build Coastguard Worker tail call void @test_v4i32(i64 %x, [4 x <4 x i32>] %y, i64 %x) 160*9880d681SAndroid Build Coastguard Worker ret void 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_v4i32 163*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 112(1) 164*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_v4i32 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerdeclare void @test_v4i32(i64, [4 x <4 x i32>], i64) 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; 170*9880d681SAndroid Build Coastguard Worker; Verify handling of floating point arguments in GPRs 171*9880d681SAndroid Build Coastguard Worker; 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker%struct.float8 = type { [8 x float] } 174*9880d681SAndroid Build Coastguard Worker%struct.float5 = type { [5 x float] } 175*9880d681SAndroid Build Coastguard Worker%struct.float2 = type { [2 x float] } 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker@g8 = common global %struct.float8 zeroinitializer, align 4 178*9880d681SAndroid Build Coastguard Worker@g5 = common global %struct.float5 zeroinitializer, align 4 179*9880d681SAndroid Build Coastguard Worker@g2 = common global %struct.float2 zeroinitializer, align 4 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdefine float @callee0([7 x float] %a, [7 x float] %b) { 182*9880d681SAndroid Build Coastguard Workerentry: 183*9880d681SAndroid Build Coastguard Worker %b.extract = extractvalue [7 x float] %b, 6 184*9880d681SAndroid Build Coastguard Worker ret float %b.extract 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee0 187*9880d681SAndroid Build Coastguard Worker; CHECK: stw 10, [[OFF:.*]](1) 188*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1) 189*9880d681SAndroid Build Coastguard Worker; CHECK: blr 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerdefine void @caller0([7 x float] %a) { 192*9880d681SAndroid Build Coastguard Workerentry: 193*9880d681SAndroid Build Coastguard Worker tail call void @test0([7 x float] %a, [7 x float] %a) 194*9880d681SAndroid Build Coastguard Worker ret void 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller0 197*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 8, 1 198*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 9, 2 199*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 10, 3 200*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 11, 4 201*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 12, 5 202*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 13, 6 203*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 7, [[OFF:[0-9]+]](1) 204*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz 10, [[OFF]](1) 205*9880d681SAndroid Build Coastguard Worker; CHECK: bl test0 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Workerdeclare void @test0([7 x float], [7 x float]) 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine float @callee1([8 x float] %a, [8 x float] %b) { 210*9880d681SAndroid Build Coastguard Workerentry: 211*9880d681SAndroid Build Coastguard Worker %b.extract = extractvalue [8 x float] %b, 7 212*9880d681SAndroid Build Coastguard Worker ret float %b.extract 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee1 215*9880d681SAndroid Build Coastguard Worker; CHECK: rldicl [[REG:[0-9]+]], 10, 32, 32 216*9880d681SAndroid Build Coastguard Worker; CHECK: stw [[REG]], [[OFF:.*]](1) 217*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1) 218*9880d681SAndroid Build Coastguard Worker; CHECK: blr 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Workerdefine void @caller1([8 x float] %a) { 221*9880d681SAndroid Build Coastguard Workerentry: 222*9880d681SAndroid Build Coastguard Worker tail call void @test1([8 x float] %a, [8 x float] %a) 223*9880d681SAndroid Build Coastguard Worker ret void 224*9880d681SAndroid Build Coastguard Worker} 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller1 226*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 9, 1 227*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 10, 2 228*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 11, 3 229*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 12, 4 230*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 13, 5 231*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 5, [[OFF0:[0-9]+]](1) 232*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 6, [[OFF1:[0-9]+]](1) 233*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 7, [[OFF2:[0-9]+]](1) 234*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 8, [[OFF3:[0-9]+]](1) 235*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG0:[0-9]+]], [[OFF0]](1) 236*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG1:[0-9]+]], [[OFF1]](1) 237*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG2:[0-9]+]], [[OFF2]](1) 238*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG3:[0-9]+]], [[OFF3]](1) 239*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: sldi [[REG1]], [[REG1]], 32 240*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: sldi [[REG3]], [[REG3]], 32 241*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: or 9, [[REG0]], [[REG1]] 242*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: or 10, [[REG2]], [[REG3]] 243*9880d681SAndroid Build Coastguard Worker; CHECK: bl test1 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Workerdeclare void @test1([8 x float], [8 x float]) 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerdefine float @callee2([8 x float] %a, [5 x float] %b, [2 x float] %c) { 248*9880d681SAndroid Build Coastguard Workerentry: 249*9880d681SAndroid Build Coastguard Worker %c.extract = extractvalue [2 x float] %c, 1 250*9880d681SAndroid Build Coastguard Worker ret float %c.extract 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee2 253*9880d681SAndroid Build Coastguard Worker; CHECK: rldicl [[REG:[0-9]+]], 10, 32, 32 254*9880d681SAndroid Build Coastguard Worker; CHECK: stw [[REG]], [[OFF:.*]](1) 255*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1) 256*9880d681SAndroid Build Coastguard Worker; CHECK: blr 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerdefine void @caller2() { 259*9880d681SAndroid Build Coastguard Workerentry: 260*9880d681SAndroid Build Coastguard Worker %0 = load [8 x float], [8 x float]* getelementptr inbounds (%struct.float8, %struct.float8* @g8, i64 0, i32 0), align 4 261*9880d681SAndroid Build Coastguard Worker %1 = load [5 x float], [5 x float]* getelementptr inbounds (%struct.float5, %struct.float5* @g5, i64 0, i32 0), align 4 262*9880d681SAndroid Build Coastguard Worker %2 = load [2 x float], [2 x float]* getelementptr inbounds (%struct.float2, %struct.float2* @g2, i64 0, i32 0), align 4 263*9880d681SAndroid Build Coastguard Worker tail call void @test2([8 x float] %0, [5 x float] %1, [2 x float] %2) 264*9880d681SAndroid Build Coastguard Worker ret void 265*9880d681SAndroid Build Coastguard Worker} 266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller2 267*9880d681SAndroid Build Coastguard Worker; CHECK: ld {{[0-9]+}}, .LC 268*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 1, 0({{[0-9]+}}) 269*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 2, 4({{[0-9]+}}) 270*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 3, 8({{[0-9]+}}) 271*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 4, 12({{[0-9]+}}) 272*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 5, 16({{[0-9]+}}) 273*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 6, 20({{[0-9]+}}) 274*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 7, 24({{[0-9]+}}) 275*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 8, 28({{[0-9]+}}) 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 9, 0({{[0-9]+}}) 278*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 10, 4({{[0-9]+}}) 279*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 11, 8({{[0-9]+}}) 280*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 12, 12({{[0-9]+}}) 281*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 13, 16({{[0-9]+}}) 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG0:[0-9]+]], 0({{[0-9]+}}) 284*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG1:[0-9]+]], 4({{[0-9]+}}) 285*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: sldi [[REG2:[0-9]+]], [[REG1]], 32 286*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: or 10, [[REG0]], [[REG2]] 287*9880d681SAndroid Build Coastguard Worker; CHECK: bl test2 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerdeclare void @test2([8 x float], [5 x float], [2 x float]) 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Workerdefine double @callee3([8 x float] %a, [5 x float] %b, double %c) { 292*9880d681SAndroid Build Coastguard Workerentry: 293*9880d681SAndroid Build Coastguard Worker ret double %c 294*9880d681SAndroid Build Coastguard Worker} 295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee3 296*9880d681SAndroid Build Coastguard Worker; CHECK: std 10, [[OFF:.*]](1) 297*9880d681SAndroid Build Coastguard Worker; CHECK: lfd 1, [[OFF]](1) 298*9880d681SAndroid Build Coastguard Worker; CHECK: blr 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdefine void @caller3(double %d) { 301*9880d681SAndroid Build Coastguard Workerentry: 302*9880d681SAndroid Build Coastguard Worker %0 = load [8 x float], [8 x float]* getelementptr inbounds (%struct.float8, %struct.float8* @g8, i64 0, i32 0), align 4 303*9880d681SAndroid Build Coastguard Worker %1 = load [5 x float], [5 x float]* getelementptr inbounds (%struct.float5, %struct.float5* @g5, i64 0, i32 0), align 4 304*9880d681SAndroid Build Coastguard Worker tail call void @test3([8 x float] %0, [5 x float] %1, double %d) 305*9880d681SAndroid Build Coastguard Worker ret void 306*9880d681SAndroid Build Coastguard Worker} 307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller3 308*9880d681SAndroid Build Coastguard Worker; CHECK: stfd 1, [[OFF:.*]](1) 309*9880d681SAndroid Build Coastguard Worker; CHECK: ld 10, [[OFF]](1) 310*9880d681SAndroid Build Coastguard Worker; CHECK: bl test3 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Workerdeclare void @test3([8 x float], [5 x float], double) 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Workerdefine float @callee4([8 x float] %a, [5 x float] %b, float %c) { 315*9880d681SAndroid Build Coastguard Workerentry: 316*9880d681SAndroid Build Coastguard Worker ret float %c 317*9880d681SAndroid Build Coastguard Worker} 318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee4 319*9880d681SAndroid Build Coastguard Worker; CHECK: stw 10, [[OFF:.*]](1) 320*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1) 321*9880d681SAndroid Build Coastguard Worker; CHECK: blr 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Workerdefine void @caller4(float %f) { 324*9880d681SAndroid Build Coastguard Workerentry: 325*9880d681SAndroid Build Coastguard Worker %0 = load [8 x float], [8 x float]* getelementptr inbounds (%struct.float8, %struct.float8* @g8, i64 0, i32 0), align 4 326*9880d681SAndroid Build Coastguard Worker %1 = load [5 x float], [5 x float]* getelementptr inbounds (%struct.float5, %struct.float5* @g5, i64 0, i32 0), align 4 327*9880d681SAndroid Build Coastguard Worker tail call void @test4([8 x float] %0, [5 x float] %1, float %f) 328*9880d681SAndroid Build Coastguard Worker ret void 329*9880d681SAndroid Build Coastguard Worker} 330*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller4 331*9880d681SAndroid Build Coastguard Worker; CHECK: stfs 1, [[OFF:.*]](1) 332*9880d681SAndroid Build Coastguard Worker; CHECK: lwz 10, [[OFF]](1) 333*9880d681SAndroid Build Coastguard Worker; CHECK: bl test4 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerdeclare void @test4([8 x float], [5 x float], float) 336*9880d681SAndroid Build Coastguard Worker 337