1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-pc-elfiamcu | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker%struct.st12_t = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ints: 6*9880d681SAndroid Build Coastguard Worker; CHECK: addl %edx, %eax 7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: imull %ecx, %eax 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addl 4(%esp), %eax 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 10*9880d681SAndroid Build Coastguard Workerdefine i32 @test_ints(i32 %a, i32 %b, i32 %c, i32 %d) #0 { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker %r1 = add i32 %b, %a 13*9880d681SAndroid Build Coastguard Worker %r2 = mul i32 %c, %r1 14*9880d681SAndroid Build Coastguard Worker %r3 = add i32 %d, %r2 15*9880d681SAndroid Build Coastguard Worker ret i32 %r3 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_floats: 19*9880d681SAndroid Build Coastguard Worker; CHECK: addl %edx, %eax 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: imull %ecx, %eax 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addl 4(%esp), %eax 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 23*9880d681SAndroid Build Coastguard Workerdefine i32 @test_floats(i32 %a, i32 %b, float %c, float %d) #0 { 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker %ci = bitcast float %c to i32 26*9880d681SAndroid Build Coastguard Worker %di = bitcast float %d to i32 27*9880d681SAndroid Build Coastguard Worker %r1 = add i32 %b, %a 28*9880d681SAndroid Build Coastguard Worker %r2 = mul i32 %ci, %r1 29*9880d681SAndroid Build Coastguard Worker %r3 = add i32 %di, %r2 30*9880d681SAndroid Build Coastguard Worker ret i32 %r3 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_doubles: 34*9880d681SAndroid Build Coastguard Worker; CHECK: addl 4(%esp), %eax 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adcl 8(%esp), %edx 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 37*9880d681SAndroid Build Coastguard Workerdefine double @test_doubles(double %d1, double %d2) #0 { 38*9880d681SAndroid Build Coastguard Workerentry: 39*9880d681SAndroid Build Coastguard Worker %d1i = bitcast double %d1 to i64 40*9880d681SAndroid Build Coastguard Worker %d2i = bitcast double %d2 to i64 41*9880d681SAndroid Build Coastguard Worker %r = add i64 %d1i, %d2i 42*9880d681SAndroid Build Coastguard Worker %rd = bitcast i64 %r to double 43*9880d681SAndroid Build Coastguard Worker ret double %rd 44*9880d681SAndroid Build Coastguard Worker} 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_mixed_doubles: 47*9880d681SAndroid Build Coastguard Worker; CHECK: addl %ecx, %eax 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: adcl $0, %edx 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 50*9880d681SAndroid Build Coastguard Workerdefine double @test_mixed_doubles(double %d2, i32 %i) #0 { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker %iext = zext i32 %i to i64 53*9880d681SAndroid Build Coastguard Worker %d2i = bitcast double %d2 to i64 54*9880d681SAndroid Build Coastguard Worker %r = add i64 %iext, %d2i 55*9880d681SAndroid Build Coastguard Worker %rd = bitcast i64 %r to double 56*9880d681SAndroid Build Coastguard Worker ret double %rd 57*9880d681SAndroid Build Coastguard Worker} 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ret_large_struct: 60*9880d681SAndroid Build Coastguard Worker; CHECK: pushl %esi 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %eax, %esi 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: leal 8(%esp), %edx 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl $48, %ecx 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: calll memcpy 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movl %esi, %eax 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: popl %esi 67*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: retl $4 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 69*9880d681SAndroid Build Coastguard Workerdefine void @ret_large_struct(%struct.st12_t* noalias nocapture sret %agg.result, %struct.st12_t* byval nocapture readonly align 4 %r) #0 { 70*9880d681SAndroid Build Coastguard Workerentry: 71*9880d681SAndroid Build Coastguard Worker %0 = bitcast %struct.st12_t* %agg.result to i8* 72*9880d681SAndroid Build Coastguard Worker %1 = bitcast %struct.st12_t* %r to i8* 73*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %0, i8* %1, i32 48, i32 1, i1 false) 74*9880d681SAndroid Build Coastguard Worker ret void 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: var_args: 78*9880d681SAndroid Build Coastguard Worker; CHECK: movl 4(%esp), %eax 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 80*9880d681SAndroid Build Coastguard Workerdefine i32 @var_args(i32 %i1, ...) #0 { 81*9880d681SAndroid Build Coastguard Workerentry: 82*9880d681SAndroid Build Coastguard Worker ret i32 %i1 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker%struct.S = type { i8 } 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_lib_args: 88*9880d681SAndroid Build Coastguard Worker; CHECK: movl %edx, %eax 89*9880d681SAndroid Build Coastguard Worker; CHECK: calll __fixsfsi 90*9880d681SAndroid Build Coastguard Workerdefine i32 @test_lib_args(float %a, float %b) #0 { 91*9880d681SAndroid Build Coastguard Worker %ret = fptosi float %b to i32 92*9880d681SAndroid Build Coastguard Worker ret i32 %ret 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fp128: 96*9880d681SAndroid Build Coastguard Worker; CHECK: pushl 12(%eax) 97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl 8(%eax) 98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl 4(%eax) 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pushl (%eax) 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: calll __fixtfsi 101*9880d681SAndroid Build Coastguard Workerdefine i32 @test_fp128(fp128* %ptr) #0 { 102*9880d681SAndroid Build Coastguard Worker %v = load fp128, fp128* %ptr 103*9880d681SAndroid Build Coastguard Worker %ret = fptosi fp128 %v to i32 104*9880d681SAndroid Build Coastguard Worker ret i32 %ret 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1) #1 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_alignment_d: 110*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: andl {{.+}}, %esp 111*9880d681SAndroid Build Coastguard Workerdefine void @test_alignment_d() #0 { 112*9880d681SAndroid Build Coastguard Workerentry: 113*9880d681SAndroid Build Coastguard Worker %d = alloca double 114*9880d681SAndroid Build Coastguard Worker store double 2.000000e+00, double* %d 115*9880d681SAndroid Build Coastguard Worker call void @food(double* inreg %d) 116*9880d681SAndroid Build Coastguard Worker ret void 117*9880d681SAndroid Build Coastguard Worker} 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_alignment_i: 120*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: andl {{.+}}, %esp 121*9880d681SAndroid Build Coastguard Workerdefine void @test_alignment_i() #0 { 122*9880d681SAndroid Build Coastguard Workerentry: 123*9880d681SAndroid Build Coastguard Worker %i = alloca i64 124*9880d681SAndroid Build Coastguard Worker store i64 2, i64* %i 125*9880d681SAndroid Build Coastguard Worker call void @fooi(i64* inreg %i) 126*9880d681SAndroid Build Coastguard Worker ret void 127*9880d681SAndroid Build Coastguard Worker} 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_alignment_s: 131*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: andl {{.+}}, %esp 132*9880d681SAndroid Build Coastguard Workerdefine void @test_alignment_s() #0 { 133*9880d681SAndroid Build Coastguard Worker %s = alloca %struct.S, align 4 134*9880d681SAndroid Build Coastguard Worker call void @foos(%struct.S* inreg %s) 135*9880d681SAndroid Build Coastguard Worker ret void 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_alignment_fp: 140*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: andl {{.+}}, %esp 141*9880d681SAndroid Build Coastguard Workerdefine void @test_alignment_fp() #0 { 142*9880d681SAndroid Build Coastguard Workerentry: 143*9880d681SAndroid Build Coastguard Worker %f = alloca fp128 144*9880d681SAndroid Build Coastguard Worker store fp128 0xL00000000000000004000000000000000, fp128* %f 145*9880d681SAndroid Build Coastguard Worker call void @foofp(fp128* inreg %f) 146*9880d681SAndroid Build Coastguard Worker ret void 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Workerdeclare void @food(double* inreg) 150*9880d681SAndroid Build Coastguard Workerdeclare void @fooi(i64* inreg) 151*9880d681SAndroid Build Coastguard Workerdeclare void @foos(%struct.S* inreg) 152*9880d681SAndroid Build Coastguard Workerdeclare void @foofp(fp128* inreg) 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind "use-soft-float"="true"} 155*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind argmemonly } 156