1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=sparcv9 -disable-sparc-delay-filler -disable-sparc-leaf-proc | FileCheck %s --check-prefix=CHECK --check-prefix=HARD 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=sparcv9 -disable-sparc-delay-filler -disable-sparc-leaf-proc -mattr=soft-float | FileCheck %s --check-prefix=CHECK --check-prefix=SOFT 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: intarg: 5*9880d681SAndroid Build Coastguard Worker; The save/restore frame is not strictly necessary here, but we would need to 6*9880d681SAndroid Build Coastguard Worker; refer to %o registers instead. 7*9880d681SAndroid Build Coastguard Worker; CHECK: save %sp, -128, %sp 8*9880d681SAndroid Build Coastguard Worker; CHECK: ldx [%fp+2231], [[R2:%[gilo][0-7]]] 9*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%fp+2227], [[R1:%[gilo][0-7]]] 10*9880d681SAndroid Build Coastguard Worker; CHECK: stb %i0, [%i4] 11*9880d681SAndroid Build Coastguard Worker; CHECK: stb %i1, [%i4] 12*9880d681SAndroid Build Coastguard Worker; CHECK: sth %i2, [%i4] 13*9880d681SAndroid Build Coastguard Worker; CHECK: st %i3, [%i4] 14*9880d681SAndroid Build Coastguard Worker; CHECK: stx %i4, [%i4] 15*9880d681SAndroid Build Coastguard Worker; CHECK: st %i5, [%i4] 16*9880d681SAndroid Build Coastguard Worker; CHECK: st [[R1]], [%i4] 17*9880d681SAndroid Build Coastguard Worker; CHECK: stx [[R2]], [%i4] 18*9880d681SAndroid Build Coastguard Worker; CHECK: restore 19*9880d681SAndroid Build Coastguard Workerdefine void @intarg(i8 %a0, ; %i0 20*9880d681SAndroid Build Coastguard Worker i8 %a1, ; %i1 21*9880d681SAndroid Build Coastguard Worker i16 %a2, ; %i2 22*9880d681SAndroid Build Coastguard Worker i32 %a3, ; %i3 23*9880d681SAndroid Build Coastguard Worker i8* %a4, ; %i4 24*9880d681SAndroid Build Coastguard Worker i32 %a5, ; %i5 25*9880d681SAndroid Build Coastguard Worker i32 signext %a6, ; [%fp+BIAS+176] 26*9880d681SAndroid Build Coastguard Worker i8* %a7) { ; [%fp+BIAS+184] 27*9880d681SAndroid Build Coastguard Worker store i8 %a0, i8* %a4 28*9880d681SAndroid Build Coastguard Worker store i8 %a1, i8* %a4 29*9880d681SAndroid Build Coastguard Worker %p16 = bitcast i8* %a4 to i16* 30*9880d681SAndroid Build Coastguard Worker store i16 %a2, i16* %p16 31*9880d681SAndroid Build Coastguard Worker %p32 = bitcast i8* %a4 to i32* 32*9880d681SAndroid Build Coastguard Worker store i32 %a3, i32* %p32 33*9880d681SAndroid Build Coastguard Worker %pp = bitcast i8* %a4 to i8** 34*9880d681SAndroid Build Coastguard Worker store i8* %a4, i8** %pp 35*9880d681SAndroid Build Coastguard Worker store i32 %a5, i32* %p32 36*9880d681SAndroid Build Coastguard Worker store i32 %a6, i32* %p32 37*9880d681SAndroid Build Coastguard Worker store i8* %a7, i8** %pp 38*9880d681SAndroid Build Coastguard Worker ret void 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_intarg: 42*9880d681SAndroid Build Coastguard Worker; 16 saved + 8 args. 43*9880d681SAndroid Build Coastguard Worker; CHECK: save %sp, -192, %sp 44*9880d681SAndroid Build Coastguard Worker; Sign-extend and store the full 64 bits. 45*9880d681SAndroid Build Coastguard Worker; CHECK: sra %i0, 0, [[R:%[gilo][0-7]]] 46*9880d681SAndroid Build Coastguard Worker; Use %o0-%o5 for outgoing arguments 47*9880d681SAndroid Build Coastguard Worker; CHECK: mov 5, %o5 48*9880d681SAndroid Build Coastguard Worker; CHECK: stx [[R]], [%sp+2223] 49*9880d681SAndroid Build Coastguard Worker; CHECK: call intarg 50*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add %sp 51*9880d681SAndroid Build Coastguard Worker; CHECK: restore 52*9880d681SAndroid Build Coastguard Workerdefine void @call_intarg(i32 %i0, i8* %i1) { 53*9880d681SAndroid Build Coastguard Worker call void @intarg(i8 0, i8 1, i16 2, i32 3, i8* undef, i32 5, i32 %i0, i8* %i1) 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: floatarg: 58*9880d681SAndroid Build Coastguard Worker; HARD: save %sp, -128, %sp 59*9880d681SAndroid Build Coastguard Worker; HARD: ld [%fp+2307], [[F:%f[0-9]+]] 60*9880d681SAndroid Build Coastguard Worker; HARD: fstod %f1, 61*9880d681SAndroid Build Coastguard Worker; HARD: faddd %f2, 62*9880d681SAndroid Build Coastguard Worker; HARD: faddd %f4, 63*9880d681SAndroid Build Coastguard Worker; HARD: faddd %f6, 64*9880d681SAndroid Build Coastguard Worker; HARD: fadds %f31, [[F]] 65*9880d681SAndroid Build Coastguard Worker; SOFT: save %sp, -176, %sp 66*9880d681SAndroid Build Coastguard Worker; SOFT: srl %i0, 0, %o0 67*9880d681SAndroid Build Coastguard Worker; SOFT-NEXT: call __extendsfdf2 68*9880d681SAndroid Build Coastguard Worker; SOFT: mov %o0, %i0 69*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i1, %o0 70*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i2, %o0 71*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i3, %o0 72*9880d681SAndroid Build Coastguard Worker; SOFT: ld [%fp+2299], %o0 73*9880d681SAndroid Build Coastguard Worker; SOFT: ld [%fp+2307], %o1 74*9880d681SAndroid Build Coastguard Workerdefine double @floatarg(float %a0, ; %f1 75*9880d681SAndroid Build Coastguard Worker double %a1, ; %d2 76*9880d681SAndroid Build Coastguard Worker double %a2, ; %d4 77*9880d681SAndroid Build Coastguard Worker double %a3, ; %d6 78*9880d681SAndroid Build Coastguard Worker float %a4, ; %f9 79*9880d681SAndroid Build Coastguard Worker float %a5, ; %f11 80*9880d681SAndroid Build Coastguard Worker float %a6, ; %f13 81*9880d681SAndroid Build Coastguard Worker float %a7, ; %f15 82*9880d681SAndroid Build Coastguard Worker float %a8, ; %f17 83*9880d681SAndroid Build Coastguard Worker float %a9, ; %f19 84*9880d681SAndroid Build Coastguard Worker float %a10, ; %f21 85*9880d681SAndroid Build Coastguard Worker float %a11, ; %f23 86*9880d681SAndroid Build Coastguard Worker float %a12, ; %f25 87*9880d681SAndroid Build Coastguard Worker float %a13, ; %f27 88*9880d681SAndroid Build Coastguard Worker float %a14, ; %f29 89*9880d681SAndroid Build Coastguard Worker float %a15, ; %f31 90*9880d681SAndroid Build Coastguard Worker float %a16, ; [%fp+BIAS+256] (using 8 bytes) 91*9880d681SAndroid Build Coastguard Worker double %a17) { ; [%fp+BIAS+264] (using 8 bytes) 92*9880d681SAndroid Build Coastguard Worker %d0 = fpext float %a0 to double 93*9880d681SAndroid Build Coastguard Worker %s1 = fadd double %a1, %d0 94*9880d681SAndroid Build Coastguard Worker %s2 = fadd double %a2, %s1 95*9880d681SAndroid Build Coastguard Worker %s3 = fadd double %a3, %s2 96*9880d681SAndroid Build Coastguard Worker %s16 = fadd float %a15, %a16 97*9880d681SAndroid Build Coastguard Worker %d16 = fpext float %s16 to double 98*9880d681SAndroid Build Coastguard Worker %s17 = fadd double %d16, %s3 99*9880d681SAndroid Build Coastguard Worker ret double %s17 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_floatarg: 103*9880d681SAndroid Build Coastguard Worker; CHECK: save %sp, -272, %sp 104*9880d681SAndroid Build Coastguard Worker; Store 8 bytes in full slot. 105*9880d681SAndroid Build Coastguard Worker; HARD: std %f2, [%sp+2311] 106*9880d681SAndroid Build Coastguard Worker; Store 4 bytes, right-aligned in slot. 107*9880d681SAndroid Build Coastguard Worker; HARD: st %f1, [%sp+2307] 108*9880d681SAndroid Build Coastguard Worker; HARD: fmovd %f2, %f4 109*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i1, [%sp+2311] 110*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i0, [%sp+2303] 111*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2295] 112*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2287] 113*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2279] 114*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2271] 115*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2263] 116*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2255] 117*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2247] 118*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2239] 119*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2231] 120*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i2, [%sp+2223] 121*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i2, %o0 122*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i1, %o1 123*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i1, %o2 124*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i1, %o3 125*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i2, %o4 126*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i2, %o5 127*9880d681SAndroid Build Coastguard Worker; CHECK: call floatarg 128*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add %sp 129*9880d681SAndroid Build Coastguard Worker; CHECK: restore 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerdefine void @call_floatarg(float %f1, double %d2, float %f5, double *%p) { 132*9880d681SAndroid Build Coastguard Worker %r = call double @floatarg(float %f5, double %d2, double %d2, double %d2, 133*9880d681SAndroid Build Coastguard Worker float %f5, float %f5, float %f5, float %f5, 134*9880d681SAndroid Build Coastguard Worker float %f5, float %f5, float %f5, float %f5, 135*9880d681SAndroid Build Coastguard Worker float %f5, float %f5, float %f5, float %f5, 136*9880d681SAndroid Build Coastguard Worker float %f1, double %d2) 137*9880d681SAndroid Build Coastguard Worker store double %r, double* %p 138*9880d681SAndroid Build Coastguard Worker ret void 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: mixedarg: 142*9880d681SAndroid Build Coastguard Worker; CHECK: ldx [%fp+2247] 143*9880d681SAndroid Build Coastguard Worker; CHECK: ldx [%fp+2231] 144*9880d681SAndroid Build Coastguard Worker; SOFT: ldx [%fp+2239], %i0 145*9880d681SAndroid Build Coastguard Worker; HARD: fstod %f3 146*9880d681SAndroid Build Coastguard Worker; HARD: faddd %f6 147*9880d681SAndroid Build Coastguard Worker; HARD: faddd %f16 148*9880d681SAndroid Build Coastguard Worker; SOFT: mov %o0, %i1 149*9880d681SAndroid Build Coastguard Worker; SOFT-NEXT: mov %i3, %o0 150*9880d681SAndroid Build Coastguard Worker; SOFT-NEXT: mov %i1, %o1 151*9880d681SAndroid Build Coastguard Worker; SOFT-NEXT: call __adddf3 152*9880d681SAndroid Build Coastguard Worker; SOFT: mov %o0, %i1 153*9880d681SAndroid Build Coastguard Worker; SOFT-NEXT: mov %i0, %o0 154*9880d681SAndroid Build Coastguard Worker; SOFT-NEXT: mov %i1, %o1 155*9880d681SAndroid Build Coastguard Worker; SOFT-NEXT: call __adddf3 156*9880d681SAndroid Build Coastguard Worker; HARD: std %f0, [%i1] 157*9880d681SAndroid Build Coastguard Worker; SOFT: stx %o0, [%i5] 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Workerdefine void @mixedarg(i8 %a0, ; %i0 160*9880d681SAndroid Build Coastguard Worker float %a1, ; %f3 161*9880d681SAndroid Build Coastguard Worker i16 %a2, ; %i2 162*9880d681SAndroid Build Coastguard Worker double %a3, ; %d6 163*9880d681SAndroid Build Coastguard Worker i13 %a4, ; %i4 164*9880d681SAndroid Build Coastguard Worker float %a5, ; %f11 165*9880d681SAndroid Build Coastguard Worker i64 %a6, ; [%fp+BIAS+176] 166*9880d681SAndroid Build Coastguard Worker double *%a7, ; [%fp+BIAS+184] 167*9880d681SAndroid Build Coastguard Worker double %a8, ; %d16 168*9880d681SAndroid Build Coastguard Worker i16* %a9) { ; [%fp+BIAS+200] 169*9880d681SAndroid Build Coastguard Worker %d1 = fpext float %a1 to double 170*9880d681SAndroid Build Coastguard Worker %s3 = fadd double %a3, %d1 171*9880d681SAndroid Build Coastguard Worker %s8 = fadd double %a8, %s3 172*9880d681SAndroid Build Coastguard Worker store double %s8, double* %a7 173*9880d681SAndroid Build Coastguard Worker store i16 %a2, i16* %a9 174*9880d681SAndroid Build Coastguard Worker ret void 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_mixedarg: 178*9880d681SAndroid Build Coastguard Worker; CHECK: stx %i2, [%sp+2247] 179*9880d681SAndroid Build Coastguard Worker; SOFT: stx %i1, [%sp+2239] 180*9880d681SAndroid Build Coastguard Worker; CHECK: stx %i0, [%sp+2223] 181*9880d681SAndroid Build Coastguard Worker; HARD: fmovd %f2, %f6 182*9880d681SAndroid Build Coastguard Worker; HARD: fmovd %f2, %f16 183*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i1, %o3 184*9880d681SAndroid Build Coastguard Worker; CHECK: call mixedarg 185*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add %sp 186*9880d681SAndroid Build Coastguard Worker; CHECK: restore 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerdefine void @call_mixedarg(i64 %i0, double %f2, i16* %i2) { 189*9880d681SAndroid Build Coastguard Worker call void @mixedarg(i8 undef, 190*9880d681SAndroid Build Coastguard Worker float undef, 191*9880d681SAndroid Build Coastguard Worker i16 undef, 192*9880d681SAndroid Build Coastguard Worker double %f2, 193*9880d681SAndroid Build Coastguard Worker i13 undef, 194*9880d681SAndroid Build Coastguard Worker float undef, 195*9880d681SAndroid Build Coastguard Worker i64 %i0, 196*9880d681SAndroid Build Coastguard Worker double* undef, 197*9880d681SAndroid Build Coastguard Worker double %f2, 198*9880d681SAndroid Build Coastguard Worker i16* %i2) 199*9880d681SAndroid Build Coastguard Worker ret void 200*9880d681SAndroid Build Coastguard Worker} 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker; The inreg attribute is used to indicate 32-bit sized struct elements that 203*9880d681SAndroid Build Coastguard Worker; share an 8-byte slot. 204*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inreg_fi: 205*9880d681SAndroid Build Coastguard Worker; SOFT: srlx %i0, 32, [[R:%[gilo][0-7]]] 206*9880d681SAndroid Build Coastguard Worker; HARD: fstoi %f1 207*9880d681SAndroid Build Coastguard Worker; SOFT: call __fixsfsi 208*9880d681SAndroid Build Coastguard Worker; HARD: srlx %i0, 32, [[R:%[gilo][0-7]]] 209*9880d681SAndroid Build Coastguard Worker; CHECK: sub [[R]], 210*9880d681SAndroid Build Coastguard Workerdefine i32 @inreg_fi(i32 inreg %a0, ; high bits of %i0 211*9880d681SAndroid Build Coastguard Worker float inreg %a1) { ; %f1 212*9880d681SAndroid Build Coastguard Worker %b1 = fptosi float %a1 to i32 213*9880d681SAndroid Build Coastguard Worker %rv = sub i32 %a0, %b1 214*9880d681SAndroid Build Coastguard Worker ret i32 %rv 215*9880d681SAndroid Build Coastguard Worker} 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_inreg_fi: 218*9880d681SAndroid Build Coastguard Worker; Allocate space for 6 arguments, even when only 2 are used. 219*9880d681SAndroid Build Coastguard Worker; CHECK: save %sp, -176, %sp 220*9880d681SAndroid Build Coastguard Worker; HARD: sllx %i1, 32, %o0 221*9880d681SAndroid Build Coastguard Worker; HARD: fmovs %f5, %f1 222*9880d681SAndroid Build Coastguard Worker; SOFT: srl %i2, 0, %i0 223*9880d681SAndroid Build Coastguard Worker; SOFT: sllx %i1, 32, %i1 224*9880d681SAndroid Build Coastguard Worker; SOFT: or %i1, %i0, %o0 225*9880d681SAndroid Build Coastguard Worker; CHECK: call inreg_fi 226*9880d681SAndroid Build Coastguard Workerdefine void @call_inreg_fi(i32* %p, i32 %i1, float %f5) { 227*9880d681SAndroid Build Coastguard Worker %x = call i32 @inreg_fi(i32 %i1, float %f5) 228*9880d681SAndroid Build Coastguard Worker ret void 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inreg_ff: 232*9880d681SAndroid Build Coastguard Worker; HARD: fsubs %f0, %f1, %f0 233*9880d681SAndroid Build Coastguard Worker; SOFT: srlx %i0, 32, %o0 234*9880d681SAndroid Build Coastguard Worker; SOFT: srl %i0, 0, %o1 235*9880d681SAndroid Build Coastguard Worker; SOFT: call __subsf3 236*9880d681SAndroid Build Coastguard Workerdefine float @inreg_ff(float inreg %a0, ; %f0 237*9880d681SAndroid Build Coastguard Worker float inreg %a1) { ; %f1 238*9880d681SAndroid Build Coastguard Worker %rv = fsub float %a0, %a1 239*9880d681SAndroid Build Coastguard Worker ret float %rv 240*9880d681SAndroid Build Coastguard Worker} 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_inreg_ff: 243*9880d681SAndroid Build Coastguard Worker; HARD: fmovs %f3, %f0 244*9880d681SAndroid Build Coastguard Worker; HARD: fmovs %f5, %f1 245*9880d681SAndroid Build Coastguard Worker; SOFT: srl %i2, 0, %i0 246*9880d681SAndroid Build Coastguard Worker; SOFT: sllx %i1, 32, %i1 247*9880d681SAndroid Build Coastguard Worker; SOFT: or %i1, %i0, %o0 248*9880d681SAndroid Build Coastguard Worker; CHECK: call inreg_ff 249*9880d681SAndroid Build Coastguard Workerdefine void @call_inreg_ff(i32* %p, float %f3, float %f5) { 250*9880d681SAndroid Build Coastguard Worker %x = call float @inreg_ff(float %f3, float %f5) 251*9880d681SAndroid Build Coastguard Worker ret void 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker 254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inreg_if: 255*9880d681SAndroid Build Coastguard Worker; HARD: fstoi %f0 256*9880d681SAndroid Build Coastguard Worker; SOFT: srlx %i0, 32, %o0 257*9880d681SAndroid Build Coastguard Worker; SOFT: call __fixsfsi 258*9880d681SAndroid Build Coastguard Worker; CHECK: sub %i0 259*9880d681SAndroid Build Coastguard Workerdefine i32 @inreg_if(float inreg %a0, ; %f0 260*9880d681SAndroid Build Coastguard Worker i32 inreg %a1) { ; low bits of %i0 261*9880d681SAndroid Build Coastguard Worker %b0 = fptosi float %a0 to i32 262*9880d681SAndroid Build Coastguard Worker %rv = sub i32 %a1, %b0 263*9880d681SAndroid Build Coastguard Worker ret i32 %rv 264*9880d681SAndroid Build Coastguard Worker} 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_inreg_if: 267*9880d681SAndroid Build Coastguard Worker; HARD: fmovs %f3, %f0 268*9880d681SAndroid Build Coastguard Worker; HARD: mov %i2, %o0 269*9880d681SAndroid Build Coastguard Worker; SOFT: srl %i2, 0, %i0 270*9880d681SAndroid Build Coastguard Worker; SOFT: sllx %i1, 32, %i1 271*9880d681SAndroid Build Coastguard Worker; SOFT: or %i1, %i0, %o0 272*9880d681SAndroid Build Coastguard Worker; CHECK: call inreg_if 273*9880d681SAndroid Build Coastguard Workerdefine void @call_inreg_if(i32* %p, float %f3, i32 %i2) { 274*9880d681SAndroid Build Coastguard Worker %x = call i32 @inreg_if(float %f3, i32 %i2) 275*9880d681SAndroid Build Coastguard Worker ret void 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker; The frontend shouldn't do this. Just pass i64 instead. 279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: inreg_ii: 280*9880d681SAndroid Build Coastguard Worker; CHECK: srlx %i0, 32, [[R:%[gilo][0-7]]] 281*9880d681SAndroid Build Coastguard Worker; CHECK: sub %i0, [[R]], %i0 282*9880d681SAndroid Build Coastguard Workerdefine i32 @inreg_ii(i32 inreg %a0, ; high bits of %i0 283*9880d681SAndroid Build Coastguard Worker i32 inreg %a1) { ; low bits of %i0 284*9880d681SAndroid Build Coastguard Worker %rv = sub i32 %a1, %a0 285*9880d681SAndroid Build Coastguard Worker ret i32 %rv 286*9880d681SAndroid Build Coastguard Worker} 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_inreg_ii: 289*9880d681SAndroid Build Coastguard Worker; CHECK: srl %i2, 0, [[R2:%[gilo][0-7]]] 290*9880d681SAndroid Build Coastguard Worker; CHECK: sllx %i1, 32, [[R1:%[gilo][0-7]]] 291*9880d681SAndroid Build Coastguard Worker; CHECK: or [[R1]], [[R2]], %o0 292*9880d681SAndroid Build Coastguard Worker; CHECK: call inreg_ii 293*9880d681SAndroid Build Coastguard Workerdefine void @call_inreg_ii(i32* %p, i32 %i1, i32 %i2) { 294*9880d681SAndroid Build Coastguard Worker %x = call i32 @inreg_ii(i32 %i1, i32 %i2) 295*9880d681SAndroid Build Coastguard Worker ret void 296*9880d681SAndroid Build Coastguard Worker} 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard Worker; Structs up to 32 bytes in size can be returned in registers. 299*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_i64_pair: 300*9880d681SAndroid Build Coastguard Worker; CHECK: ldx [%i2], %i0 301*9880d681SAndroid Build Coastguard Worker; CHECK: ldx [%i3], %i1 302*9880d681SAndroid Build Coastguard Workerdefine { i64, i64 } @ret_i64_pair(i32 %a0, i32 %a1, i64* %p, i64* %q) { 303*9880d681SAndroid Build Coastguard Worker %r1 = load i64, i64* %p 304*9880d681SAndroid Build Coastguard Worker %rv1 = insertvalue { i64, i64 } undef, i64 %r1, 0 305*9880d681SAndroid Build Coastguard Worker store i64 0, i64* %p 306*9880d681SAndroid Build Coastguard Worker %r2 = load i64, i64* %q 307*9880d681SAndroid Build Coastguard Worker %rv2 = insertvalue { i64, i64 } %rv1, i64 %r2, 1 308*9880d681SAndroid Build Coastguard Worker ret { i64, i64 } %rv2 309*9880d681SAndroid Build Coastguard Worker} 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_ret_i64_pair: 312*9880d681SAndroid Build Coastguard Worker; CHECK: call ret_i64_pair 313*9880d681SAndroid Build Coastguard Worker; CHECK: stx %o0, [%i0] 314*9880d681SAndroid Build Coastguard Worker; CHECK: stx %o1, [%i0] 315*9880d681SAndroid Build Coastguard Workerdefine void @call_ret_i64_pair(i64* %i0) { 316*9880d681SAndroid Build Coastguard Worker %rv = call { i64, i64 } @ret_i64_pair(i32 undef, i32 undef, 317*9880d681SAndroid Build Coastguard Worker i64* undef, i64* undef) 318*9880d681SAndroid Build Coastguard Worker %e0 = extractvalue { i64, i64 } %rv, 0 319*9880d681SAndroid Build Coastguard Worker store i64 %e0, i64* %i0 320*9880d681SAndroid Build Coastguard Worker %e1 = extractvalue { i64, i64 } %rv, 1 321*9880d681SAndroid Build Coastguard Worker store i64 %e1, i64* %i0 322*9880d681SAndroid Build Coastguard Worker ret void 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; This is not a C struct, the i32 member uses 8 bytes, but the float only 4. 326*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_i32_float_pair: 327*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%i2], %i0 328*9880d681SAndroid Build Coastguard Worker; HARD: ld [%i3], %f2 329*9880d681SAndroid Build Coastguard Worker; SOFT: ld [%i3], %i1 330*9880d681SAndroid Build Coastguard Workerdefine { i32, float } @ret_i32_float_pair(i32 %a0, i32 %a1, 331*9880d681SAndroid Build Coastguard Worker i32* %p, float* %q) { 332*9880d681SAndroid Build Coastguard Worker %r1 = load i32, i32* %p 333*9880d681SAndroid Build Coastguard Worker %rv1 = insertvalue { i32, float } undef, i32 %r1, 0 334*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %p 335*9880d681SAndroid Build Coastguard Worker %r2 = load float, float* %q 336*9880d681SAndroid Build Coastguard Worker %rv2 = insertvalue { i32, float } %rv1, float %r2, 1 337*9880d681SAndroid Build Coastguard Worker ret { i32, float } %rv2 338*9880d681SAndroid Build Coastguard Worker} 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_ret_i32_float_pair: 341*9880d681SAndroid Build Coastguard Worker; CHECK: call ret_i32_float_pair 342*9880d681SAndroid Build Coastguard Worker; CHECK: st %o0, [%i0] 343*9880d681SAndroid Build Coastguard Worker; HARD: st %f2, [%i1] 344*9880d681SAndroid Build Coastguard Worker; SOFT: st %o1, [%i1] 345*9880d681SAndroid Build Coastguard Workerdefine void @call_ret_i32_float_pair(i32* %i0, float* %i1) { 346*9880d681SAndroid Build Coastguard Worker %rv = call { i32, float } @ret_i32_float_pair(i32 undef, i32 undef, 347*9880d681SAndroid Build Coastguard Worker i32* undef, float* undef) 348*9880d681SAndroid Build Coastguard Worker %e0 = extractvalue { i32, float } %rv, 0 349*9880d681SAndroid Build Coastguard Worker store i32 %e0, i32* %i0 350*9880d681SAndroid Build Coastguard Worker %e1 = extractvalue { i32, float } %rv, 1 351*9880d681SAndroid Build Coastguard Worker store float %e1, float* %i1 352*9880d681SAndroid Build Coastguard Worker ret void 353*9880d681SAndroid Build Coastguard Worker} 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker; This is a C struct, each member uses 4 bytes. 356*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_i32_float_packed: 357*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%i2], [[R:%[gilo][0-7]]] 358*9880d681SAndroid Build Coastguard Worker; HARD: ld [%i3], %f1 359*9880d681SAndroid Build Coastguard Worker; SOFT: ld [%i3], %i1 360*9880d681SAndroid Build Coastguard Worker; CHECK: sllx [[R]], 32, %i0 361*9880d681SAndroid Build Coastguard Workerdefine inreg { i32, float } @ret_i32_float_packed(i32 %a0, i32 %a1, 362*9880d681SAndroid Build Coastguard Worker i32* %p, float* %q) { 363*9880d681SAndroid Build Coastguard Worker %r1 = load i32, i32* %p 364*9880d681SAndroid Build Coastguard Worker %rv1 = insertvalue { i32, float } undef, i32 %r1, 0 365*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %p 366*9880d681SAndroid Build Coastguard Worker %r2 = load float, float* %q 367*9880d681SAndroid Build Coastguard Worker %rv2 = insertvalue { i32, float } %rv1, float %r2, 1 368*9880d681SAndroid Build Coastguard Worker ret { i32, float } %rv2 369*9880d681SAndroid Build Coastguard Worker} 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_ret_i32_float_packed: 372*9880d681SAndroid Build Coastguard Worker; CHECK: call ret_i32_float_packed 373*9880d681SAndroid Build Coastguard Worker; CHECK: srlx %o0, 32, [[R:%[gilo][0-7]]] 374*9880d681SAndroid Build Coastguard Worker; CHECK: st [[R]], [%i0] 375*9880d681SAndroid Build Coastguard Worker; HARD: st %f1, [%i1] 376*9880d681SAndroid Build Coastguard Worker; SOFT: st %o0, [%i1] 377*9880d681SAndroid Build Coastguard Workerdefine void @call_ret_i32_float_packed(i32* %i0, float* %i1) { 378*9880d681SAndroid Build Coastguard Worker %rv = call { i32, float } @ret_i32_float_packed(i32 undef, i32 undef, 379*9880d681SAndroid Build Coastguard Worker i32* undef, float* undef) 380*9880d681SAndroid Build Coastguard Worker %e0 = extractvalue { i32, float } %rv, 0 381*9880d681SAndroid Build Coastguard Worker store i32 %e0, i32* %i0 382*9880d681SAndroid Build Coastguard Worker %e1 = extractvalue { i32, float } %rv, 1 383*9880d681SAndroid Build Coastguard Worker store float %e1, float* %i1 384*9880d681SAndroid Build Coastguard Worker ret void 385*9880d681SAndroid Build Coastguard Worker} 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Worker; The C frontend should use i64 to return { i32, i32 } structs, but verify that 388*9880d681SAndroid Build Coastguard Worker; we don't miscompile thi case where both struct elements are placed in %i0. 389*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_i32_packed: 390*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%i2], [[R1:%[gilo][0-7]]] 391*9880d681SAndroid Build Coastguard Worker; CHECK: ld [%i3], [[R2:%[gilo][0-7]]] 392*9880d681SAndroid Build Coastguard Worker; CHECK: sllx [[R2]], 32, [[R3:%[gilo][0-7]]] 393*9880d681SAndroid Build Coastguard Worker; CHECK: or [[R3]], [[R1]], %i0 394*9880d681SAndroid Build Coastguard Workerdefine inreg { i32, i32 } @ret_i32_packed(i32 %a0, i32 %a1, 395*9880d681SAndroid Build Coastguard Worker i32* %p, i32* %q) { 396*9880d681SAndroid Build Coastguard Worker %r1 = load i32, i32* %p 397*9880d681SAndroid Build Coastguard Worker %rv1 = insertvalue { i32, i32 } undef, i32 %r1, 1 398*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %p 399*9880d681SAndroid Build Coastguard Worker %r2 = load i32, i32* %q 400*9880d681SAndroid Build Coastguard Worker %rv2 = insertvalue { i32, i32 } %rv1, i32 %r2, 0 401*9880d681SAndroid Build Coastguard Worker ret { i32, i32 } %rv2 402*9880d681SAndroid Build Coastguard Worker} 403*9880d681SAndroid Build Coastguard Worker 404*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: call_ret_i32_packed: 405*9880d681SAndroid Build Coastguard Worker; CHECK: call ret_i32_packed 406*9880d681SAndroid Build Coastguard Worker; CHECK: srlx %o0, 32, [[R:%[gilo][0-7]]] 407*9880d681SAndroid Build Coastguard Worker; CHECK: st [[R]], [%i0] 408*9880d681SAndroid Build Coastguard Worker; CHECK: st %o0, [%i1] 409*9880d681SAndroid Build Coastguard Workerdefine void @call_ret_i32_packed(i32* %i0, i32* %i1) { 410*9880d681SAndroid Build Coastguard Worker %rv = call { i32, i32 } @ret_i32_packed(i32 undef, i32 undef, 411*9880d681SAndroid Build Coastguard Worker i32* undef, i32* undef) 412*9880d681SAndroid Build Coastguard Worker %e0 = extractvalue { i32, i32 } %rv, 0 413*9880d681SAndroid Build Coastguard Worker store i32 %e0, i32* %i0 414*9880d681SAndroid Build Coastguard Worker %e1 = extractvalue { i32, i32 } %rv, 1 415*9880d681SAndroid Build Coastguard Worker store i32 %e1, i32* %i1 416*9880d681SAndroid Build Coastguard Worker ret void 417*9880d681SAndroid Build Coastguard Worker} 418*9880d681SAndroid Build Coastguard Worker 419*9880d681SAndroid Build Coastguard Worker; The return value must be sign-extended to 64 bits. 420*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_sext: 421*9880d681SAndroid Build Coastguard Worker; CHECK: sra %i0, 0, %i0 422*9880d681SAndroid Build Coastguard Workerdefine signext i32 @ret_sext(i32 %a0) { 423*9880d681SAndroid Build Coastguard Worker ret i32 %a0 424*9880d681SAndroid Build Coastguard Worker} 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_zext: 427*9880d681SAndroid Build Coastguard Worker; CHECK: srl %i0, 0, %i0 428*9880d681SAndroid Build Coastguard Workerdefine zeroext i32 @ret_zext(i32 %a0) { 429*9880d681SAndroid Build Coastguard Worker ret i32 %a0 430*9880d681SAndroid Build Coastguard Worker} 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_nosext: 433*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: sra 434*9880d681SAndroid Build Coastguard Workerdefine signext i32 @ret_nosext(i32 signext %a0) { 435*9880d681SAndroid Build Coastguard Worker ret i32 %a0 436*9880d681SAndroid Build Coastguard Worker} 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_nozext: 439*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: srl 440*9880d681SAndroid Build Coastguard Workerdefine signext i32 @ret_nozext(i32 signext %a0) { 441*9880d681SAndroid Build Coastguard Worker ret i32 %a0 442*9880d681SAndroid Build Coastguard Worker} 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_register_directive: 445*9880d681SAndroid Build Coastguard Worker; CHECK: .register %g2, #scratch 446*9880d681SAndroid Build Coastguard Worker; CHECK: .register %g3, #scratch 447*9880d681SAndroid Build Coastguard Worker; CHECK: add %i0, 2, %g2 448*9880d681SAndroid Build Coastguard Worker; CHECK: add %i0, 3, %g3 449*9880d681SAndroid Build Coastguard Workerdefine i32 @test_register_directive(i32 %i0) { 450*9880d681SAndroid Build Coastguard Workerentry: 451*9880d681SAndroid Build Coastguard Worker %0 = add nsw i32 %i0, 2 452*9880d681SAndroid Build Coastguard Worker %1 = add nsw i32 %i0, 3 453*9880d681SAndroid Build Coastguard Worker tail call void asm sideeffect "", "r,r,~{l0},~{l1},~{l2},~{l3},~{l4},~{l5},~{l6},~{l7},~{i0},~{i1},~{i2},~{i3},~{i4},~{i5},~{i6},~{i7},~{o0},~{o1},~{o2},~{o3},~{o4},~{o5},~{o6},~{o7},~{g1},~{g4},~{g5},~{g6},~{g7}"(i32 %0, i32 %1) 454*9880d681SAndroid Build Coastguard Worker %2 = add nsw i32 %0, %1 455*9880d681SAndroid Build Coastguard Worker ret i32 %2 456*9880d681SAndroid Build Coastguard Worker} 457*9880d681SAndroid Build Coastguard Worker 458*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_large_stack: 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Worker; CHECK: sethi 16, %g1 461*9880d681SAndroid Build Coastguard Worker; CHECK: xor %g1, -176, %g1 462*9880d681SAndroid Build Coastguard Worker; CHECK: save %sp, %g1, %sp 463*9880d681SAndroid Build Coastguard Worker 464*9880d681SAndroid Build Coastguard Worker; CHECK: sethi 14, %g1 465*9880d681SAndroid Build Coastguard Worker; CHECK: xor %g1, -1, %g1 466*9880d681SAndroid Build Coastguard Worker; CHECK: add %g1, %fp, %g1 467*9880d681SAndroid Build Coastguard Worker; CHECK: call use_buf 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Workerdefine i32 @test_large_stack() { 470*9880d681SAndroid Build Coastguard Workerentry: 471*9880d681SAndroid Build Coastguard Worker %buffer1 = alloca [16384 x i8], align 8 472*9880d681SAndroid Build Coastguard Worker %buffer1.sub = getelementptr inbounds [16384 x i8], [16384 x i8]* %buffer1, i32 0, i32 0 473*9880d681SAndroid Build Coastguard Worker %0 = call i32 @use_buf(i32 16384, i8* %buffer1.sub) 474*9880d681SAndroid Build Coastguard Worker ret i32 %0 475*9880d681SAndroid Build Coastguard Worker} 476*9880d681SAndroid Build Coastguard Worker 477*9880d681SAndroid Build Coastguard Workerdeclare i32 @use_buf(i32, i8*) 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fp128_args: 480*9880d681SAndroid Build Coastguard Worker; HARD-DAG: std %f0, [%fp+{{.+}}] 481*9880d681SAndroid Build Coastguard Worker; HARD-DAG: std %f2, [%fp+{{.+}}] 482*9880d681SAndroid Build Coastguard Worker; HARD-DAG: std %f6, [%fp+{{.+}}] 483*9880d681SAndroid Build Coastguard Worker; HARD-DAG: std %f4, [%fp+{{.+}}] 484*9880d681SAndroid Build Coastguard Worker; HARD: add %fp, [[Offset:[0-9]+]], %o0 485*9880d681SAndroid Build Coastguard Worker; HARD: call _Qp_add 486*9880d681SAndroid Build Coastguard Worker; HARD: ldd [%fp+[[Offset]]], %f0 487*9880d681SAndroid Build Coastguard Worker; SOFT-DAG: mov %i0, %o0 488*9880d681SAndroid Build Coastguard Worker; SOFT-DAG: mov %i1, %o1 489*9880d681SAndroid Build Coastguard Worker; SOFT-DAG: mov %i2, %o2 490*9880d681SAndroid Build Coastguard Worker; SOFT-DAG: mov %i3, %o3 491*9880d681SAndroid Build Coastguard Worker; SOFT: call __addtf3 492*9880d681SAndroid Build Coastguard Worker; SOFT: mov %o0, %i0 493*9880d681SAndroid Build Coastguard Worker; SOFT: mov %o1, %i1 494*9880d681SAndroid Build Coastguard Worker 495*9880d681SAndroid Build Coastguard Workerdefine fp128 @test_fp128_args(fp128 %a, fp128 %b) { 496*9880d681SAndroid Build Coastguard Workerentry: 497*9880d681SAndroid Build Coastguard Worker %0 = fadd fp128 %a, %b 498*9880d681SAndroid Build Coastguard Worker ret fp128 %0 499*9880d681SAndroid Build Coastguard Worker} 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Workerdeclare i64 @receive_fp128(i64 %a, ...) 502*9880d681SAndroid Build Coastguard Worker 503*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fp128_variable_args: 504*9880d681SAndroid Build Coastguard Worker; HARD-DAG: std %f4, [%sp+[[Offset0:[0-9]+]]] 505*9880d681SAndroid Build Coastguard Worker; HARD-DAG: std %f6, [%sp+[[Offset1:[0-9]+]]] 506*9880d681SAndroid Build Coastguard Worker; HARD-DAG: ldx [%sp+[[Offset0]]], %o2 507*9880d681SAndroid Build Coastguard Worker; HARD-DAG: ldx [%sp+[[Offset1]]], %o3 508*9880d681SAndroid Build Coastguard Worker; SOFT-DAG: mov %i0, %o0 509*9880d681SAndroid Build Coastguard Worker; SOFT-DAG: mov %i1, %o1 510*9880d681SAndroid Build Coastguard Worker; SOFT-DAG: mov %i2, %o2 511*9880d681SAndroid Build Coastguard Worker; CHECK: call receive_fp128 512*9880d681SAndroid Build Coastguard Workerdefine i64 @test_fp128_variable_args(i64 %a, fp128 %b) { 513*9880d681SAndroid Build Coastguard Workerentry: 514*9880d681SAndroid Build Coastguard Worker %0 = call i64 (i64, ...) @receive_fp128(i64 %a, fp128 %b) 515*9880d681SAndroid Build Coastguard Worker ret i64 %0 516*9880d681SAndroid Build Coastguard Worker} 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_call_libfunc: 519*9880d681SAndroid Build Coastguard Worker; HARD: st %f1, [%fp+[[Offset0:[0-9]+]]] 520*9880d681SAndroid Build Coastguard Worker; HARD: fmovs %f3, %f1 521*9880d681SAndroid Build Coastguard Worker; SOFT: srl %i1, 0, %o0 522*9880d681SAndroid Build Coastguard Worker; CHECK: call cosf 523*9880d681SAndroid Build Coastguard Worker; HARD: st %f0, [%fp+[[Offset1:[0-9]+]]] 524*9880d681SAndroid Build Coastguard Worker; HARD: ld [%fp+[[Offset0]]], %f1 525*9880d681SAndroid Build Coastguard Worker; SOFT: mov %o0, %i1 526*9880d681SAndroid Build Coastguard Worker; SOFT: srl %i0, 0, %o0 527*9880d681SAndroid Build Coastguard Worker; CHECK: call sinf 528*9880d681SAndroid Build Coastguard Worker; HARD: ld [%fp+[[Offset1]]], %f1 529*9880d681SAndroid Build Coastguard Worker; HARD: fmuls %f1, %f0, %f0 530*9880d681SAndroid Build Coastguard Worker; SOFT: mov %o0, %i0 531*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i1, %o0 532*9880d681SAndroid Build Coastguard Worker; SOFT: mov %i0, %o1 533*9880d681SAndroid Build Coastguard Worker; SOFT: call __mulsf3 534*9880d681SAndroid Build Coastguard Worker; SOFT: sllx %o0, 32, %i0 535*9880d681SAndroid Build Coastguard Worker 536*9880d681SAndroid Build Coastguard Workerdefine inreg float @test_call_libfunc(float %arg0, float %arg1) { 537*9880d681SAndroid Build Coastguard Workerentry: 538*9880d681SAndroid Build Coastguard Worker %0 = tail call inreg float @cosf(float %arg1) 539*9880d681SAndroid Build Coastguard Worker %1 = tail call inreg float @sinf(float %arg0) 540*9880d681SAndroid Build Coastguard Worker %2 = fmul float %0, %1 541*9880d681SAndroid Build Coastguard Worker ret float %2 542*9880d681SAndroid Build Coastguard Worker} 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Workerdeclare inreg float @cosf(float %arg) readnone nounwind 545*9880d681SAndroid Build Coastguard Workerdeclare inreg float @sinf(float %arg) readnone nounwind 546