1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=avr --mcpu=atmega2560 -verify-machineinstrs | FileCheck %s
3
4@arr0 = addrspace(1) constant [4 x i16] [i16 123, i16 24, i16 56, i16 37], align 1
5@arr1 = addrspace(2) constant [4 x i16] [i16 123, i16 34, i16 46, i16 27], align 1
6@arr2 = addrspace(3) constant [4 x i16] [i16 123, i16 23, i16 45, i16 17], align 1
7
8define i16 @foo0(i16 %a, i16 %b) {
9; CHECK-LABEL: foo0:
10; CHECK:       ; %bb.0: ; %entry
11; CHECK-NEXT:    lsl r22
12; CHECK-NEXT:    rol r23
13; CHECK-NEXT:    subi r22, -lo8(arr0)
14; CHECK-NEXT:    sbci r23, -hi8(arr0)
15; CHECK-NEXT:    movw r30, r22
16; CHECK-NEXT:    lpm r18, Z+
17; CHECK-NEXT:    lpm r19, Z
18; CHECK-NEXT:    lsl r24
19; CHECK-NEXT:    rol r25
20; CHECK-NEXT:    subi r24, -lo8(arr0)
21; CHECK-NEXT:    sbci r25, -hi8(arr0)
22; CHECK-NEXT:    movw r30, r24
23; CHECK-NEXT:    lpm r24, Z+
24; CHECK-NEXT:    lpm r25, Z
25; CHECK-NEXT:    sub r24, r18
26; CHECK-NEXT:    sbc r25, r19
27; CHECK-NEXT:    ret
28entry:
29  %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %a
30  %0 = load i16, i16 addrspace(1)* %arrayidx, align 1
31  %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %b
32  %1 = load i16, i16 addrspace(1)* %arrayidx1, align 1
33  %sub = sub nsw i16 %0, %1
34  ret i16 %sub
35}
36
37define i16 @foo1(i16 %a, i16 %b) {
38; CHECK-LABEL: foo1:
39; CHECK:       ; %bb.0: ; %entry
40; CHECK-NEXT:    lsl r22
41; CHECK-NEXT:    rol r23
42; CHECK-NEXT:    subi r22, -lo8(arr1)
43; CHECK-NEXT:    sbci r23, -hi8(arr1)
44; CHECK-NEXT:    movw r30, r22
45; CHECK-NEXT:    ldi r18, 1
46; CHECK-NEXT:    out 59, r18
47; CHECK-NEXT:    elpm r18, Z+
48; CHECK-NEXT:    elpm r19, Z
49; CHECK-NEXT:    lsl r24
50; CHECK-NEXT:    rol r25
51; CHECK-NEXT:    subi r24, -lo8(arr0)
52; CHECK-NEXT:    sbci r25, -hi8(arr0)
53; CHECK-NEXT:    movw r30, r24
54; CHECK-NEXT:    lpm r24, Z+
55; CHECK-NEXT:    lpm r25, Z
56; CHECK-NEXT:    sub r24, r18
57; CHECK-NEXT:    sbc r25, r19
58; CHECK-NEXT:    ret
59entry:
60  %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %a
61  %0 = load i16, i16 addrspace(1)* %arrayidx, align 1
62  %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(2)* @arr1, i16 0, i16 %b
63  %1 = load i16, i16 addrspace(2)* %arrayidx1, align 1
64  %sub = sub nsw i16 %0, %1
65  ret i16 %sub
66}
67
68define i16 @foo2(i16 %a, i16 %b) {
69; CHECK-LABEL: foo2:
70; CHECK:       ; %bb.0: ; %entry
71; CHECK-NEXT:    lsl r24
72; CHECK-NEXT:    rol r25
73; CHECK-NEXT:    subi r24, -lo8(arr2)
74; CHECK-NEXT:    sbci r25, -hi8(arr2)
75; CHECK-NEXT:    movw r30, r24
76; CHECK-NEXT:    ldi r24, 2
77; CHECK-NEXT:    out 59, r24
78; CHECK-NEXT:    elpm r24, Z+
79; CHECK-NEXT:    elpm r25, Z
80; CHECK-NEXT:    lsl r22
81; CHECK-NEXT:    rol r23
82; CHECK-NEXT:    subi r22, -lo8(arr0)
83; CHECK-NEXT:    sbci r23, -hi8(arr0)
84; CHECK-NEXT:    movw r30, r22
85; CHECK-NEXT:    lpm r18, Z+
86; CHECK-NEXT:    lpm r19, Z
87; CHECK-NEXT:    sub r24, r18
88; CHECK-NEXT:    sbc r25, r19
89; CHECK-NEXT:    ret
90entry:
91  %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(3)* @arr2, i16 0, i16 %a
92  %0 = load i16, i16 addrspace(3)* %arrayidx, align 1
93  %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(1)* @arr0, i16 0, i16 %b
94  %1 = load i16, i16 addrspace(1)* %arrayidx1, align 1
95  %sub = sub nsw i16 %0, %1
96  ret i16 %sub
97}
98
99define i16 @foo3(i16 %a, i16 %b) {
100; CHECK-LABEL: foo3:
101; CHECK:       ; %bb.0: ; %entry
102; CHECK-NEXT:    lsl r22
103; CHECK-NEXT:    rol r23
104; CHECK-NEXT:    subi r22, -lo8(arr1)
105; CHECK-NEXT:    sbci r23, -hi8(arr1)
106; CHECK-NEXT:    movw r30, r22
107; CHECK-NEXT:    ldi r18, 1
108; CHECK-NEXT:    out 59, r18
109; CHECK-NEXT:    elpm r18, Z+
110; CHECK-NEXT:    elpm r19, Z
111; CHECK-NEXT:    lsl r24
112; CHECK-NEXT:    rol r25
113; CHECK-NEXT:    subi r24, -lo8(arr2)
114; CHECK-NEXT:    sbci r25, -hi8(arr2)
115; CHECK-NEXT:    movw r30, r24
116; CHECK-NEXT:    ldi r24, 2
117; CHECK-NEXT:    out 59, r24
118; CHECK-NEXT:    elpm r24, Z+
119; CHECK-NEXT:    elpm r25, Z
120; CHECK-NEXT:    sub r24, r18
121; CHECK-NEXT:    sbc r25, r19
122; CHECK-NEXT:    ret
123entry:
124  %arrayidx = getelementptr inbounds [4 x i16], [4 x i16] addrspace(3)* @arr2, i16 0, i16 %a
125  %0 = load i16, i16 addrspace(3)* %arrayidx, align 1
126  %arrayidx1 = getelementptr inbounds [4 x i16], [4 x i16] addrspace(2)* @arr1, i16 0, i16 %b
127  %1 = load i16, i16 addrspace(2)* %arrayidx1, align 1
128  %sub = sub nsw i16 %0, %1
129  ret i16 %sub
130}
131
132@arrb1 = addrspace(1) constant [4 x i8] c"{\188%", align 1
133@arrb3 = addrspace(3) constant [4 x i8] c"{\22.\1B", align 1
134@arrb5 = addrspace(5) constant [4 x i8] c"{\17-\11", align 1
135
136define signext i8 @foob0(i16 %a, i16 %b) {
137; CHECK-LABEL: foob0:
138; CHECK:       ; %bb.0: ; %entry
139; CHECK-NEXT:    subi r22, -lo8(arrb1)
140; CHECK-NEXT:    sbci r23, -hi8(arrb1)
141; CHECK-NEXT:    movw r30, r22
142; CHECK-NEXT:    lpm r18, Z
143; CHECK-NEXT:    subi r24, -lo8(arrb1)
144; CHECK-NEXT:    sbci r25, -hi8(arrb1)
145; CHECK-NEXT:    movw r30, r24
146; CHECK-NEXT:    lpm r24, Z
147; CHECK-NEXT:    sub r24, r18
148; CHECK-NEXT:    mov r25, r24
149; CHECK-NEXT:    lsl r25
150; CHECK-NEXT:    sbc r25, r25
151; CHECK-NEXT:    ret
152entry:
153  %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %a
154  %0 = load i8, i8 addrspace(1)* %arrayidx, align 1
155  %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %b
156  %1 = load i8, i8 addrspace(1)* %arrayidx1, align 1
157  %sub = sub i8 %0, %1
158  ret i8 %sub
159}
160
161define signext i8 @foob1(i16 %a, i16 %b) {
162; CHECK-LABEL: foob1:
163; CHECK:       ; %bb.0: ; %entry
164; CHECK-NEXT:    subi r22, -lo8(arrb3)
165; CHECK-NEXT:    sbci r23, -hi8(arrb3)
166; CHECK-NEXT:    movw r30, r22
167; CHECK-NEXT:    ldi r18, 2
168; CHECK-NEXT:    out 59, r18
169; CHECK-NEXT:    elpm r18, Z
170; CHECK-NEXT:    subi r24, -lo8(arrb1)
171; CHECK-NEXT:    sbci r25, -hi8(arrb1)
172; CHECK-NEXT:    movw r30, r24
173; CHECK-NEXT:    lpm r24, Z
174; CHECK-NEXT:    sub r24, r18
175; CHECK-NEXT:    mov r25, r24
176; CHECK-NEXT:    lsl r25
177; CHECK-NEXT:    sbc r25, r25
178; CHECK-NEXT:    ret
179entry:
180  %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %a
181  %0 = load i8, i8 addrspace(1)* %arrayidx, align 1
182  %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %b
183  %1 = load i8, i8 addrspace(3)* %arrayidx1, align 1
184  %sub = sub i8 %0, %1
185  ret i8 %sub
186}
187
188define signext i8 @foob2(i16 %a, i16 %b) {
189; CHECK-LABEL: foob2:
190; CHECK:       ; %bb.0: ; %entry
191; CHECK-NEXT:    subi r24, -lo8(arrb5)
192; CHECK-NEXT:    sbci r25, -hi8(arrb5)
193; CHECK-NEXT:    movw r30, r24
194; CHECK-NEXT:    ldi r24, 4
195; CHECK-NEXT:    out 59, r24
196; CHECK-NEXT:    elpm r24, Z
197; CHECK-NEXT:    subi r22, -lo8(arrb1)
198; CHECK-NEXT:    sbci r23, -hi8(arrb1)
199; CHECK-NEXT:    movw r30, r22
200; CHECK-NEXT:    lpm r25, Z
201; CHECK-NEXT:    sub r24, r25
202; CHECK-NEXT:    mov r25, r24
203; CHECK-NEXT:    lsl r25
204; CHECK-NEXT:    sbc r25, r25
205; CHECK-NEXT:    ret
206entry:
207  %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(5)* @arrb5, i16 0, i16 %a
208  %0 = load i8, i8 addrspace(5)* %arrayidx, align 1
209  %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(1)* @arrb1, i16 0, i16 %b
210  %1 = load i8, i8 addrspace(1)* %arrayidx1, align 1
211  %sub = sub i8 %0, %1
212  ret i8 %sub
213}
214
215define signext i8 @foob3(i16 %a, i16 %b) {
216; CHECK-LABEL: foob3:
217; CHECK:       ; %bb.0: ; %entry
218; CHECK-NEXT:    subi r22, -lo8(arrb5)
219; CHECK-NEXT:    sbci r23, -hi8(arrb5)
220; CHECK-NEXT:    movw r30, r22
221; CHECK-NEXT:    ldi r18, 4
222; CHECK-NEXT:    out 59, r18
223; CHECK-NEXT:    elpm r18, Z
224; CHECK-NEXT:    subi r24, -lo8(arrb3)
225; CHECK-NEXT:    sbci r25, -hi8(arrb3)
226; CHECK-NEXT:    movw r30, r24
227; CHECK-NEXT:    ldi r24, 2
228; CHECK-NEXT:    out 59, r24
229; CHECK-NEXT:    elpm r24, Z
230; CHECK-NEXT:    sub r24, r18
231; CHECK-NEXT:    mov r25, r24
232; CHECK-NEXT:    lsl r25
233; CHECK-NEXT:    sbc r25, r25
234; CHECK-NEXT:    ret
235entry:
236  %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %a
237  %0 = load i8, i8 addrspace(3)* %arrayidx, align 1
238  %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(5)* @arrb5, i16 0, i16 %b
239  %1 = load i8, i8 addrspace(5)* %arrayidx1, align 1
240  %sub = sub i8 %0, %1
241  ret i8 %sub
242}
243
244define signext i8 @foob4(i16 %a, i16 %b) {
245; CHECK-LABEL: foob4:
246; CHECK:       ; %bb.0: ; %entry
247; CHECK-NEXT:    subi r22, -lo8(arrb3)
248; CHECK-NEXT:    sbci r23, -hi8(arrb3)
249; CHECK-NEXT:    movw r30, r22
250; CHECK-NEXT:    ldi r18, 2
251; CHECK-NEXT:    out 59, r18
252; CHECK-NEXT:    elpm r19, Z
253; CHECK-NEXT:    subi r24, -lo8(arrb3)
254; CHECK-NEXT:    sbci r25, -hi8(arrb3)
255; CHECK-NEXT:    movw r30, r24
256; CHECK-NEXT:    out 59, r18
257; CHECK-NEXT:    elpm r24, Z
258; CHECK-NEXT:    sub r24, r19
259; CHECK-NEXT:    mov r25, r24
260; CHECK-NEXT:    lsl r25
261; CHECK-NEXT:    sbc r25, r25
262; CHECK-NEXT:    ret
263entry:
264  %arrayidx = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %a
265  %0 = load i8, i8 addrspace(3)* %arrayidx, align 1
266  %arrayidx1 = getelementptr inbounds [4 x i8], [4 x i8] addrspace(3)* @arrb3, i16 0, i16 %b
267  %1 = load i8, i8 addrspace(3)* %arrayidx1, align 1
268  %sub = sub i8 %0, %1
269  ret i8 %sub
270}
271