xref: /llvm-project/llvm/test/CodeGen/X86/mcu-abi.ll (revision 754d25844a7e5793b1b6523ce223061dba7da7c1)
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