1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=avr | FileCheck %s
3
4define void @add_r_i8(i8 signext %0, i8 signext %1) {
5; CHECK-LABEL: add_r_i8:
6; CHECK:       ; %bb.0:
7; CHECK-NEXT:    mov r20, r22
8; CHECK-NEXT:    mov r22, r24
9; CHECK-NEXT:    ;APP
10; CHECK-NEXT:    mov r24, r22
11; CHECK-NEXT:    add r24, r20
12; CHECK-NEXT:    ;NO_APP
13; CHECK-NEXT:    call foo8
14; CHECK-NEXT:    ret
15  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=r,r,r"(i8 %0, i8 %1)
16  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
17  ret void
18}
19
20declare void @foo8(i8 signext, i8 signext, i8 signext)
21
22define void @add_r_i16(i16 signext %0, i16 signext %1) {
23; CHECK-LABEL: add_r_i16:
24; CHECK:       ; %bb.0:
25; CHECK-NEXT:    mov r20, r22
26; CHECK-NEXT:    mov r21, r23
27; CHECK-NEXT:    mov r22, r24
28; CHECK-NEXT:    mov r23, r25
29; CHECK-NEXT:    ;APP
30; CHECK-NEXT:    mov r24, r22
31; CHECK-NEXT:    mov r25, r23
32; CHECK-NEXT:    add r24, r20
33; CHECK-NEXT:    adc r25, r21
34; CHECK-NEXT:    ;NO_APP
35; CHECK-NEXT:    call foo16
36; CHECK-NEXT:    ret
37  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=r,r,r"(i16 %0, i16 %1)
38  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
39  ret void
40}
41
42declare void @foo16(i16 signext, i16 signext, i16 signext)
43
44define void @add_a_i8(i8 signext %0, i8 signext %1) {
45; CHECK-LABEL: add_a_i8:
46; CHECK:       ; %bb.0:
47; CHECK-NEXT:    mov r20, r22
48; CHECK-NEXT:    mov r22, r24
49; CHECK-NEXT:    ;APP
50; CHECK-NEXT:    mov r23, r22
51; CHECK-NEXT:    add r23, r20
52; CHECK-NEXT:    ;NO_APP
53; CHECK-NEXT:    mov r24, r23
54; CHECK-NEXT:    call foo8
55; CHECK-NEXT:    ret
56  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=a,a,a"(i8 %0, i8 %1)
57  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
58  ret void
59}
60
61define void @add_a_i16(i16 signext %0, i16 signext %1) {
62; CHECK-LABEL: add_a_i16:
63; CHECK:       ; %bb.0:
64; CHECK-NEXT:    mov r20, r22
65; CHECK-NEXT:    mov r21, r23
66; CHECK-NEXT:    mov r22, r24
67; CHECK-NEXT:    mov r23, r25
68; CHECK-NEXT:    ;APP
69; CHECK-NEXT:    mov r18, r22
70; CHECK-NEXT:    mov r19, r23
71; CHECK-NEXT:    add r18, r20
72; CHECK-NEXT:    adc r19, r21
73; CHECK-NEXT:    ;NO_APP
74; CHECK-NEXT:    mov r24, r18
75; CHECK-NEXT:    mov r25, r19
76; CHECK-NEXT:    call foo16
77; CHECK-NEXT:    ret
78  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=a,a,a"(i16 %0, i16 %1)
79  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
80  ret void
81}
82
83define void @add_d_i8(i8 signext %0, i8 signext %1) {
84; CHECK-LABEL: add_d_i8:
85; CHECK:       ; %bb.0:
86; CHECK-NEXT:    mov r20, r22
87; CHECK-NEXT:    mov r22, r24
88; CHECK-NEXT:    ;APP
89; CHECK-NEXT:    mov r24, r22
90; CHECK-NEXT:    add r24, r20
91; CHECK-NEXT:    ;NO_APP
92; CHECK-NEXT:    call foo8
93; CHECK-NEXT:    ret
94  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=d,d,d"(i8 %0, i8 %1)
95  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
96  ret void
97}
98
99define void @add_d_i16(i16 signext %0, i16 signext %1) {
100; CHECK-LABEL: add_d_i16:
101; CHECK:       ; %bb.0:
102; CHECK-NEXT:    mov r20, r22
103; CHECK-NEXT:    mov r21, r23
104; CHECK-NEXT:    mov r22, r24
105; CHECK-NEXT:    mov r23, r25
106; CHECK-NEXT:    ;APP
107; CHECK-NEXT:    mov r24, r22
108; CHECK-NEXT:    mov r25, r23
109; CHECK-NEXT:    add r24, r20
110; CHECK-NEXT:    adc r25, r21
111; CHECK-NEXT:    ;NO_APP
112; CHECK-NEXT:    call foo16
113; CHECK-NEXT:    ret
114  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=d,d,d"(i16 %0, i16 %1)
115  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
116  ret void
117}
118
119define void @add_l_i8(i8 signext %0, i8 signext %1) {
120; CHECK-LABEL: add_l_i8:
121; CHECK:       ; %bb.0:
122; CHECK-NEXT:    push r13
123; CHECK-NEXT:    push r14
124; CHECK-NEXT:    push r15
125; CHECK-NEXT:    mov r15, r22
126; CHECK-NEXT:    mov r14, r24
127; CHECK-NEXT:    ;APP
128; CHECK-NEXT:    mov r13, r14
129; CHECK-NEXT:    add r13, r15
130; CHECK-NEXT:    ;NO_APP
131; CHECK-NEXT:    mov r24, r13
132; CHECK-NEXT:    mov r22, r14
133; CHECK-NEXT:    mov r20, r15
134; CHECK-NEXT:    call foo8
135; CHECK-NEXT:    pop r15
136; CHECK-NEXT:    pop r14
137; CHECK-NEXT:    pop r13
138; CHECK-NEXT:    ret
139  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=l,l,l"(i8 %0, i8 %1)
140  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
141  ret void
142}
143
144define void @add_l_i16(i16 signext %0, i16 signext %1) {
145; CHECK-LABEL: add_l_i16:
146; CHECK:       ; %bb.0:
147; CHECK-NEXT:    push r10
148; CHECK-NEXT:    push r11
149; CHECK-NEXT:    push r12
150; CHECK-NEXT:    push r13
151; CHECK-NEXT:    push r14
152; CHECK-NEXT:    push r15
153; CHECK-NEXT:    mov r14, r22
154; CHECK-NEXT:    mov r15, r23
155; CHECK-NEXT:    mov r12, r24
156; CHECK-NEXT:    mov r13, r25
157; CHECK-NEXT:    ;APP
158; CHECK-NEXT:    mov r10, r12
159; CHECK-NEXT:    mov r11, r13
160; CHECK-NEXT:    add r10, r14
161; CHECK-NEXT:    adc r11, r15
162; CHECK-NEXT:    ;NO_APP
163; CHECK-NEXT:    mov r24, r10
164; CHECK-NEXT:    mov r25, r11
165; CHECK-NEXT:    mov r22, r12
166; CHECK-NEXT:    mov r23, r13
167; CHECK-NEXT:    mov r20, r14
168; CHECK-NEXT:    mov r21, r15
169; CHECK-NEXT:    call foo16
170; CHECK-NEXT:    pop r15
171; CHECK-NEXT:    pop r14
172; CHECK-NEXT:    pop r13
173; CHECK-NEXT:    pop r12
174; CHECK-NEXT:    pop r11
175; CHECK-NEXT:    pop r10
176; CHECK-NEXT:    ret
177  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=l,l,l"(i16 %0, i16 %1)
178  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
179  ret void
180}
181
182define void @add_b_i8(i8 signext %0, i8 signext %1) {
183; CHECK-LABEL: add_b_i8:
184; CHECK:       ; %bb.0:
185; CHECK-NEXT:    mov r20, r22
186; CHECK-NEXT:    mov r22, r24
187; CHECK-NEXT:    mov r30, r22
188; CHECK-NEXT:    ;APP
189; CHECK-NEXT:    mov r30, r30
190; CHECK-NEXT:    add r30, r20
191; CHECK-NEXT:    ;NO_APP
192; CHECK-NEXT:    mov r24, r30
193; CHECK-NEXT:    call foo8
194; CHECK-NEXT:    ret
195  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=b,b,r"(i8 %0, i8 %1)
196  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
197  ret void
198}
199
200define void @add_b_i16(i16 signext %0, i16 signext %1) {
201; CHECK-LABEL: add_b_i16:
202; CHECK:       ; %bb.0:
203; CHECK-NEXT:    mov r20, r22
204; CHECK-NEXT:    mov r21, r23
205; CHECK-NEXT:    mov r22, r24
206; CHECK-NEXT:    mov r23, r25
207; CHECK-NEXT:    mov r30, r22
208; CHECK-NEXT:    mov r31, r23
209; CHECK-NEXT:    ;APP
210; CHECK-NEXT:    mov r30, r30
211; CHECK-NEXT:    mov r31, r31
212; CHECK-NEXT:    add r30, r20
213; CHECK-NEXT:    adc r31, r21
214; CHECK-NEXT:    ;NO_APP
215; CHECK-NEXT:    mov r24, r30
216; CHECK-NEXT:    mov r25, r31
217; CHECK-NEXT:    call foo16
218; CHECK-NEXT:    ret
219  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=b,b,r"(i16 %0, i16 %1)
220  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
221  ret void
222}
223
224define void @add_e_i8(i8 signext %0, i8 signext %1) {
225; CHECK-LABEL: add_e_i8:
226; CHECK:       ; %bb.0:
227; CHECK-NEXT:    mov r30, r22
228; CHECK-NEXT:    mov r22, r24
229; CHECK-NEXT:    mov r26, r22
230; CHECK-NEXT:    mov r27, r23
231; CHECK-NEXT:    ;APP
232; CHECK-NEXT:    mov r26, r26
233; CHECK-NEXT:    add r26, r30
234; CHECK-NEXT:    ;NO_APP
235; CHECK-NEXT:    mov r24, r26
236; CHECK-NEXT:    ; kill: def $r22 killed $r22 killed $r23r22
237; CHECK-NEXT:    mov r20, r30
238; CHECK-NEXT:    call foo8
239; CHECK-NEXT:    ret
240  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=e,e,e"(i8 %0, i8 %1)
241  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
242  ret void
243}
244
245define void @add_e_i16(i16 signext %0, i16 signext %1) {
246; CHECK-LABEL: add_e_i16:
247; CHECK:       ; %bb.0:
248; CHECK-NEXT:    mov r30, r22
249; CHECK-NEXT:    mov r31, r23
250; CHECK-NEXT:    mov r22, r24
251; CHECK-NEXT:    mov r23, r25
252; CHECK-NEXT:    mov r26, r22
253; CHECK-NEXT:    mov r27, r23
254; CHECK-NEXT:    ;APP
255; CHECK-NEXT:    mov r26, r26
256; CHECK-NEXT:    mov r27, r27
257; CHECK-NEXT:    add r26, r30
258; CHECK-NEXT:    adc r27, r31
259; CHECK-NEXT:    ;NO_APP
260; CHECK-NEXT:    mov r24, r26
261; CHECK-NEXT:    mov r25, r27
262; CHECK-NEXT:    mov r20, r30
263; CHECK-NEXT:    mov r21, r31
264; CHECK-NEXT:    call foo16
265; CHECK-NEXT:    ret
266  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=e,e,e"(i16 %0, i16 %1)
267  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
268  ret void
269}
270
271define void @add_t_i8(i8 signext %0, i8 signext %1) {
272; CHECK-LABEL: add_t_i8:
273; CHECK:       ; %bb.0:
274; CHECK-NEXT:    mov r20, r22
275; CHECK-NEXT:    mov r22, r24
276; CHECK-NEXT:    ;APP
277; CHECK-NEXT:    mov r0, r22
278; CHECK-NEXT:    add r0, r20
279; CHECK-NEXT:    ;NO_APP
280; CHECK-NEXT:    mov r24, r0
281; CHECK-NEXT:    call foo8
282; CHECK-NEXT:    ret
283  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=t,r,r"(i8 %0, i8 %1)
284  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
285  ret void
286}
287
288define void @add_w_i8(i8 signext %0, i8 signext %1) {
289; CHECK-LABEL: add_w_i8:
290; CHECK:       ; %bb.0:
291; CHECK-NEXT:    mov r26, r22
292; CHECK-NEXT:    mov r30, r24
293; CHECK-NEXT:    ;APP
294; CHECK-NEXT:    mov r24, r30
295; CHECK-NEXT:    add r24, r26
296; CHECK-NEXT:    ;NO_APP
297; CHECK-NEXT:    ; kill: def $r24 killed $r24 killed $r25r24
298; CHECK-NEXT:    mov r22, r30
299; CHECK-NEXT:    mov r20, r26
300; CHECK-NEXT:    call foo8
301; CHECK-NEXT:    ret
302  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=w,w,w"(i8 %0, i8 %1)
303  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
304  ret void
305}
306
307define void @add_w_i16(i16 signext %0, i16 signext %1) {
308; CHECK-LABEL: add_w_i16:
309; CHECK:       ; %bb.0:
310; CHECK-NEXT:    mov r26, r22
311; CHECK-NEXT:    mov r27, r23
312; CHECK-NEXT:    mov r30, r24
313; CHECK-NEXT:    mov r31, r25
314; CHECK-NEXT:    ;APP
315; CHECK-NEXT:    mov r24, r30
316; CHECK-NEXT:    mov r25, r31
317; CHECK-NEXT:    add r24, r26
318; CHECK-NEXT:    adc r25, r27
319; CHECK-NEXT:    ;NO_APP
320; CHECK-NEXT:    mov r22, r30
321; CHECK-NEXT:    mov r23, r31
322; CHECK-NEXT:    mov r20, r26
323; CHECK-NEXT:    mov r21, r27
324; CHECK-NEXT:    call foo16
325; CHECK-NEXT:    ret
326  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=w,w,w"(i16 %0, i16 %1)
327  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
328  ret void
329}
330
331define void @add_xyz_i8(i8 signext %0, i8 signext %1) {
332; CHECK-LABEL: add_xyz_i8:
333; CHECK:       ; %bb.0:
334; CHECK-NEXT:    push r28
335; CHECK-NEXT:    push r29
336; CHECK-NEXT:    mov r20, r22
337; CHECK-NEXT:    mov r22, r24
338; CHECK-NEXT:    mov r28, r22
339; CHECK-NEXT:    mov r29, r23
340; CHECK-NEXT:    mov r26, r20
341; CHECK-NEXT:    mov r27, r21
342; CHECK-NEXT:    ;APP
343; CHECK-NEXT:    mov r30, r28
344; CHECK-NEXT:    add r30, r26
345; CHECK-NEXT:    ;NO_APP
346; CHECK-NEXT:    mov r24, r30
347; CHECK-NEXT:    mov r25, r31
348; CHECK-NEXT:    ; kill: def $r24 killed $r24 killed $r25r24
349; CHECK-NEXT:    ; kill: def $r22 killed $r22 killed $r23r22
350; CHECK-NEXT:    ; kill: def $r20 killed $r20 killed $r21r20
351; CHECK-NEXT:    call foo8
352; CHECK-NEXT:    pop r29
353; CHECK-NEXT:    pop r28
354; CHECK-NEXT:    ret
355  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=z,y,x"(i8 %0, i8 %1)
356  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
357  ret void
358}
359
360define void @add_xyz_i16(i16 signext %0, i16 signext %1) {
361; CHECK-LABEL: add_xyz_i16:
362; CHECK:       ; %bb.0:
363; CHECK-NEXT:    push r28
364; CHECK-NEXT:    push r29
365; CHECK-NEXT:    mov r20, r22
366; CHECK-NEXT:    mov r21, r23
367; CHECK-NEXT:    mov r22, r24
368; CHECK-NEXT:    mov r23, r25
369; CHECK-NEXT:    mov r28, r22
370; CHECK-NEXT:    mov r29, r23
371; CHECK-NEXT:    mov r26, r20
372; CHECK-NEXT:    mov r27, r21
373; CHECK-NEXT:    ;APP
374; CHECK-NEXT:    mov r30, r28
375; CHECK-NEXT:    mov r31, r29
376; CHECK-NEXT:    add r30, r26
377; CHECK-NEXT:    adc r31, r27
378; CHECK-NEXT:    ;NO_APP
379; CHECK-NEXT:    mov r24, r30
380; CHECK-NEXT:    mov r25, r31
381; CHECK-NEXT:    call foo16
382; CHECK-NEXT:    pop r29
383; CHECK-NEXT:    pop r28
384; CHECK-NEXT:    ret
385  %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=z,y,x"(i16 %0, i16 %1)
386  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
387  ret void
388}
389