1; RUN: llc -mattr=avr6,sram < %s -march=avr | FileCheck %s
2
3;TODO: test returning byval structs
4; TODO: test naked functions
5
6define void @return_void() {
7; CHECK: return_void:{{[a-zA-Z0-9 #@]*}}
8; CHECK-NEXT: {{.*}}:
9; CHECK-NEXT: ret
10    ret void
11}
12
13define i8 @return8_imm() {
14; CHECK-LABEL: return8_imm:
15; CHECK: ldi r24, 5
16    ret i8 5
17}
18
19define i8 @return8_arg(i8 %x) {
20; CHECK: return8_arg:{{[a-zA-Z0-9 #@]*}}
21; CHECK-NEXT: {{.*}}:
22; CHECK-NEXT: ret
23    ret i8 %x
24}
25
26define i8 @return8_arg2(i8 %x, i8 %y, i8 %z) {
27; CHECK-LABEL: return8_arg2:
28; CHECK: mov r24, r20
29    ret i8 %z
30}
31
32define i16 @return16_imm() {
33; CHECK-LABEL: return16_imm:
34; CHECK: ldi r24, 57
35; CHECK: ldi r25, 48
36    ret i16 12345
37}
38
39define i16 @return16_arg(i16 %x) {
40; CHECK: return16_arg:{{[a-zA-Z0-9 #@]*}}
41; CHECK-NEXT: {{.*}}:
42; CHECK-NEXT: ret
43    ret i16 %x
44}
45
46define i16 @return16_arg2(i16 %x, i16 %y, i16 %z) {
47; CHECK-LABEL: return16_arg2:
48; CHECK: movw r24, r20
49    ret i16 %z
50}
51
52define i32 @return32_imm() {
53; CHECK-LABEL: return32_imm:
54; CHECK: ldi r22, 21
55; CHECK: ldi r23, 205
56; CHECK: ldi r24, 91
57; CHECK: ldi r25, 7
58    ret i32 123456789
59}
60
61define i32 @return32_arg(i32 %x) {
62; CHECK: return32_arg:{{[a-zA-Z0-9 #@]*}}
63; CHECK-NEXT: {{.*}}:
64; CHECK-NEXT: ret
65    ret i32 %x
66}
67
68define i32 @return32_arg2(i32 %x, i32 %y, i32 %z) {
69; CHECK-LABEL: return32_arg2:
70; CHECK: movw r22, r14
71; CHECK: movw r24, r16
72    ret i32 %z
73}
74
75define i64 @return64_imm() {
76; CHECK-LABEL: return64_imm:
77; CHECK: ldi r18, 204
78; CHECK: ldi r19, 204
79; CHECK: ldi r20, 104
80; CHECK: ldi r21, 37
81; CHECK: ldi r22, 25
82; CHECK: ldi r23, 22
83; CHECK: ldi r24, 236
84; CHECK: ldi r25, 190
85    ret i64 13757395258967641292
86}
87
88define i64 @return64_arg(i64 %x) {
89; CHECK: return64_arg:{{[a-zA-Z0-9 #@]*}}
90; CHECK-NEXT: {{.*}}:
91; CHECK-NEXT: ret
92    ret i64 %x
93}
94
95define i64 @return64_arg2(i64 %x, i64 %y, i64 %z) {
96; CHECK-LABEL: return64_arg2:
97; CHECK: push r28
98; CHECK: push r29
99; CHECK: ldd r18, Y+3
100; CHECK: ldd r19, Y+4
101; CHECK: ldd r20, Y+5
102; CHECK: ldd r21, Y+6
103; CHECK: ldd r22, Y+7
104; CHECK: ldd r23, Y+8
105; CHECK: ldd r24, Y+9
106; CHECK: ldd r25, Y+10
107; CHECK: pop r29
108; CHECK: pop r28
109    ret i64 %z
110}
111
112define i32 @return64_trunc(i32 %a, i32 %b, i32 %c, i64 %d) {
113; CHECK-LABEL: return64_trunc:
114; CHECK: push r28
115; CHECK: push r29
116; CHECK: ldd r22, Y+3
117; CHECK: ldd r23, Y+4
118; CHECK: ldd r24, Y+5
119; CHECK: ldd r25, Y+6
120; CHECK: pop r29
121; CHECK: pop r28
122  %result = trunc i64 %d to i32
123  ret i32 %result
124}
125
126define i32 @naked(i32 %x) naked {
127; CHECK-LABEL: naked:
128; CHECK-NOT: ret
129  ret i32 %x
130}
131
132define avr_intrcc void @interrupt_handler() {
133; CHECK-LABEL: interrupt_handler:
134; CHECK: reti
135  ret void
136}
137
138define avr_signalcc void @signal_handler() {
139; CHECK-LABEL: signal_handler:
140; CHECK: reti
141  ret void
142}
143