1*9880d681SAndroid Build Coastguard Worker; Test incoming GPR, FPR and stack arguments when no extension type is given. 2*9880d681SAndroid Build Coastguard Worker; This type of argument is used for passing structures, etc. 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -verify-machineinstrs | FileCheck %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Do some arithmetic so that we can see the register being used. 7*9880d681SAndroid Build Coastguard Workerdefine i8 @f1(i8 %r2) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 9*9880d681SAndroid Build Coastguard Worker; CHECK: ahi %r2, 1 10*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 11*9880d681SAndroid Build Coastguard Worker %y = add i8 %r2, 1 12*9880d681SAndroid Build Coastguard Worker ret i8 %y 13*9880d681SAndroid Build Coastguard Worker} 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine i16 @f2(i8 %r2, i16 %r3) { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 17*9880d681SAndroid Build Coastguard Worker; CHECK: {{lr|lgr}} %r2, %r3 18*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 19*9880d681SAndroid Build Coastguard Worker ret i16 %r3 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workerdefine i32 @f3(i8 %r2, i16 %r3, i32 %r4) { 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 24*9880d681SAndroid Build Coastguard Worker; CHECK: {{lr|lgr}} %r2, %r4 25*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 26*9880d681SAndroid Build Coastguard Worker ret i32 %r4 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(i8 %r2, i16 %r3, i32 %r4, i64 %r5) { 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 31*9880d681SAndroid Build Coastguard Worker; CHECK: {{lr|lgr}} %r2, %r5 32*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 33*9880d681SAndroid Build Coastguard Worker ret i64 %r5 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Do some arithmetic so that we can see the register being used. 37*9880d681SAndroid Build Coastguard Workerdefine float @f5(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0) { 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 39*9880d681SAndroid Build Coastguard Worker; CHECK: aebr %f0, %f0 40*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 41*9880d681SAndroid Build Coastguard Worker %y = fadd float %f0, %f0 42*9880d681SAndroid Build Coastguard Worker ret float %y 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine double @f6(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 47*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f2 48*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 49*9880d681SAndroid Build Coastguard Worker ret double %f2 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; fp128s are passed indirectly. Do some arithmetic so that the value 53*9880d681SAndroid Build Coastguard Worker; must be interpreted as a float, rather than as a block of memory to 54*9880d681SAndroid Build Coastguard Worker; be copied. 55*9880d681SAndroid Build Coastguard Workerdefine void @f7(fp128 *%r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2, 56*9880d681SAndroid Build Coastguard Worker fp128 %r6) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 58*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f0, 0(%r6) 59*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f2, 8(%r6) 60*9880d681SAndroid Build Coastguard Worker; CHECK: axbr %f0, %f0 61*9880d681SAndroid Build Coastguard Worker; CHECK: std %f0, 0(%r2) 62*9880d681SAndroid Build Coastguard Worker; CHECK: std %f2, 8(%r2) 63*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 64*9880d681SAndroid Build Coastguard Worker %y = fadd fp128 %r6, %r6 65*9880d681SAndroid Build Coastguard Worker store fp128 %y, fp128 *%r2 66*9880d681SAndroid Build Coastguard Worker ret void 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Workerdefine i64 @f8(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2, 70*9880d681SAndroid Build Coastguard Worker fp128 %r6, i64 %s1) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 72*9880d681SAndroid Build Coastguard Worker; CHECK: lg %r2, 160(%r15) 73*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 74*9880d681SAndroid Build Coastguard Worker ret i64 %s1 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Workerdefine float @f9(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2, 78*9880d681SAndroid Build Coastguard Worker fp128 %r6, i64 %s1, float %f4) { 79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 80*9880d681SAndroid Build Coastguard Worker; CHECK: ler %f0, %f4 81*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 82*9880d681SAndroid Build Coastguard Worker ret float %f4 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerdefine double @f10(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2, 86*9880d681SAndroid Build Coastguard Worker fp128 %r6, i64 %s1, float %f4, double %f6) { 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 88*9880d681SAndroid Build Coastguard Worker; CHECK: ldr %f0, %f6 89*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 90*9880d681SAndroid Build Coastguard Worker ret double %f6 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine i64 @f11(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2, 94*9880d681SAndroid Build Coastguard Worker fp128 %r6, i64 %s1, float %f4, double %f6, i64 %s2) { 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 96*9880d681SAndroid Build Coastguard Worker; CHECK: lg %r2, 168(%r15) 97*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 98*9880d681SAndroid Build Coastguard Worker ret i64 %s2 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; Floats are passed right-justified. 102*9880d681SAndroid Build Coastguard Workerdefine float @f12(i8 %r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2, 103*9880d681SAndroid Build Coastguard Worker fp128 %r6, i64 %s1, float %f4, double %f6, i64 %s2, 104*9880d681SAndroid Build Coastguard Worker float %s3) { 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 106*9880d681SAndroid Build Coastguard Worker; CHECK: le %f0, 180(%r15) 107*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 108*9880d681SAndroid Build Coastguard Worker ret float %s3 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Test a case where the fp128 address is passed on the stack. 112*9880d681SAndroid Build Coastguard Workerdefine void @f13(fp128 *%r2, i16 %r3, i32 %r4, i64 %r5, float %f0, double %f2, 113*9880d681SAndroid Build Coastguard Worker fp128 %r6, i64 %s1, float %f4, double %f6, i64 %s2, 114*9880d681SAndroid Build Coastguard Worker float %s3, fp128 %s4) { 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 116*9880d681SAndroid Build Coastguard Worker; CHECK: lg [[REGISTER:%r[1-5]+]], 184(%r15) 117*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f0, 0([[REGISTER]]) 118*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f2, 8([[REGISTER]]) 119*9880d681SAndroid Build Coastguard Worker; CHECK: axbr %f0, %f0 120*9880d681SAndroid Build Coastguard Worker; CHECK: std %f0, 0(%r2) 121*9880d681SAndroid Build Coastguard Worker; CHECK: std %f2, 8(%r2) 122*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 123*9880d681SAndroid Build Coastguard Worker %y = fadd fp128 %s4, %s4 124*9880d681SAndroid Build Coastguard Worker store fp128 %y, fp128 *%r2 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; Explicit fp128 return values are likewise passed indirectly. 129*9880d681SAndroid Build Coastguard Workerdefine fp128 @f14(fp128 %r3) { 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f14: 131*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f0, 0(%r3) 132*9880d681SAndroid Build Coastguard Worker; CHECK: ld %f2, 8(%r3) 133*9880d681SAndroid Build Coastguard Worker; CHECK: axbr %f0, %f0 134*9880d681SAndroid Build Coastguard Worker; CHECK: std %f0, 0(%r2) 135*9880d681SAndroid Build Coastguard Worker; CHECK: std %f2, 8(%r2) 136*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 137*9880d681SAndroid Build Coastguard Worker %y = fadd fp128 %r3, %r3 138*9880d681SAndroid Build Coastguard Worker ret fp128 %y 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141