xref: /llvm-project/llvm/test/CodeGen/AVR/inline-asm/inline-asm3.ll (revision 7bdc80f35c325d148b1ddbdfce7dea8c6ba7af84)
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:    rcall 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:    rcall 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:    rcall 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:    rcall 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:    rcall 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:    rcall 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:    rcall 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:    rcall 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:    rcall 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:    rcall 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:    ;APP
231; CHECK-NEXT:    mov r26, r26
232; CHECK-NEXT:    add r26, r30
233; CHECK-NEXT:    ;NO_APP
234; CHECK-NEXT:    mov r20, r30
235; CHECK-NEXT:    mov r24, r26
236; CHECK-NEXT:    rcall foo8
237; CHECK-NEXT:    ret
238  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=e,e,e"(i8 %0, i8 %1)
239  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
240  ret void
241}
242
243define void @add_e_i16(i16 signext %0, i16 signext %1) {
244; CHECK-LABEL: add_e_i16:
245; CHECK:       ; %bb.0:
246; CHECK-NEXT:    mov r30, r22
247; CHECK-NEXT:    mov r31, r23
248; CHECK-NEXT:    mov r22, r24
249; CHECK-NEXT:    mov r23, r25
250; CHECK-NEXT:    mov r26, r22
251; CHECK-NEXT:    mov r27, r23
252; CHECK-NEXT:    ;APP
253; CHECK-NEXT:    mov r26, r26
254; CHECK-NEXT:    mov r27, r27
255; CHECK-NEXT:    add r26, r30
256; CHECK-NEXT:    adc r27, r31
257; CHECK-NEXT:    ;NO_APP
258; CHECK-NEXT:    mov r24, r26
259; CHECK-NEXT:    mov r25, r27
260; CHECK-NEXT:    mov r20, r30
261; CHECK-NEXT:    mov r21, r31
262; CHECK-NEXT:    rcall foo16
263; CHECK-NEXT:    ret
264  %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)
265  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
266  ret void
267}
268
269define void @add_t_i8(i8 signext %0, i8 signext %1) {
270; CHECK-LABEL: add_t_i8:
271; CHECK:       ; %bb.0:
272; CHECK-NEXT:    mov r20, r22
273; CHECK-NEXT:    mov r22, r24
274; CHECK-NEXT:    ;APP
275; CHECK-NEXT:    mov r0, r22
276; CHECK-NEXT:    add r0, r20
277; CHECK-NEXT:    ;NO_APP
278; CHECK-NEXT:    mov r24, r0
279; CHECK-NEXT:    rcall foo8
280; CHECK-NEXT:    ret
281  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=t,r,r"(i8 %0, i8 %1)
282  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
283  ret void
284}
285
286define void @add_w_i8(i8 signext %0, i8 signext %1) {
287; CHECK-LABEL: add_w_i8:
288; CHECK:       ; %bb.0:
289; CHECK-NEXT:    mov r26, r22
290; CHECK-NEXT:    mov r30, r24
291; CHECK-NEXT:    ;APP
292; CHECK-NEXT:    mov r24, r30
293; CHECK-NEXT:    add r24, r26
294; CHECK-NEXT:    ;NO_APP
295; CHECK-NEXT:    mov r22, r30
296; CHECK-NEXT:    mov r20, r26
297; CHECK-NEXT:    rcall foo8
298; CHECK-NEXT:    ret
299  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=w,w,w"(i8 %0, i8 %1)
300  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
301  ret void
302}
303
304define void @add_w_i16(i16 signext %0, i16 signext %1) {
305; CHECK-LABEL: add_w_i16:
306; CHECK:       ; %bb.0:
307; CHECK-NEXT:    mov r26, r22
308; CHECK-NEXT:    mov r27, r23
309; CHECK-NEXT:    mov r30, r24
310; CHECK-NEXT:    mov r31, r25
311; CHECK-NEXT:    ;APP
312; CHECK-NEXT:    mov r24, r30
313; CHECK-NEXT:    mov r25, r31
314; CHECK-NEXT:    add r24, r26
315; CHECK-NEXT:    adc r25, r27
316; CHECK-NEXT:    ;NO_APP
317; CHECK-NEXT:    mov r22, r30
318; CHECK-NEXT:    mov r23, r31
319; CHECK-NEXT:    mov r20, r26
320; CHECK-NEXT:    mov r21, r27
321; CHECK-NEXT:    rcall foo16
322; CHECK-NEXT:    ret
323  %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)
324  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
325  ret void
326}
327
328define void @add_xyz_i8(i8 signext %0, i8 signext %1) {
329; CHECK-LABEL: add_xyz_i8:
330; CHECK:       ; %bb.0:
331; CHECK-NEXT:    push r28
332; CHECK-NEXT:    push r29
333; CHECK-NEXT:    mov r20, r22
334; CHECK-NEXT:    mov r22, r24
335; CHECK-NEXT:    mov r28, r22
336; CHECK-NEXT:    mov r29, r23
337; CHECK-NEXT:    mov r26, r20
338; CHECK-NEXT:    mov r27, r21
339; CHECK-NEXT:    ;APP
340; CHECK-NEXT:    mov r30, r28
341; CHECK-NEXT:    add r30, r26
342; CHECK-NEXT:    ;NO_APP
343; CHECK-NEXT:    mov r24, r30
344; CHECK-NEXT:    mov r25, r31
345; CHECK-NEXT:    rcall foo8
346; CHECK-NEXT:    pop r29
347; CHECK-NEXT:    pop r28
348; CHECK-NEXT:    ret
349  %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=z,y,x"(i8 %0, i8 %1)
350  tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1)
351  ret void
352}
353
354define void @add_xyz_i16(i16 signext %0, i16 signext %1) {
355; CHECK-LABEL: add_xyz_i16:
356; CHECK:       ; %bb.0:
357; CHECK-NEXT:    push r28
358; CHECK-NEXT:    push r29
359; CHECK-NEXT:    mov r20, r22
360; CHECK-NEXT:    mov r21, r23
361; CHECK-NEXT:    mov r22, r24
362; CHECK-NEXT:    mov r23, r25
363; CHECK-NEXT:    mov r28, r22
364; CHECK-NEXT:    mov r29, r23
365; CHECK-NEXT:    mov r26, r20
366; CHECK-NEXT:    mov r27, r21
367; CHECK-NEXT:    ;APP
368; CHECK-NEXT:    mov r30, r28
369; CHECK-NEXT:    mov r31, r29
370; CHECK-NEXT:    add r30, r26
371; CHECK-NEXT:    adc r31, r27
372; CHECK-NEXT:    ;NO_APP
373; CHECK-NEXT:    mov r24, r30
374; CHECK-NEXT:    mov r25, r31
375; CHECK-NEXT:    rcall foo16
376; CHECK-NEXT:    pop r29
377; CHECK-NEXT:    pop r28
378; CHECK-NEXT:    ret
379  %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)
380  tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1)
381  ret void
382}
383
384@gvar = global i16 0
385
386define ptr @ldi_dreg_symbol() {
387; CHECK-LABEL: ldi_dreg_symbol:
388; CHECK:       ; %bb.0:
389; CHECK-NEXT:    ;APP
390; CHECK-NEXT:    ldi r25, hi8(gvar)
391; CHECK-NEXT:    ldi r24, lo8(gvar)
392; CHECK-NEXT:    ;NO_APP
393; CHECK-NEXT:    ret
394  %1 = tail call ptr asm sideeffect "ldi ${0:B}, hi8($1)\0A\09ldi ${0:A}, lo8($1)", "=d,i"(ptr @gvar)
395  ret ptr %1
396}
397
398define ptr @ldi_dreg_imm() {
399; CHECK-LABEL: ldi_dreg_imm:
400; CHECK:       ; %bb.0:
401; CHECK-NEXT:    ;APP
402; CHECK-NEXT:    ldi r25, hi8(2345)
403; CHECK-NEXT:    ldi r24, lo8(2345)
404; CHECK-NEXT:    ;NO_APP
405; CHECK-NEXT:    ret
406  %1 = tail call ptr asm sideeffect "ldi ${0:B}, hi8($1)\0A\09ldi ${0:A}, lo8($1)", "=d,i"(i16 2345)
407  ret ptr %1
408}
409