1
- ; RUN: llc < %s -march=avr -mattr=avr6 | FileCheck %s
1
+ ; RUN: llc < %s -mtriple=avr -mcpu=avr6 | FileCheck %s --check-prefixes=CHECK,AVR6
2
+ ; RUN: llc < %s -mtriple=avr -mcpu=avr2 | FileCheck %s --check-prefixes=CHECK,AVR2
2
3
3
4
; TODO: test returning byval structs
4
5
@@ -18,11 +19,13 @@ declare i64 @foo64_2(i64, i64, i64)
18
19
define i8 @calli8_reg () {
19
20
; CHECK-LABEL: calli8_reg:
20
21
; CHECK: ldi r24, 12
21
- ; CHECK: call foo8_1
22
+ ; AVR6: call foo8_1
23
+ ; AVR2: rcall foo8_1
22
24
; CHECK: ldi r24, 12
23
25
; CHECK: ldi r22, 13
24
26
; CHECK: ldi r20, 14
25
- ; CHECK: call foo8_2
27
+ ; AVR6: call foo8_2
28
+ ; AVR2: rcall foo8_2
26
29
%result1 = call i8 @foo8_1 (i8 12 )
27
30
%result2 = call i8 @foo8_2 (i8 12 , i8 13 , i8 14 )
28
31
ret i8 %result2
@@ -34,7 +37,8 @@ define i8 @calli8_stack() {
34
37
; CHECK: ldi [[REG2:r[0-9]+]], 11
35
38
; CHECK: std Z+1, [[REG1]]
36
39
; CHECK: std Z+2, [[REG2]]
37
- ; CHECK: call foo8_3
40
+ ; AVR6: call foo8_3
41
+ ; AVR2: rcall foo8_3
38
42
%result1 = call i8 @foo8_3 (i8 1 , i8 2 , i8 3 , i8 4 , i8 5 , i8 6 , i8 7 , i8 8 , i8 9 , i8 10 , i8 11 )
39
43
ret i8 %result1
40
44
}
@@ -45,7 +49,8 @@ define i16 @calli16_reg() {
45
49
; CHECK: ldi r25, 2
46
50
; CHECK: ldi r22, 2
47
51
; CHECK: ldi r23, 2
48
- ; CHECK: call foo16_1
52
+ ; AVR6: call foo16_1
53
+ ; AVR2: rcall foo16_1
49
54
%result1 = call i16 @foo16_1 (i16 513 , i16 514 )
50
55
ret i16 %result1
51
56
}
@@ -60,7 +65,8 @@ define i16 @calli16_stack() {
60
65
; CHECK: ldi [[REG2:r[0-9]+]], 2
61
66
; CHECK: std Z+1, [[REG1]]
62
67
; CHECK: std Z+2, [[REG2]]
63
- ; CHECK: call foo16_2
68
+ ; AVR6: call foo16_2
69
+ ; AVR2: rcall foo16_2
64
70
%result1 = call i16 @foo16_2 (i16 512 , i16 513 , i16 514 , i16 515 , i16 516 , i16 517 , i16 518 , i16 519 , i16 520 , i16 521 , i16 522 )
65
71
ret i16 %result1
66
72
}
@@ -75,7 +81,8 @@ define i32 @calli32_reg() {
75
81
; CHECK: ldi r19, 132
76
82
; CHECK: ldi r20, 30
77
83
; CHECK: ldi r21, 2
78
- ; CHECK: call foo32_1
84
+ ; AVR6: call foo32_1
85
+ ; AVR2: rcall foo32_1
79
86
%result1 = call i32 @foo32_1 (i32 34554432 , i32 35554432 )
80
87
ret i32 %result1
81
88
}
@@ -90,7 +97,8 @@ define i32 @calli32_stack() {
90
97
; CHECK: ldi [[REG2:r[0-9]+]], 66
91
98
; CHECK: std Z+1, [[REG1]]
92
99
; CHECK: std Z+2, [[REG2]]
93
- ; CHECK: call foo32_2
100
+ ; AVR6: call foo32_2
101
+ ; AVR2: rcall foo32_2
94
102
%result1 = call i32 @foo32_2 (i32 1 , i32 2 , i32 3 , i32 4 , i32 34554432 )
95
103
ret i32 %result1
96
104
}
@@ -105,7 +113,8 @@ define i64 @calli64_reg() {
105
113
; CHECK: ldi r23, 73
106
114
; CHECK: ldi r24, 31
107
115
; CHECK: ldi r25, 242
108
- ; CHECK: call foo64_1
116
+ ; AVR6: call foo64_1
117
+ ; AVR2: rcall foo64_1
109
118
%result1 = call i64 @foo64_1 (i64 17446744073709551615 )
110
119
ret i64 %result1
111
120
}
@@ -129,7 +138,8 @@ define i64 @calli64_stack() {
129
138
; CHECK: ldi [[REG2:r[0-9]+]], 255
130
139
; CHECK: std Z+1, [[REG1]]
131
140
; CHECK: std Z+2, [[REG2]]
132
- ; CHECK: call foo64_2
141
+ ; AVR6: call foo64_2
142
+ ; AVR2: rcall foo64_2
133
143
%result1 = call i64 @foo64_2 (i64 1 , i64 2 , i64 17446744073709551615 )
134
144
ret i64 %result1
135
145
}
@@ -171,7 +181,9 @@ define void @testcallprologue() {
171
181
172
182
define i32 @icall (i32 (i32 ) addrspace (1 )* %foo ) {
173
183
; CHECK-LABEL: icall:
174
- ; CHECK: movw r30, r24
184
+ ; AVR6: movw r30, r24
185
+ ; AVR2: mov r30, r24
186
+ ; AVR2: mov r31, r25
175
187
; CHECK: ldi r22, 147
176
188
; CHECK: ldi r23, 248
177
189
; CHECK: ldi r24, 214
@@ -192,14 +204,28 @@ declare i32 @foofloat(float)
192
204
193
205
define i32 @externcall (float %a , float %b ) {
194
206
; CHECK-LABEL: externcall:
195
- ; CHECK: movw [[REG1:(r[0-9]+|[XYZ])]], r24
196
- ; CHECK: movw [[REG2:(r[0-9]+|[XYZ])]], r22
197
- ; CHECK: movw r22, r18
198
- ; CHECK: movw r24, r20
199
- ; CHECK: movw r18, [[REG2]]
200
- ; CHECK: movw r20, [[REG1]]
201
- ; CHECK: call __divsf3
202
- ; CHECK: call foofloat
207
+ ; AVR6: movw [[REG0:(r[0-9]+|[XYZ])]], r24
208
+ ; AVR6: movw [[REG1:(r[0-9]+|[XYZ])]], r22
209
+ ; AVR6: movw r22, r18
210
+ ; AVR6: movw r24, r20
211
+ ; AVR6: movw r18, [[REG1]]
212
+ ; AVR6: movw r20, [[REG0]]
213
+ ; AVR6: call __divsf3
214
+ ; AVR6: call foofloat
215
+ ; AVR2: mov [[REG0:(r[0-9]+)]], r24
216
+ ; AVR2: mov [[REG1:(r[0-9]+)]], r25
217
+ ; AVR2: mov [[REG2:(r[0-9]+)]], r22
218
+ ; AVR2: mov [[REG3:(r[0-9]+)]], r23
219
+ ; AVR2: mov r22, r18
220
+ ; AVR2: mov r23, r19
221
+ ; AVR2: mov r24, r20
222
+ ; AVR2: mov r25, r21
223
+ ; AVR2: mov r18, [[REG2]]
224
+ ; AVR2: mov r19, [[REG3]]
225
+ ; AVR2: mov r20, [[REG0]]
226
+ ; AVR2: mov r21, [[REG1]]
227
+ ; AVR2: rcall __divsf3
228
+ ; AVR2: rcall foofloat
203
229
; CHECK: subi r22, 251
204
230
; CHECK: sbci r23, 255
205
231
; CHECK: sbci r24, 255
0 commit comments