xref: /llvm-project/llvm/test/CodeGen/AVR/elpm.ll (revision 7bdc80f35c325d148b1ddbdfce7dea8c6ba7af84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=avr -mattr=+movw -mattr=+elpm -mattr=+elpmx -mattr=+lpm -mattr=+lpmx -verify-machineinstrs \
3; RUN:     | FileCheck %s
4; RUN: llc < %s -mtriple=avr -mattr=+movw -mattr=+elpm -mattr=-elpmx -mattr=+lpm -mattr=-lpmx -verify-machineinstrs \
5; RUN:     | FileCheck --check-prefix=NOX %s
6
7@arr0 = addrspace(1) constant [4 x i16] [i16 123, i16 24, i16 56, i16 37], align 1
8@arr1 = addrspace(2) constant [4 x i16] [i16 123, i16 34, i16 46, i16 27], align 1
9@arr2 = addrspace(3) constant [4 x i16] [i16 123, i16 23, i16 45, i16 17], align 1
10
11define i16 @foo0(i16 %a, i16 %b) {
12; CHECK-LABEL: foo0:
13; CHECK:       ; %bb.0: ; %entry
14; CHECK-NEXT:    lsl r22
15; CHECK-NEXT:    rol r23
16; CHECK-NEXT:    subi r22, lo8(-(arr0))
17; CHECK-NEXT:    sbci r23, hi8(-(arr0))
18; CHECK-NEXT:    movw r30, r22
19; CHECK-NEXT:    lpm r18, Z+
20; CHECK-NEXT:    lpm r19, Z
21; CHECK-NEXT:    lsl r24
22; CHECK-NEXT:    rol r25
23; CHECK-NEXT:    subi r24, lo8(-(arr0))
24; CHECK-NEXT:    sbci r25, hi8(-(arr0))
25; CHECK-NEXT:    movw r30, r24
26; CHECK-NEXT:    lpm r24, Z+
27; CHECK-NEXT:    lpm r25, Z
28; CHECK-NEXT:    sub r24, r18
29; CHECK-NEXT:    sbc r25, r19
30; CHECK-NEXT:    ret
31;
32; NOX-LABEL: foo0:
33; NOX:       ; %bb.0: ; %entry
34; NOX-NEXT:    lsl r22
35; NOX-NEXT:    rol r23
36; NOX-NEXT:    subi r22, lo8(-(arr0))
37; NOX-NEXT:    sbci r23, hi8(-(arr0))
38; NOX-NEXT:    movw r30, r22
39; NOX-NEXT:    lpm
40; NOX-NEXT:    mov r18, r0
41; NOX-NEXT:    adiw r30, 1
42; NOX-NEXT:    lpm
43; NOX-NEXT:    mov r19, r0
44; NOX-NEXT:    lsl r24
45; NOX-NEXT:    rol r25
46; NOX-NEXT:    subi r24, lo8(-(arr0))
47; NOX-NEXT:    sbci r25, hi8(-(arr0))
48; NOX-NEXT:    movw r30, r24
49; NOX-NEXT:    lpm
50; NOX-NEXT:    mov r24, r0
51; NOX-NEXT:    adiw r30, 1
52; NOX-NEXT:    lpm
53; NOX-NEXT:    mov r25, r0
54; NOX-NEXT:    sub r24, r18
55; NOX-NEXT:    sbc r25, r19
56; NOX-NEXT:    ret
57entry:
58  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %a
59  %0 = load i16, ptr addrspace(1) %arrayidx, align 1
60  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %b
61  %1 = load i16, ptr addrspace(1) %arrayidx1, align 1
62  %sub = sub nsw i16 %0, %1
63  ret i16 %sub
64}
65
66define i16 @foo1(i16 %a, i16 %b) {
67; CHECK-LABEL: foo1:
68; CHECK:       ; %bb.0: ; %entry
69; CHECK-NEXT:    lsl r22
70; CHECK-NEXT:    rol r23
71; CHECK-NEXT:    subi r22, lo8(-(arr1))
72; CHECK-NEXT:    sbci r23, hi8(-(arr1))
73; CHECK-NEXT:    movw r30, r22
74; CHECK-NEXT:    ldi r18, 1
75; CHECK-NEXT:    out 59, r18
76; CHECK-NEXT:    elpm r20, Z+
77; CHECK-NEXT:    elpm r21, Z
78; CHECK-NEXT:    lsl r24
79; CHECK-NEXT:    rol r25
80; CHECK-NEXT:    subi r24, lo8(-(arr0))
81; CHECK-NEXT:    sbci r25, hi8(-(arr0))
82; CHECK-NEXT:    movw r30, r24
83; CHECK-NEXT:    lpm r24, Z+
84; CHECK-NEXT:    lpm r25, Z
85; CHECK-NEXT:    sub r24, r20
86; CHECK-NEXT:    sbc r25, r21
87; CHECK-NEXT:    ret
88;
89; NOX-LABEL: foo1:
90; NOX:       ; %bb.0: ; %entry
91; NOX-NEXT:    lsl r22
92; NOX-NEXT:    rol r23
93; NOX-NEXT:    subi r22, lo8(-(arr1))
94; NOX-NEXT:    sbci r23, hi8(-(arr1))
95; NOX-NEXT:    movw r30, r22
96; NOX-NEXT:    ldi r18, 1
97; NOX-NEXT:    out 59, r18
98; NOX-NEXT:    elpm
99; NOX-NEXT:    mov r20, r0
100; NOX-NEXT:    adiw r30, 1
101; NOX-NEXT:    elpm
102; NOX-NEXT:    mov r21, r0
103; NOX-NEXT:    lsl r24
104; NOX-NEXT:    rol r25
105; NOX-NEXT:    subi r24, lo8(-(arr0))
106; NOX-NEXT:    sbci r25, hi8(-(arr0))
107; NOX-NEXT:    movw r30, r24
108; NOX-NEXT:    lpm
109; NOX-NEXT:    mov r24, r0
110; NOX-NEXT:    adiw r30, 1
111; NOX-NEXT:    lpm
112; NOX-NEXT:    mov r25, r0
113; NOX-NEXT:    sub r24, r20
114; NOX-NEXT:    sbc r25, r21
115; NOX-NEXT:    ret
116entry:
117  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %a
118  %0 = load i16, ptr addrspace(1) %arrayidx, align 1
119  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(2) @arr1, i16 0, i16 %b
120  %1 = load i16, ptr addrspace(2) %arrayidx1, align 1
121  %sub = sub nsw i16 %0, %1
122  ret i16 %sub
123}
124
125define i16 @foo2(i16 %a, i16 %b) {
126; CHECK-LABEL: foo2:
127; CHECK:       ; %bb.0: ; %entry
128; CHECK-NEXT:    lsl r24
129; CHECK-NEXT:    rol r25
130; CHECK-NEXT:    subi r24, lo8(-(arr2))
131; CHECK-NEXT:    sbci r25, hi8(-(arr2))
132; CHECK-NEXT:    movw r30, r24
133; CHECK-NEXT:    ldi r18, 2
134; CHECK-NEXT:    out 59, r18
135; CHECK-NEXT:    elpm r24, Z+
136; CHECK-NEXT:    elpm r25, Z
137; CHECK-NEXT:    lsl r22
138; CHECK-NEXT:    rol r23
139; CHECK-NEXT:    subi r22, lo8(-(arr0))
140; CHECK-NEXT:    sbci r23, hi8(-(arr0))
141; CHECK-NEXT:    movw r30, r22
142; CHECK-NEXT:    lpm r18, Z+
143; CHECK-NEXT:    lpm r19, Z
144; CHECK-NEXT:    sub r24, r18
145; CHECK-NEXT:    sbc r25, r19
146; CHECK-NEXT:    ret
147;
148; NOX-LABEL: foo2:
149; NOX:       ; %bb.0: ; %entry
150; NOX-NEXT:    lsl r24
151; NOX-NEXT:    rol r25
152; NOX-NEXT:    subi r24, lo8(-(arr2))
153; NOX-NEXT:    sbci r25, hi8(-(arr2))
154; NOX-NEXT:    movw r30, r24
155; NOX-NEXT:    ldi r18, 2
156; NOX-NEXT:    out 59, r18
157; NOX-NEXT:    elpm
158; NOX-NEXT:    mov r24, r0
159; NOX-NEXT:    adiw r30, 1
160; NOX-NEXT:    elpm
161; NOX-NEXT:    mov r25, r0
162; NOX-NEXT:    lsl r22
163; NOX-NEXT:    rol r23
164; NOX-NEXT:    subi r22, lo8(-(arr0))
165; NOX-NEXT:    sbci r23, hi8(-(arr0))
166; NOX-NEXT:    movw r30, r22
167; NOX-NEXT:    lpm
168; NOX-NEXT:    mov r18, r0
169; NOX-NEXT:    adiw r30, 1
170; NOX-NEXT:    lpm
171; NOX-NEXT:    mov r19, r0
172; NOX-NEXT:    sub r24, r18
173; NOX-NEXT:    sbc r25, r19
174; NOX-NEXT:    ret
175entry:
176  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(3) @arr2, i16 0, i16 %a
177  %0 = load i16, ptr addrspace(3) %arrayidx, align 1
178  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %b
179  %1 = load i16, ptr addrspace(1) %arrayidx1, align 1
180  %sub = sub nsw i16 %0, %1
181  ret i16 %sub
182}
183
184define i16 @foo3(i16 %a, i16 %b) {
185; CHECK-LABEL: foo3:
186; CHECK:       ; %bb.0: ; %entry
187; CHECK-NEXT:    lsl r22
188; CHECK-NEXT:    rol r23
189; CHECK-NEXT:    subi r22, lo8(-(arr1))
190; CHECK-NEXT:    sbci r23, hi8(-(arr1))
191; CHECK-NEXT:    movw r30, r22
192; CHECK-NEXT:    ldi r18, 1
193; CHECK-NEXT:    out 59, r18
194; CHECK-NEXT:    elpm r20, Z+
195; CHECK-NEXT:    elpm r21, Z
196; CHECK-NEXT:    lsl r24
197; CHECK-NEXT:    rol r25
198; CHECK-NEXT:    subi r24, lo8(-(arr2))
199; CHECK-NEXT:    sbci r25, hi8(-(arr2))
200; CHECK-NEXT:    movw r30, r24
201; CHECK-NEXT:    ldi r18, 2
202; CHECK-NEXT:    out 59, r18
203; CHECK-NEXT:    elpm r24, Z+
204; CHECK-NEXT:    elpm r25, Z
205; CHECK-NEXT:    sub r24, r20
206; CHECK-NEXT:    sbc r25, r21
207; CHECK-NEXT:    ret
208;
209; NOX-LABEL: foo3:
210; NOX:       ; %bb.0: ; %entry
211; NOX-NEXT:    lsl r22
212; NOX-NEXT:    rol r23
213; NOX-NEXT:    subi r22, lo8(-(arr1))
214; NOX-NEXT:    sbci r23, hi8(-(arr1))
215; NOX-NEXT:    movw r30, r22
216; NOX-NEXT:    ldi r18, 1
217; NOX-NEXT:    out 59, r18
218; NOX-NEXT:    elpm
219; NOX-NEXT:    mov r20, r0
220; NOX-NEXT:    adiw r30, 1
221; NOX-NEXT:    elpm
222; NOX-NEXT:    mov r21, r0
223; NOX-NEXT:    lsl r24
224; NOX-NEXT:    rol r25
225; NOX-NEXT:    subi r24, lo8(-(arr2))
226; NOX-NEXT:    sbci r25, hi8(-(arr2))
227; NOX-NEXT:    movw r30, r24
228; NOX-NEXT:    ldi r18, 2
229; NOX-NEXT:    out 59, r18
230; NOX-NEXT:    elpm
231; NOX-NEXT:    mov r24, r0
232; NOX-NEXT:    adiw r30, 1
233; NOX-NEXT:    elpm
234; NOX-NEXT:    mov r25, r0
235; NOX-NEXT:    sub r24, r20
236; NOX-NEXT:    sbc r25, r21
237; NOX-NEXT:    ret
238entry:
239  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(3) @arr2, i16 0, i16 %a
240  %0 = load i16, ptr addrspace(3) %arrayidx, align 1
241  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(2) @arr1, i16 0, i16 %b
242  %1 = load i16, ptr addrspace(2) %arrayidx1, align 1
243  %sub = sub nsw i16 %0, %1
244  ret i16 %sub
245}
246
247@arrb1 = addrspace(1) constant [4 x i8] c"abcd", align 1
248@arrb3 = addrspace(3) constant [4 x i8] c"1234", align 1
249@arrb5 = addrspace(5) constant [4 x i8] c"HJLQ", align 1
250
251define signext i8 @foob0(i16 %a, i16 %b) {
252; CHECK-LABEL: foob0:
253; CHECK:       ; %bb.0: ; %entry
254; CHECK-NEXT:    subi r22, lo8(-(arrb1))
255; CHECK-NEXT:    sbci r23, hi8(-(arrb1))
256; CHECK-NEXT:    movw r30, r22
257; CHECK-NEXT:    lpm r18, Z
258; CHECK-NEXT:    subi r24, lo8(-(arrb1))
259; CHECK-NEXT:    sbci r25, hi8(-(arrb1))
260; CHECK-NEXT:    movw r30, r24
261; CHECK-NEXT:    lpm r24, Z
262; CHECK-NEXT:    sub r24, r18
263; CHECK-NEXT:    mov r25, r24
264; CHECK-NEXT:    lsl r25
265; CHECK-NEXT:    sbc r25, r25
266; CHECK-NEXT:    ret
267;
268; NOX-LABEL: foob0:
269; NOX:       ; %bb.0: ; %entry
270; NOX-NEXT:    subi r22, lo8(-(arrb1))
271; NOX-NEXT:    sbci r23, hi8(-(arrb1))
272; NOX-NEXT:    movw r30, r22
273; NOX-NEXT:    lpm
274; NOX-NEXT:    mov r18, r0
275; NOX-NEXT:    subi r24, lo8(-(arrb1))
276; NOX-NEXT:    sbci r25, hi8(-(arrb1))
277; NOX-NEXT:    movw r30, r24
278; NOX-NEXT:    lpm
279; NOX-NEXT:    mov r24, r0
280; NOX-NEXT:    sub r24, r18
281; NOX-NEXT:    mov r25, r24
282; NOX-NEXT:    lsl r25
283; NOX-NEXT:    sbc r25, r25
284; NOX-NEXT:    ret
285entry:
286  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %a
287  %0 = load i8, ptr addrspace(1) %arrayidx, align 1
288  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %b
289  %1 = load i8, ptr addrspace(1) %arrayidx1, align 1
290  %sub = sub i8 %0, %1
291  ret i8 %sub
292}
293
294define signext i8 @foob1(i16 %a, i16 %b) {
295; CHECK-LABEL: foob1:
296; CHECK:       ; %bb.0: ; %entry
297; CHECK-NEXT:    subi r22, lo8(-(arrb3))
298; CHECK-NEXT:    sbci r23, hi8(-(arrb3))
299; CHECK-NEXT:    movw r30, r22
300; CHECK-NEXT:    ldi r18, 2
301; CHECK-NEXT:    out 59, r18
302; CHECK-NEXT:    elpm r18, Z
303; CHECK-NEXT:    subi r24, lo8(-(arrb1))
304; CHECK-NEXT:    sbci r25, hi8(-(arrb1))
305; CHECK-NEXT:    movw r30, r24
306; CHECK-NEXT:    lpm r24, Z
307; CHECK-NEXT:    sub r24, r18
308; CHECK-NEXT:    mov r25, r24
309; CHECK-NEXT:    lsl r25
310; CHECK-NEXT:    sbc r25, r25
311; CHECK-NEXT:    ret
312;
313; NOX-LABEL: foob1:
314; NOX:       ; %bb.0: ; %entry
315; NOX-NEXT:    subi r22, lo8(-(arrb3))
316; NOX-NEXT:    sbci r23, hi8(-(arrb3))
317; NOX-NEXT:    movw r30, r22
318; NOX-NEXT:    ldi r18, 2
319; NOX-NEXT:    out 59, r18
320; NOX-NEXT:    elpm
321; NOX-NEXT:    mov r18, r0
322; NOX-NEXT:    subi r24, lo8(-(arrb1))
323; NOX-NEXT:    sbci r25, hi8(-(arrb1))
324; NOX-NEXT:    movw r30, r24
325; NOX-NEXT:    lpm
326; NOX-NEXT:    mov r24, r0
327; NOX-NEXT:    sub r24, r18
328; NOX-NEXT:    mov r25, r24
329; NOX-NEXT:    lsl r25
330; NOX-NEXT:    sbc r25, r25
331; NOX-NEXT:    ret
332entry:
333  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %a
334  %0 = load i8, ptr addrspace(1) %arrayidx, align 1
335  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %b
336  %1 = load i8, ptr addrspace(3) %arrayidx1, align 1
337  %sub = sub i8 %0, %1
338  ret i8 %sub
339}
340
341define signext i8 @foob2(i16 %a, i16 %b) {
342; CHECK-LABEL: foob2:
343; CHECK:       ; %bb.0: ; %entry
344; CHECK-NEXT:    subi r24, lo8(-(arrb5))
345; CHECK-NEXT:    sbci r25, hi8(-(arrb5))
346; CHECK-NEXT:    movw r30, r24
347; CHECK-NEXT:    ldi r24, 4
348; CHECK-NEXT:    out 59, r24
349; CHECK-NEXT:    elpm r24, Z
350; CHECK-NEXT:    subi r22, lo8(-(arrb1))
351; CHECK-NEXT:    sbci r23, hi8(-(arrb1))
352; CHECK-NEXT:    movw r30, r22
353; CHECK-NEXT:    lpm r25, Z
354; CHECK-NEXT:    sub r24, r25
355; CHECK-NEXT:    mov r25, r24
356; CHECK-NEXT:    lsl r25
357; CHECK-NEXT:    sbc r25, r25
358; CHECK-NEXT:    ret
359;
360; NOX-LABEL: foob2:
361; NOX:       ; %bb.0: ; %entry
362; NOX-NEXT:    subi r24, lo8(-(arrb5))
363; NOX-NEXT:    sbci r25, hi8(-(arrb5))
364; NOX-NEXT:    movw r30, r24
365; NOX-NEXT:    ldi r24, 4
366; NOX-NEXT:    out 59, r24
367; NOX-NEXT:    elpm
368; NOX-NEXT:    mov r24, r0
369; NOX-NEXT:    subi r22, lo8(-(arrb1))
370; NOX-NEXT:    sbci r23, hi8(-(arrb1))
371; NOX-NEXT:    movw r30, r22
372; NOX-NEXT:    lpm
373; NOX-NEXT:    mov r25, r0
374; NOX-NEXT:    sub r24, r25
375; NOX-NEXT:    mov r25, r24
376; NOX-NEXT:    lsl r25
377; NOX-NEXT:    sbc r25, r25
378; NOX-NEXT:    ret
379entry:
380  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(5) @arrb5, i16 0, i16 %a
381  %0 = load i8, ptr addrspace(5) %arrayidx, align 1
382  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %b
383  %1 = load i8, ptr addrspace(1) %arrayidx1, align 1
384  %sub = sub i8 %0, %1
385  ret i8 %sub
386}
387
388define signext i8 @foob3(i16 %a, i16 %b) {
389; CHECK-LABEL: foob3:
390; CHECK:       ; %bb.0: ; %entry
391; CHECK-NEXT:    subi r22, lo8(-(arrb5))
392; CHECK-NEXT:    sbci r23, hi8(-(arrb5))
393; CHECK-NEXT:    movw r30, r22
394; CHECK-NEXT:    ldi r18, 4
395; CHECK-NEXT:    out 59, r18
396; CHECK-NEXT:    elpm r18, Z
397; CHECK-NEXT:    subi r24, lo8(-(arrb3))
398; CHECK-NEXT:    sbci r25, hi8(-(arrb3))
399; CHECK-NEXT:    movw r30, r24
400; CHECK-NEXT:    ldi r24, 2
401; CHECK-NEXT:    out 59, r24
402; CHECK-NEXT:    elpm r24, Z
403; CHECK-NEXT:    sub r24, r18
404; CHECK-NEXT:    mov r25, r24
405; CHECK-NEXT:    lsl r25
406; CHECK-NEXT:    sbc r25, r25
407; CHECK-NEXT:    ret
408;
409; NOX-LABEL: foob3:
410; NOX:       ; %bb.0: ; %entry
411; NOX-NEXT:    subi r22, lo8(-(arrb5))
412; NOX-NEXT:    sbci r23, hi8(-(arrb5))
413; NOX-NEXT:    movw r30, r22
414; NOX-NEXT:    ldi r18, 4
415; NOX-NEXT:    out 59, r18
416; NOX-NEXT:    elpm
417; NOX-NEXT:    mov r18, r0
418; NOX-NEXT:    subi r24, lo8(-(arrb3))
419; NOX-NEXT:    sbci r25, hi8(-(arrb3))
420; NOX-NEXT:    movw r30, r24
421; NOX-NEXT:    ldi r24, 2
422; NOX-NEXT:    out 59, r24
423; NOX-NEXT:    elpm
424; NOX-NEXT:    mov r24, r0
425; NOX-NEXT:    sub r24, r18
426; NOX-NEXT:    mov r25, r24
427; NOX-NEXT:    lsl r25
428; NOX-NEXT:    sbc r25, r25
429; NOX-NEXT:    ret
430entry:
431  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %a
432  %0 = load i8, ptr addrspace(3) %arrayidx, align 1
433  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(5) @arrb5, i16 0, i16 %b
434  %1 = load i8, ptr addrspace(5) %arrayidx1, align 1
435  %sub = sub i8 %0, %1
436  ret i8 %sub
437}
438
439define signext i8 @foob4(i16 %a, i16 %b) {
440; CHECK-LABEL: foob4:
441; CHECK:       ; %bb.0: ; %entry
442; CHECK-NEXT:    subi r22, lo8(-(arrb3))
443; CHECK-NEXT:    sbci r23, hi8(-(arrb3))
444; CHECK-NEXT:    movw r30, r22
445; CHECK-NEXT:    ldi r18, 2
446; CHECK-NEXT:    out 59, r18
447; CHECK-NEXT:    elpm r19, Z
448; CHECK-NEXT:    subi r24, lo8(-(arrb3))
449; CHECK-NEXT:    sbci r25, hi8(-(arrb3))
450; CHECK-NEXT:    movw r30, r24
451; CHECK-NEXT:    out 59, r18
452; CHECK-NEXT:    elpm r24, Z
453; CHECK-NEXT:    sub r24, r19
454; CHECK-NEXT:    mov r25, r24
455; CHECK-NEXT:    lsl r25
456; CHECK-NEXT:    sbc r25, r25
457; CHECK-NEXT:    ret
458;
459; NOX-LABEL: foob4:
460; NOX:       ; %bb.0: ; %entry
461; NOX-NEXT:    subi r22, lo8(-(arrb3))
462; NOX-NEXT:    sbci r23, hi8(-(arrb3))
463; NOX-NEXT:    movw r30, r22
464; NOX-NEXT:    ldi r18, 2
465; NOX-NEXT:    out 59, r18
466; NOX-NEXT:    elpm
467; NOX-NEXT:    mov r19, r0
468; NOX-NEXT:    subi r24, lo8(-(arrb3))
469; NOX-NEXT:    sbci r25, hi8(-(arrb3))
470; NOX-NEXT:    movw r30, r24
471; NOX-NEXT:    out 59, r18
472; NOX-NEXT:    elpm
473; NOX-NEXT:    mov r24, r0
474; NOX-NEXT:    sub r24, r19
475; NOX-NEXT:    mov r25, r24
476; NOX-NEXT:    lsl r25
477; NOX-NEXT:    sbc r25, r25
478; NOX-NEXT:    ret
479entry:
480  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %a
481  %0 = load i8, ptr addrspace(3) %arrayidx, align 1
482  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %b
483  %1 = load i8, ptr addrspace(3) %arrayidx1, align 1
484  %sub = sub i8 %0, %1
485  ret i8 %sub
486}
487