[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / AVR / return.ll
blob6d81faa6e8d457515b5c1098451a53248f2f2106
1 ; RUN: llc -mattr=avr6,sram < %s -march=avr | FileCheck %s
3 ;TODO: test returning byval structs
4 ; TODO: test naked functions
6 define void @return_void() {
7 ; CHECK: return_void:{{[a-zA-Z0-9 #@]*}}
8 ; CHECK-NEXT: {{.*}}:
9 ; CHECK-NEXT: ret
10     ret void
13 define i8 @return8_imm() {
14 ; CHECK-LABEL: return8_imm:
15 ; CHECK: ldi r24, 5
16     ret i8 5
19 define i8 @return8_arg(i8 %x) {
20 ; CHECK: return8_arg:{{[a-zA-Z0-9 #@]*}}
21 ; CHECK-NEXT: {{.*}}:
22 ; CHECK-NEXT: ret
23     ret i8 %x
26 define i8 @return8_arg2(i8 %x, i8 %y, i8 %z) {
27 ; CHECK-LABEL: return8_arg2:
28 ; CHECK: mov r24, r20
29     ret i8 %z
32 define i16 @return16_imm() {
33 ; CHECK-LABEL: return16_imm:
34 ; CHECK: ldi r24, 57
35 ; CHECK: ldi r25, 48
36     ret i16 12345
39 define i16 @return16_arg(i16 %x) {
40 ; CHECK: return16_arg:{{[a-zA-Z0-9 #@]*}}
41 ; CHECK-NEXT: {{.*}}:
42 ; CHECK-NEXT: ret
43     ret i16 %x
46 define i16 @return16_arg2(i16 %x, i16 %y, i16 %z) {
47 ; CHECK-LABEL: return16_arg2:
48 ; CHECK: movw r24, r20
49     ret i16 %z
52 define 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
61 define i32 @return32_arg(i32 %x) {
62 ; CHECK: return32_arg:{{[a-zA-Z0-9 #@]*}}
63 ; CHECK-NEXT: {{.*}}:
64 ; CHECK-NEXT: ret
65     ret i32 %x
68 define 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
75 define 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
88 define i64 @return64_arg(i64 %x) {
89 ; CHECK: return64_arg:{{[a-zA-Z0-9 #@]*}}
90 ; CHECK-NEXT: {{.*}}:
91 ; CHECK-NEXT: ret
92     ret i64 %x
95 define 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
112 define 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
126 define i32 @naked(i32 %x) naked {
127 ; CHECK-LABEL: naked:
128 ; CHECK-NOT: ret
129   ret i32 %x
132 define avr_intrcc void @interrupt_handler() {
133 ; CHECK-LABEL: interrupt_handler:
134 ; CHECK: reti
135   ret void
138 define avr_signalcc void @signal_handler() {
139 ; CHECK-LABEL: signal_handler:
140 ; CHECK: reti
141   ret void