xref: /llvm-project/llvm/test/CodeGen/AVR/elpm.ll (revision 7bdc80f35c325d148b1ddbdfce7dea8c6ba7af84)
194173dc2SBen Shi; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
24fa9dc94SBen Shi; RUN: llc < %s -mtriple=avr -mattr=+movw -mattr=+elpm -mattr=+elpmx -mattr=+lpm -mattr=+lpmx -verify-machineinstrs \
34fa9dc94SBen Shi; RUN:     | FileCheck %s
44fa9dc94SBen Shi; RUN: llc < %s -mtriple=avr -mattr=+movw -mattr=+elpm -mattr=-elpmx -mattr=+lpm -mattr=-lpmx -verify-machineinstrs \
54fa9dc94SBen Shi; RUN:     | FileCheck --check-prefix=NOX %s
694173dc2SBen Shi
794173dc2SBen Shi@arr0 = addrspace(1) constant [4 x i16] [i16 123, i16 24, i16 56, i16 37], align 1
894173dc2SBen Shi@arr1 = addrspace(2) constant [4 x i16] [i16 123, i16 34, i16 46, i16 27], align 1
994173dc2SBen Shi@arr2 = addrspace(3) constant [4 x i16] [i16 123, i16 23, i16 45, i16 17], align 1
1094173dc2SBen Shi
1194173dc2SBen Shidefine i16 @foo0(i16 %a, i16 %b) {
1294173dc2SBen Shi; CHECK-LABEL: foo0:
1394173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
1494173dc2SBen Shi; CHECK-NEXT:    lsl r22
1594173dc2SBen Shi; CHECK-NEXT:    rol r23
16c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arr0))
17c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arr0))
1894173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
1994173dc2SBen Shi; CHECK-NEXT:    lpm r18, Z+
2094173dc2SBen Shi; CHECK-NEXT:    lpm r19, Z
2194173dc2SBen Shi; CHECK-NEXT:    lsl r24
2294173dc2SBen Shi; CHECK-NEXT:    rol r25
23c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arr0))
24c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arr0))
2594173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
2694173dc2SBen Shi; CHECK-NEXT:    lpm r24, Z+
2794173dc2SBen Shi; CHECK-NEXT:    lpm r25, Z
2894173dc2SBen Shi; CHECK-NEXT:    sub r24, r18
2994173dc2SBen Shi; CHECK-NEXT:    sbc r25, r19
3094173dc2SBen Shi; CHECK-NEXT:    ret
31acb4d143SBen Shi;
32acb4d143SBen Shi; NOX-LABEL: foo0:
33acb4d143SBen Shi; NOX:       ; %bb.0: ; %entry
34acb4d143SBen Shi; NOX-NEXT:    lsl r22
35acb4d143SBen Shi; NOX-NEXT:    rol r23
36acb4d143SBen Shi; NOX-NEXT:    subi r22, lo8(-(arr0))
37acb4d143SBen Shi; NOX-NEXT:    sbci r23, hi8(-(arr0))
38acb4d143SBen Shi; NOX-NEXT:    movw r30, r22
39acb4d143SBen Shi; NOX-NEXT:    lpm
40acb4d143SBen Shi; NOX-NEXT:    mov r18, r0
41acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
42acb4d143SBen Shi; NOX-NEXT:    lpm
43acb4d143SBen Shi; NOX-NEXT:    mov r19, r0
44acb4d143SBen Shi; NOX-NEXT:    lsl r24
45acb4d143SBen Shi; NOX-NEXT:    rol r25
46acb4d143SBen Shi; NOX-NEXT:    subi r24, lo8(-(arr0))
47acb4d143SBen Shi; NOX-NEXT:    sbci r25, hi8(-(arr0))
48acb4d143SBen Shi; NOX-NEXT:    movw r30, r24
49acb4d143SBen Shi; NOX-NEXT:    lpm
50acb4d143SBen Shi; NOX-NEXT:    mov r24, r0
51acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
52acb4d143SBen Shi; NOX-NEXT:    lpm
53acb4d143SBen Shi; NOX-NEXT:    mov r25, r0
54acb4d143SBen Shi; NOX-NEXT:    sub r24, r18
55acb4d143SBen Shi; NOX-NEXT:    sbc r25, r19
56acb4d143SBen Shi; NOX-NEXT:    ret
5794173dc2SBen Shientry:
58*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %a
59*7bdc80f3SNikita Popov  %0 = load i16, ptr addrspace(1) %arrayidx, align 1
60*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %b
61*7bdc80f3SNikita Popov  %1 = load i16, ptr addrspace(1) %arrayidx1, align 1
6294173dc2SBen Shi  %sub = sub nsw i16 %0, %1
6394173dc2SBen Shi  ret i16 %sub
6494173dc2SBen Shi}
6594173dc2SBen Shi
6694173dc2SBen Shidefine i16 @foo1(i16 %a, i16 %b) {
6794173dc2SBen Shi; CHECK-LABEL: foo1:
6894173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
6994173dc2SBen Shi; CHECK-NEXT:    lsl r22
7094173dc2SBen Shi; CHECK-NEXT:    rol r23
71c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arr1))
72c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arr1))
7394173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
7494173dc2SBen Shi; CHECK-NEXT:    ldi r18, 1
7594173dc2SBen Shi; CHECK-NEXT:    out 59, r18
7691ae1afdSAyke van Laethem; CHECK-NEXT:    elpm r20, Z+
7791ae1afdSAyke van Laethem; CHECK-NEXT:    elpm r21, Z
7894173dc2SBen Shi; CHECK-NEXT:    lsl r24
7994173dc2SBen Shi; CHECK-NEXT:    rol r25
80c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arr0))
81c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arr0))
8294173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
8394173dc2SBen Shi; CHECK-NEXT:    lpm r24, Z+
8494173dc2SBen Shi; CHECK-NEXT:    lpm r25, Z
8591ae1afdSAyke van Laethem; CHECK-NEXT:    sub r24, r20
8691ae1afdSAyke van Laethem; CHECK-NEXT:    sbc r25, r21
8794173dc2SBen Shi; CHECK-NEXT:    ret
88acb4d143SBen Shi;
89acb4d143SBen Shi; NOX-LABEL: foo1:
90acb4d143SBen Shi; NOX:       ; %bb.0: ; %entry
91acb4d143SBen Shi; NOX-NEXT:    lsl r22
92acb4d143SBen Shi; NOX-NEXT:    rol r23
93acb4d143SBen Shi; NOX-NEXT:    subi r22, lo8(-(arr1))
94acb4d143SBen Shi; NOX-NEXT:    sbci r23, hi8(-(arr1))
95acb4d143SBen Shi; NOX-NEXT:    movw r30, r22
96acb4d143SBen Shi; NOX-NEXT:    ldi r18, 1
97acb4d143SBen Shi; NOX-NEXT:    out 59, r18
98acb4d143SBen Shi; NOX-NEXT:    elpm
99acb4d143SBen Shi; NOX-NEXT:    mov r20, r0
100acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
101acb4d143SBen Shi; NOX-NEXT:    elpm
102acb4d143SBen Shi; NOX-NEXT:    mov r21, r0
103acb4d143SBen Shi; NOX-NEXT:    lsl r24
104acb4d143SBen Shi; NOX-NEXT:    rol r25
105acb4d143SBen Shi; NOX-NEXT:    subi r24, lo8(-(arr0))
106acb4d143SBen Shi; NOX-NEXT:    sbci r25, hi8(-(arr0))
107acb4d143SBen Shi; NOX-NEXT:    movw r30, r24
108acb4d143SBen Shi; NOX-NEXT:    lpm
109acb4d143SBen Shi; NOX-NEXT:    mov r24, r0
110acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
111acb4d143SBen Shi; NOX-NEXT:    lpm
112acb4d143SBen Shi; NOX-NEXT:    mov r25, r0
113acb4d143SBen Shi; NOX-NEXT:    sub r24, r20
114acb4d143SBen Shi; NOX-NEXT:    sbc r25, r21
115acb4d143SBen Shi; NOX-NEXT:    ret
11694173dc2SBen Shientry:
117*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %a
118*7bdc80f3SNikita Popov  %0 = load i16, ptr addrspace(1) %arrayidx, align 1
119*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(2) @arr1, i16 0, i16 %b
120*7bdc80f3SNikita Popov  %1 = load i16, ptr addrspace(2) %arrayidx1, align 1
12194173dc2SBen Shi  %sub = sub nsw i16 %0, %1
12294173dc2SBen Shi  ret i16 %sub
12394173dc2SBen Shi}
12494173dc2SBen Shi
12594173dc2SBen Shidefine i16 @foo2(i16 %a, i16 %b) {
12694173dc2SBen Shi; CHECK-LABEL: foo2:
12794173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
12894173dc2SBen Shi; CHECK-NEXT:    lsl r24
12994173dc2SBen Shi; CHECK-NEXT:    rol r25
130c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arr2))
131c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arr2))
13294173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
13391ae1afdSAyke van Laethem; CHECK-NEXT:    ldi r18, 2
13491ae1afdSAyke van Laethem; CHECK-NEXT:    out 59, r18
13594173dc2SBen Shi; CHECK-NEXT:    elpm r24, Z+
13694173dc2SBen Shi; CHECK-NEXT:    elpm r25, Z
13794173dc2SBen Shi; CHECK-NEXT:    lsl r22
13894173dc2SBen Shi; CHECK-NEXT:    rol r23
139c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arr0))
140c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arr0))
14194173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
14294173dc2SBen Shi; CHECK-NEXT:    lpm r18, Z+
14394173dc2SBen Shi; CHECK-NEXT:    lpm r19, Z
14494173dc2SBen Shi; CHECK-NEXT:    sub r24, r18
14594173dc2SBen Shi; CHECK-NEXT:    sbc r25, r19
14694173dc2SBen Shi; CHECK-NEXT:    ret
147acb4d143SBen Shi;
148acb4d143SBen Shi; NOX-LABEL: foo2:
149acb4d143SBen Shi; NOX:       ; %bb.0: ; %entry
150acb4d143SBen Shi; NOX-NEXT:    lsl r24
151acb4d143SBen Shi; NOX-NEXT:    rol r25
152acb4d143SBen Shi; NOX-NEXT:    subi r24, lo8(-(arr2))
153acb4d143SBen Shi; NOX-NEXT:    sbci r25, hi8(-(arr2))
154acb4d143SBen Shi; NOX-NEXT:    movw r30, r24
155acb4d143SBen Shi; NOX-NEXT:    ldi r18, 2
156acb4d143SBen Shi; NOX-NEXT:    out 59, r18
157acb4d143SBen Shi; NOX-NEXT:    elpm
158acb4d143SBen Shi; NOX-NEXT:    mov r24, r0
159acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
160acb4d143SBen Shi; NOX-NEXT:    elpm
161acb4d143SBen Shi; NOX-NEXT:    mov r25, r0
162acb4d143SBen Shi; NOX-NEXT:    lsl r22
163acb4d143SBen Shi; NOX-NEXT:    rol r23
164acb4d143SBen Shi; NOX-NEXT:    subi r22, lo8(-(arr0))
165acb4d143SBen Shi; NOX-NEXT:    sbci r23, hi8(-(arr0))
166acb4d143SBen Shi; NOX-NEXT:    movw r30, r22
167acb4d143SBen Shi; NOX-NEXT:    lpm
168acb4d143SBen Shi; NOX-NEXT:    mov r18, r0
169acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
170acb4d143SBen Shi; NOX-NEXT:    lpm
171acb4d143SBen Shi; NOX-NEXT:    mov r19, r0
172acb4d143SBen Shi; NOX-NEXT:    sub r24, r18
173acb4d143SBen Shi; NOX-NEXT:    sbc r25, r19
174acb4d143SBen Shi; NOX-NEXT:    ret
17594173dc2SBen Shientry:
176*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(3) @arr2, i16 0, i16 %a
177*7bdc80f3SNikita Popov  %0 = load i16, ptr addrspace(3) %arrayidx, align 1
178*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(1) @arr0, i16 0, i16 %b
179*7bdc80f3SNikita Popov  %1 = load i16, ptr addrspace(1) %arrayidx1, align 1
18094173dc2SBen Shi  %sub = sub nsw i16 %0, %1
18194173dc2SBen Shi  ret i16 %sub
18294173dc2SBen Shi}
18394173dc2SBen Shi
18494173dc2SBen Shidefine i16 @foo3(i16 %a, i16 %b) {
18594173dc2SBen Shi; CHECK-LABEL: foo3:
18694173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
18794173dc2SBen Shi; CHECK-NEXT:    lsl r22
18894173dc2SBen Shi; CHECK-NEXT:    rol r23
189c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arr1))
190c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arr1))
19194173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
19294173dc2SBen Shi; CHECK-NEXT:    ldi r18, 1
19394173dc2SBen Shi; CHECK-NEXT:    out 59, r18
19491ae1afdSAyke van Laethem; CHECK-NEXT:    elpm r20, Z+
19591ae1afdSAyke van Laethem; CHECK-NEXT:    elpm r21, Z
19694173dc2SBen Shi; CHECK-NEXT:    lsl r24
19794173dc2SBen Shi; CHECK-NEXT:    rol r25
198c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arr2))
199c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arr2))
20094173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
20191ae1afdSAyke van Laethem; CHECK-NEXT:    ldi r18, 2
20291ae1afdSAyke van Laethem; CHECK-NEXT:    out 59, r18
20394173dc2SBen Shi; CHECK-NEXT:    elpm r24, Z+
20494173dc2SBen Shi; CHECK-NEXT:    elpm r25, Z
20591ae1afdSAyke van Laethem; CHECK-NEXT:    sub r24, r20
20691ae1afdSAyke van Laethem; CHECK-NEXT:    sbc r25, r21
20794173dc2SBen Shi; CHECK-NEXT:    ret
208acb4d143SBen Shi;
209acb4d143SBen Shi; NOX-LABEL: foo3:
210acb4d143SBen Shi; NOX:       ; %bb.0: ; %entry
211acb4d143SBen Shi; NOX-NEXT:    lsl r22
212acb4d143SBen Shi; NOX-NEXT:    rol r23
213acb4d143SBen Shi; NOX-NEXT:    subi r22, lo8(-(arr1))
214acb4d143SBen Shi; NOX-NEXT:    sbci r23, hi8(-(arr1))
215acb4d143SBen Shi; NOX-NEXT:    movw r30, r22
216acb4d143SBen Shi; NOX-NEXT:    ldi r18, 1
217acb4d143SBen Shi; NOX-NEXT:    out 59, r18
218acb4d143SBen Shi; NOX-NEXT:    elpm
219acb4d143SBen Shi; NOX-NEXT:    mov r20, r0
220acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
221acb4d143SBen Shi; NOX-NEXT:    elpm
222acb4d143SBen Shi; NOX-NEXT:    mov r21, r0
223acb4d143SBen Shi; NOX-NEXT:    lsl r24
224acb4d143SBen Shi; NOX-NEXT:    rol r25
225acb4d143SBen Shi; NOX-NEXT:    subi r24, lo8(-(arr2))
226acb4d143SBen Shi; NOX-NEXT:    sbci r25, hi8(-(arr2))
227acb4d143SBen Shi; NOX-NEXT:    movw r30, r24
228acb4d143SBen Shi; NOX-NEXT:    ldi r18, 2
229acb4d143SBen Shi; NOX-NEXT:    out 59, r18
230acb4d143SBen Shi; NOX-NEXT:    elpm
231acb4d143SBen Shi; NOX-NEXT:    mov r24, r0
232acb4d143SBen Shi; NOX-NEXT:    adiw r30, 1
233acb4d143SBen Shi; NOX-NEXT:    elpm
234acb4d143SBen Shi; NOX-NEXT:    mov r25, r0
235acb4d143SBen Shi; NOX-NEXT:    sub r24, r20
236acb4d143SBen Shi; NOX-NEXT:    sbc r25, r21
237acb4d143SBen Shi; NOX-NEXT:    ret
23894173dc2SBen Shientry:
239*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i16], ptr addrspace(3) @arr2, i16 0, i16 %a
240*7bdc80f3SNikita Popov  %0 = load i16, ptr addrspace(3) %arrayidx, align 1
241*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i16], ptr addrspace(2) @arr1, i16 0, i16 %b
242*7bdc80f3SNikita Popov  %1 = load i16, ptr addrspace(2) %arrayidx1, align 1
24394173dc2SBen Shi  %sub = sub nsw i16 %0, %1
24494173dc2SBen Shi  ret i16 %sub
24594173dc2SBen Shi}
24694173dc2SBen Shi
2474fa9dc94SBen Shi@arrb1 = addrspace(1) constant [4 x i8] c"abcd", align 1
2484fa9dc94SBen Shi@arrb3 = addrspace(3) constant [4 x i8] c"1234", align 1
2494fa9dc94SBen Shi@arrb5 = addrspace(5) constant [4 x i8] c"HJLQ", align 1
25094173dc2SBen Shi
25194173dc2SBen Shidefine signext i8 @foob0(i16 %a, i16 %b) {
25294173dc2SBen Shi; CHECK-LABEL: foob0:
25394173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
254c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arrb1))
255c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arrb1))
25694173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
25794173dc2SBen Shi; CHECK-NEXT:    lpm r18, Z
258c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arrb1))
259c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arrb1))
26094173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
26194173dc2SBen Shi; CHECK-NEXT:    lpm r24, Z
26294173dc2SBen Shi; CHECK-NEXT:    sub r24, r18
26394173dc2SBen Shi; CHECK-NEXT:    mov r25, r24
26494173dc2SBen Shi; CHECK-NEXT:    lsl r25
26594173dc2SBen Shi; CHECK-NEXT:    sbc r25, r25
26694173dc2SBen Shi; CHECK-NEXT:    ret
2672a6e39dbSBen Shi;
2682a6e39dbSBen Shi; NOX-LABEL: foob0:
2692a6e39dbSBen Shi; NOX:       ; %bb.0: ; %entry
2702a6e39dbSBen Shi; NOX-NEXT:    subi r22, lo8(-(arrb1))
2712a6e39dbSBen Shi; NOX-NEXT:    sbci r23, hi8(-(arrb1))
2722a6e39dbSBen Shi; NOX-NEXT:    movw r30, r22
2732a6e39dbSBen Shi; NOX-NEXT:    lpm
2742a6e39dbSBen Shi; NOX-NEXT:    mov r18, r0
2752a6e39dbSBen Shi; NOX-NEXT:    subi r24, lo8(-(arrb1))
2762a6e39dbSBen Shi; NOX-NEXT:    sbci r25, hi8(-(arrb1))
2772a6e39dbSBen Shi; NOX-NEXT:    movw r30, r24
2782a6e39dbSBen Shi; NOX-NEXT:    lpm
2792a6e39dbSBen Shi; NOX-NEXT:    mov r24, r0
2802a6e39dbSBen Shi; NOX-NEXT:    sub r24, r18
2812a6e39dbSBen Shi; NOX-NEXT:    mov r25, r24
2822a6e39dbSBen Shi; NOX-NEXT:    lsl r25
2832a6e39dbSBen Shi; NOX-NEXT:    sbc r25, r25
2842a6e39dbSBen Shi; NOX-NEXT:    ret
28594173dc2SBen Shientry:
286*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %a
287*7bdc80f3SNikita Popov  %0 = load i8, ptr addrspace(1) %arrayidx, align 1
288*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %b
289*7bdc80f3SNikita Popov  %1 = load i8, ptr addrspace(1) %arrayidx1, align 1
29094173dc2SBen Shi  %sub = sub i8 %0, %1
29194173dc2SBen Shi  ret i8 %sub
29294173dc2SBen Shi}
29394173dc2SBen Shi
29494173dc2SBen Shidefine signext i8 @foob1(i16 %a, i16 %b) {
29594173dc2SBen Shi; CHECK-LABEL: foob1:
29694173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
297c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arrb3))
298c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arrb3))
29994173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
30094173dc2SBen Shi; CHECK-NEXT:    ldi r18, 2
30194173dc2SBen Shi; CHECK-NEXT:    out 59, r18
30294173dc2SBen Shi; CHECK-NEXT:    elpm r18, Z
303c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arrb1))
304c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arrb1))
30594173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
30694173dc2SBen Shi; CHECK-NEXT:    lpm r24, Z
30794173dc2SBen Shi; CHECK-NEXT:    sub r24, r18
30894173dc2SBen Shi; CHECK-NEXT:    mov r25, r24
30994173dc2SBen Shi; CHECK-NEXT:    lsl r25
31094173dc2SBen Shi; CHECK-NEXT:    sbc r25, r25
31194173dc2SBen Shi; CHECK-NEXT:    ret
3122a6e39dbSBen Shi;
3132a6e39dbSBen Shi; NOX-LABEL: foob1:
3142a6e39dbSBen Shi; NOX:       ; %bb.0: ; %entry
3152a6e39dbSBen Shi; NOX-NEXT:    subi r22, lo8(-(arrb3))
3162a6e39dbSBen Shi; NOX-NEXT:    sbci r23, hi8(-(arrb3))
3172a6e39dbSBen Shi; NOX-NEXT:    movw r30, r22
3182a6e39dbSBen Shi; NOX-NEXT:    ldi r18, 2
3192a6e39dbSBen Shi; NOX-NEXT:    out 59, r18
3202a6e39dbSBen Shi; NOX-NEXT:    elpm
3212a6e39dbSBen Shi; NOX-NEXT:    mov r18, r0
3222a6e39dbSBen Shi; NOX-NEXT:    subi r24, lo8(-(arrb1))
3232a6e39dbSBen Shi; NOX-NEXT:    sbci r25, hi8(-(arrb1))
3242a6e39dbSBen Shi; NOX-NEXT:    movw r30, r24
3252a6e39dbSBen Shi; NOX-NEXT:    lpm
3262a6e39dbSBen Shi; NOX-NEXT:    mov r24, r0
3272a6e39dbSBen Shi; NOX-NEXT:    sub r24, r18
3282a6e39dbSBen Shi; NOX-NEXT:    mov r25, r24
3292a6e39dbSBen Shi; NOX-NEXT:    lsl r25
3302a6e39dbSBen Shi; NOX-NEXT:    sbc r25, r25
3312a6e39dbSBen Shi; NOX-NEXT:    ret
33294173dc2SBen Shientry:
333*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %a
334*7bdc80f3SNikita Popov  %0 = load i8, ptr addrspace(1) %arrayidx, align 1
335*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %b
336*7bdc80f3SNikita Popov  %1 = load i8, ptr addrspace(3) %arrayidx1, align 1
33794173dc2SBen Shi  %sub = sub i8 %0, %1
33894173dc2SBen Shi  ret i8 %sub
33994173dc2SBen Shi}
34094173dc2SBen Shi
34194173dc2SBen Shidefine signext i8 @foob2(i16 %a, i16 %b) {
34294173dc2SBen Shi; CHECK-LABEL: foob2:
34394173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
344c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arrb5))
345c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arrb5))
34694173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
34794173dc2SBen Shi; CHECK-NEXT:    ldi r24, 4
34894173dc2SBen Shi; CHECK-NEXT:    out 59, r24
34994173dc2SBen Shi; CHECK-NEXT:    elpm r24, Z
350c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arrb1))
351c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arrb1))
35294173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
35394173dc2SBen Shi; CHECK-NEXT:    lpm r25, Z
35494173dc2SBen Shi; CHECK-NEXT:    sub r24, r25
35594173dc2SBen Shi; CHECK-NEXT:    mov r25, r24
35694173dc2SBen Shi; CHECK-NEXT:    lsl r25
35794173dc2SBen Shi; CHECK-NEXT:    sbc r25, r25
35894173dc2SBen Shi; CHECK-NEXT:    ret
3592a6e39dbSBen Shi;
3602a6e39dbSBen Shi; NOX-LABEL: foob2:
3612a6e39dbSBen Shi; NOX:       ; %bb.0: ; %entry
3622a6e39dbSBen Shi; NOX-NEXT:    subi r24, lo8(-(arrb5))
3632a6e39dbSBen Shi; NOX-NEXT:    sbci r25, hi8(-(arrb5))
3642a6e39dbSBen Shi; NOX-NEXT:    movw r30, r24
3652a6e39dbSBen Shi; NOX-NEXT:    ldi r24, 4
3662a6e39dbSBen Shi; NOX-NEXT:    out 59, r24
3672a6e39dbSBen Shi; NOX-NEXT:    elpm
3682a6e39dbSBen Shi; NOX-NEXT:    mov r24, r0
3692a6e39dbSBen Shi; NOX-NEXT:    subi r22, lo8(-(arrb1))
3702a6e39dbSBen Shi; NOX-NEXT:    sbci r23, hi8(-(arrb1))
3712a6e39dbSBen Shi; NOX-NEXT:    movw r30, r22
3722a6e39dbSBen Shi; NOX-NEXT:    lpm
3732a6e39dbSBen Shi; NOX-NEXT:    mov r25, r0
3742a6e39dbSBen Shi; NOX-NEXT:    sub r24, r25
3752a6e39dbSBen Shi; NOX-NEXT:    mov r25, r24
3762a6e39dbSBen Shi; NOX-NEXT:    lsl r25
3772a6e39dbSBen Shi; NOX-NEXT:    sbc r25, r25
3782a6e39dbSBen Shi; NOX-NEXT:    ret
37994173dc2SBen Shientry:
380*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(5) @arrb5, i16 0, i16 %a
381*7bdc80f3SNikita Popov  %0 = load i8, ptr addrspace(5) %arrayidx, align 1
382*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(1) @arrb1, i16 0, i16 %b
383*7bdc80f3SNikita Popov  %1 = load i8, ptr addrspace(1) %arrayidx1, align 1
38494173dc2SBen Shi  %sub = sub i8 %0, %1
38594173dc2SBen Shi  ret i8 %sub
38694173dc2SBen Shi}
38794173dc2SBen Shi
38894173dc2SBen Shidefine signext i8 @foob3(i16 %a, i16 %b) {
38994173dc2SBen Shi; CHECK-LABEL: foob3:
39094173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
391c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arrb5))
392c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arrb5))
39394173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
39494173dc2SBen Shi; CHECK-NEXT:    ldi r18, 4
39594173dc2SBen Shi; CHECK-NEXT:    out 59, r18
39694173dc2SBen Shi; CHECK-NEXT:    elpm r18, Z
397c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arrb3))
398c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arrb3))
39994173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
40094173dc2SBen Shi; CHECK-NEXT:    ldi r24, 2
40194173dc2SBen Shi; CHECK-NEXT:    out 59, r24
40294173dc2SBen Shi; CHECK-NEXT:    elpm r24, Z
40394173dc2SBen Shi; CHECK-NEXT:    sub r24, r18
40494173dc2SBen Shi; CHECK-NEXT:    mov r25, r24
40594173dc2SBen Shi; CHECK-NEXT:    lsl r25
40694173dc2SBen Shi; CHECK-NEXT:    sbc r25, r25
40794173dc2SBen Shi; CHECK-NEXT:    ret
4084fa9dc94SBen Shi;
4094fa9dc94SBen Shi; NOX-LABEL: foob3:
4104fa9dc94SBen Shi; NOX:       ; %bb.0: ; %entry
4114fa9dc94SBen Shi; NOX-NEXT:    subi r22, lo8(-(arrb5))
4124fa9dc94SBen Shi; NOX-NEXT:    sbci r23, hi8(-(arrb5))
4134fa9dc94SBen Shi; NOX-NEXT:    movw r30, r22
4144fa9dc94SBen Shi; NOX-NEXT:    ldi r18, 4
4154fa9dc94SBen Shi; NOX-NEXT:    out 59, r18
4164fa9dc94SBen Shi; NOX-NEXT:    elpm
4174fa9dc94SBen Shi; NOX-NEXT:    mov r18, r0
4184fa9dc94SBen Shi; NOX-NEXT:    subi r24, lo8(-(arrb3))
4194fa9dc94SBen Shi; NOX-NEXT:    sbci r25, hi8(-(arrb3))
4204fa9dc94SBen Shi; NOX-NEXT:    movw r30, r24
4214fa9dc94SBen Shi; NOX-NEXT:    ldi r24, 2
4224fa9dc94SBen Shi; NOX-NEXT:    out 59, r24
4234fa9dc94SBen Shi; NOX-NEXT:    elpm
4244fa9dc94SBen Shi; NOX-NEXT:    mov r24, r0
4254fa9dc94SBen Shi; NOX-NEXT:    sub r24, r18
4264fa9dc94SBen Shi; NOX-NEXT:    mov r25, r24
4274fa9dc94SBen Shi; NOX-NEXT:    lsl r25
4284fa9dc94SBen Shi; NOX-NEXT:    sbc r25, r25
4294fa9dc94SBen Shi; NOX-NEXT:    ret
43094173dc2SBen Shientry:
431*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %a
432*7bdc80f3SNikita Popov  %0 = load i8, ptr addrspace(3) %arrayidx, align 1
433*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(5) @arrb5, i16 0, i16 %b
434*7bdc80f3SNikita Popov  %1 = load i8, ptr addrspace(5) %arrayidx1, align 1
43594173dc2SBen Shi  %sub = sub i8 %0, %1
43694173dc2SBen Shi  ret i8 %sub
43794173dc2SBen Shi}
43894173dc2SBen Shi
43994173dc2SBen Shidefine signext i8 @foob4(i16 %a, i16 %b) {
44094173dc2SBen Shi; CHECK-LABEL: foob4:
44194173dc2SBen Shi; CHECK:       ; %bb.0: ; %entry
442c41d4250SBen Shi; CHECK-NEXT:    subi r22, lo8(-(arrb3))
443c41d4250SBen Shi; CHECK-NEXT:    sbci r23, hi8(-(arrb3))
44494173dc2SBen Shi; CHECK-NEXT:    movw r30, r22
44594173dc2SBen Shi; CHECK-NEXT:    ldi r18, 2
44694173dc2SBen Shi; CHECK-NEXT:    out 59, r18
44794173dc2SBen Shi; CHECK-NEXT:    elpm r19, Z
448c41d4250SBen Shi; CHECK-NEXT:    subi r24, lo8(-(arrb3))
449c41d4250SBen Shi; CHECK-NEXT:    sbci r25, hi8(-(arrb3))
45094173dc2SBen Shi; CHECK-NEXT:    movw r30, r24
45194173dc2SBen Shi; CHECK-NEXT:    out 59, r18
45294173dc2SBen Shi; CHECK-NEXT:    elpm r24, Z
45394173dc2SBen Shi; CHECK-NEXT:    sub r24, r19
45494173dc2SBen Shi; CHECK-NEXT:    mov r25, r24
45594173dc2SBen Shi; CHECK-NEXT:    lsl r25
45694173dc2SBen Shi; CHECK-NEXT:    sbc r25, r25
45794173dc2SBen Shi; CHECK-NEXT:    ret
4584fa9dc94SBen Shi;
4594fa9dc94SBen Shi; NOX-LABEL: foob4:
4604fa9dc94SBen Shi; NOX:       ; %bb.0: ; %entry
4614fa9dc94SBen Shi; NOX-NEXT:    subi r22, lo8(-(arrb3))
4624fa9dc94SBen Shi; NOX-NEXT:    sbci r23, hi8(-(arrb3))
4634fa9dc94SBen Shi; NOX-NEXT:    movw r30, r22
4644fa9dc94SBen Shi; NOX-NEXT:    ldi r18, 2
4654fa9dc94SBen Shi; NOX-NEXT:    out 59, r18
4664fa9dc94SBen Shi; NOX-NEXT:    elpm
4674fa9dc94SBen Shi; NOX-NEXT:    mov r19, r0
4684fa9dc94SBen Shi; NOX-NEXT:    subi r24, lo8(-(arrb3))
4694fa9dc94SBen Shi; NOX-NEXT:    sbci r25, hi8(-(arrb3))
4704fa9dc94SBen Shi; NOX-NEXT:    movw r30, r24
4714fa9dc94SBen Shi; NOX-NEXT:    out 59, r18
4724fa9dc94SBen Shi; NOX-NEXT:    elpm
4734fa9dc94SBen Shi; NOX-NEXT:    mov r24, r0
4744fa9dc94SBen Shi; NOX-NEXT:    sub r24, r19
4754fa9dc94SBen Shi; NOX-NEXT:    mov r25, r24
4764fa9dc94SBen Shi; NOX-NEXT:    lsl r25
4774fa9dc94SBen Shi; NOX-NEXT:    sbc r25, r25
4784fa9dc94SBen Shi; NOX-NEXT:    ret
47994173dc2SBen Shientry:
480*7bdc80f3SNikita Popov  %arrayidx = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %a
481*7bdc80f3SNikita Popov  %0 = load i8, ptr addrspace(3) %arrayidx, align 1
482*7bdc80f3SNikita Popov  %arrayidx1 = getelementptr inbounds [4 x i8], ptr addrspace(3) @arrb3, i16 0, i16 %b
483*7bdc80f3SNikita Popov  %1 = load i8, ptr addrspace(3) %arrayidx1, align 1
48494173dc2SBen Shi  %sub = sub i8 %0, %1
48594173dc2SBen Shi  ret i8 %sub
48694173dc2SBen Shi}
487