1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-pc-elfiamcu | FileCheck %s 3 4%struct.st12_t = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 } 5 6define i32 @test_ints(i32 %a, i32 %b, i32 %c, i32 %d) #0 { 7; CHECK-LABEL: test_ints: 8; CHECK: # %bb.0: # %entry 9; CHECK-NEXT: addl %edx, %eax 10; CHECK-NEXT: imull %ecx, %eax 11; CHECK-NEXT: addl {{[0-9]+}}(%esp), %eax 12; CHECK-NEXT: retl 13entry: 14 %r1 = add i32 %b, %a 15 %r2 = mul i32 %c, %r1 16 %r3 = add i32 %d, %r2 17 ret i32 %r3 18} 19 20define i32 @test_floats(i32 %a, i32 %b, float %c, float %d) #0 { 21; CHECK-LABEL: test_floats: 22; CHECK: # %bb.0: # %entry 23; CHECK-NEXT: addl %edx, %eax 24; CHECK-NEXT: imull %ecx, %eax 25; CHECK-NEXT: addl {{[0-9]+}}(%esp), %eax 26; CHECK-NEXT: retl 27entry: 28 %ci = bitcast float %c to i32 29 %di = bitcast float %d to i32 30 %r1 = add i32 %b, %a 31 %r2 = mul i32 %ci, %r1 32 %r3 = add i32 %di, %r2 33 ret i32 %r3 34} 35 36define double @test_doubles(double %d1, double %d2) #0 { 37; CHECK-LABEL: test_doubles: 38; CHECK: # %bb.0: # %entry 39; CHECK-NEXT: addl {{[0-9]+}}(%esp), %eax 40; CHECK-NEXT: adcl {{[0-9]+}}(%esp), %edx 41; CHECK-NEXT: retl 42entry: 43 %d1i = bitcast double %d1 to i64 44 %d2i = bitcast double %d2 to i64 45 %r = add i64 %d1i, %d2i 46 %rd = bitcast i64 %r to double 47 ret double %rd 48} 49 50define double @test_mixed_doubles(double %d2, i32 %i) #0 { 51; CHECK-LABEL: test_mixed_doubles: 52; CHECK: # %bb.0: # %entry 53; CHECK-NEXT: addl %ecx, %eax 54; CHECK-NEXT: adcl $0, %edx 55; CHECK-NEXT: retl 56entry: 57 %iext = zext i32 %i to i64 58 %d2i = bitcast double %d2 to i64 59 %r = add i64 %iext, %d2i 60 %rd = bitcast i64 %r to double 61 ret double %rd 62} 63 64define void @ret_large_struct(ptr noalias nocapture sret(%struct.st12_t) %agg.result, ptr byval(%struct.st12_t) nocapture readonly align 4 %r) #0 { 65; CHECK-LABEL: ret_large_struct: 66; CHECK: # %bb.0: # %entry 67; CHECK-NEXT: pushl %edi 68; CHECK-NEXT: pushl %esi 69; CHECK-NEXT: leal {{[0-9]+}}(%esp), %esi 70; CHECK-NEXT: movl $12, %ecx 71; CHECK-NEXT: movl %eax, %edi 72; CHECK-NEXT: rep;movsl (%esi), %es:(%edi) 73; CHECK-NEXT: popl %esi 74; CHECK-NEXT: popl %edi 75; CHECK-NEXT: retl 76entry: 77 call void @llvm.memcpy.p0.p0.i32(ptr %agg.result, ptr %r, i32 48, i1 false) 78 ret void 79} 80 81define i32 @var_args(i32 %i1, ...) #0 { 82; CHECK-LABEL: var_args: 83; CHECK: # %bb.0: # %entry 84; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 85; CHECK-NEXT: retl 86entry: 87 ret i32 %i1 88} 89 90%struct.S = type { i8 } 91 92define i32 @test_lib_args(float %a, float %b) #0 { 93; CHECK-LABEL: test_lib_args: 94; CHECK: # %bb.0: 95; CHECK-NEXT: movl %edx, %eax 96; CHECK-NEXT: calll __fixsfsi 97; CHECK-NEXT: retl 98 %ret = fptosi float %b to i32 99 ret i32 %ret 100} 101 102define i32 @test_fp128(ptr %ptr) #0 { 103; CHECK-LABEL: test_fp128: 104; CHECK: # %bb.0: 105; CHECK-NEXT: pushl 12(%eax) 106; CHECK-NEXT: pushl 8(%eax) 107; CHECK-NEXT: pushl 4(%eax) 108; CHECK-NEXT: pushl (%eax) 109; CHECK-NEXT: calll __fixtfsi 110; CHECK-NEXT: addl $16, %esp 111; CHECK-NEXT: retl 112 %v = load fp128, ptr %ptr 113 %ret = fptosi fp128 %v to i32 114 ret i32 %ret 115} 116 117declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture readonly, i32, i1) #1 118 119define void @test_alignment_d() #0 { 120; CHECK-LABEL: test_alignment_d: 121; CHECK: # %bb.0: # %entry 122; CHECK-NEXT: subl $8, %esp 123; CHECK-NEXT: movl $1073741824, {{[0-9]+}}(%esp) # imm = 0x40000000 124; CHECK-NEXT: movl $0, (%esp) 125; CHECK-NEXT: movl %esp, %eax 126; CHECK-NEXT: calll food@PLT 127; CHECK-NEXT: addl $8, %esp 128; CHECK-NEXT: retl 129entry: 130 %d = alloca double 131 store double 2.000000e+00, ptr %d 132 call void @food(ptr inreg %d) 133 ret void 134} 135 136define void @test_alignment_i() #0 { 137; CHECK-LABEL: test_alignment_i: 138; CHECK: # %bb.0: # %entry 139; CHECK-NEXT: subl $8, %esp 140; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp) 141; CHECK-NEXT: movl $2, (%esp) 142; CHECK-NEXT: movl %esp, %eax 143; CHECK-NEXT: calll fooi@PLT 144; CHECK-NEXT: addl $8, %esp 145; CHECK-NEXT: retl 146entry: 147 %i = alloca i64 148 store i64 2, ptr %i 149 call void @fooi(ptr inreg %i) 150 ret void 151} 152 153define void @test_alignment_s() #0 { 154; CHECK-LABEL: test_alignment_s: 155; CHECK: # %bb.0: 156; CHECK-NEXT: pushl %eax 157; CHECK-NEXT: movl %esp, %eax 158; CHECK-NEXT: calll foos@PLT 159; CHECK-NEXT: popl %eax 160; CHECK-NEXT: retl 161 %s = alloca %struct.S, align 4 162 call void @foos(ptr inreg %s) 163 ret void 164} 165 166define void @test_alignment_fp() #0 { 167; CHECK-LABEL: test_alignment_fp: 168; CHECK: # %bb.0: # %entry 169; CHECK-NEXT: subl $16, %esp 170; CHECK-NEXT: movl $1073741824, {{[0-9]+}}(%esp) # imm = 0x40000000 171; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp) 172; CHECK-NEXT: movl $0, {{[0-9]+}}(%esp) 173; CHECK-NEXT: movl $0, (%esp) 174; CHECK-NEXT: movl %esp, %eax 175; CHECK-NEXT: calll foofp@PLT 176; CHECK-NEXT: addl $16, %esp 177; CHECK-NEXT: retl 178entry: 179 %f = alloca fp128 180 store fp128 0xL00000000000000004000000000000000, ptr %f 181 call void @foofp(ptr inreg %f) 182 ret void 183} 184 185declare void @food(ptr inreg) 186declare void @fooi(ptr inreg) 187declare void @foos(ptr inreg) 188declare void @foofp(ptr inreg) 189 190attributes #0 = { nounwind "use-soft-float"="true"} 191attributes #1 = { nounwind argmemonly } 192