xref: /llvm-project/llvm/test/CodeGen/ARM/cmse-harden-call-returned-values.ll (revision 78ff617d3f573fb3a9b2fef180fa0fd43d5584ea)
1; RUN: llc %s -mtriple=thumbv8m.main     -o - | FileCheck %s --check-prefixes V8M-COMMON,V8M-LE
2; RUN: llc %s -mtriple=thumbebv8m.main   -o - | FileCheck %s --check-prefixes V8M-COMMON,V8M-BE
3; RUN: llc %s -mtriple=thumbv8.1m.main   -o - | FileCheck %s --check-prefixes V81M-COMMON,V81M-LE
4; RUN: llc %s -mtriple=thumbebv8.1m.main -o - | FileCheck %s --check-prefixes V81M-COMMON,V81M-BE
5
6@get_idx = hidden local_unnamed_addr global ptr null, align 4
7@arr = hidden local_unnamed_addr global [256 x i32] zeroinitializer, align 4
8
9define i32 @access_i16() {
10; V8M-COMMON-LABEL: access_i16:
11; V8M-COMMON:       @ %bb.0: @ %entry
12; V8M-COMMON-NEXT:    push {r7, lr}
13; V8M-COMMON-NEXT:    movw r0, :lower16:get_idx
14; V8M-COMMON-NEXT:    movt r0, :upper16:get_idx
15; V8M-COMMON-NEXT:    ldr r0, [r0]
16; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
17; V8M-COMMON-NEXT:    bic r0, r0, #1
18; V8M-COMMON-NEXT:    sub sp, #136
19; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
20; V8M-COMMON-NEXT:    mov r1, r0
21; V8M-COMMON-NEXT:    mov r2, r0
22; V8M-COMMON-NEXT:    mov r3, r0
23; V8M-COMMON-NEXT:    mov r4, r0
24; V8M-COMMON-NEXT:    mov r5, r0
25; V8M-COMMON-NEXT:    mov r6, r0
26; V8M-COMMON-NEXT:    mov r7, r0
27; V8M-COMMON-NEXT:    mov r8, r0
28; V8M-COMMON-NEXT:    mov r9, r0
29; V8M-COMMON-NEXT:    mov r10, r0
30; V8M-COMMON-NEXT:    mov r11, r0
31; V8M-COMMON-NEXT:    mov r12, r0
32; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
33; V8M-COMMON-NEXT:    blxns r0
34; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
35; V8M-COMMON-NEXT:    add sp, #136
36; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
37; V8M-COMMON-NEXT:    movw r1, :lower16:arr
38; V8M-COMMON-NEXT:    sxth r0, r0
39; V8M-COMMON-NEXT:    movt r1, :upper16:arr
40; V8M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
41; V8M-COMMON-NEXT:    pop {r7, pc}
42;
43; V81M-COMMON-LABEL: access_i16:
44; V81M-COMMON:       @ %bb.0: @ %entry
45; V81M-COMMON-NEXT:    push {r7, lr}
46; V81M-COMMON-NEXT:    movw r0, :lower16:get_idx
47; V81M-COMMON-NEXT:    movt r0, :upper16:get_idx
48; V81M-COMMON-NEXT:    ldr r0, [r0]
49; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
50; V81M-COMMON-NEXT:    bic r0, r0, #1
51; V81M-COMMON-NEXT:    sub sp, #136
52; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
53; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
54; V81M-COMMON-NEXT:    blxns r0
55; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
56; V81M-COMMON-NEXT:    add sp, #136
57; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
58; V81M-COMMON-NEXT:    movw r1, :lower16:arr
59; V81M-COMMON-NEXT:    sxth r0, r0
60; V81M-COMMON-NEXT:    movt r1, :upper16:arr
61; V81M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
62; V81M-COMMON-NEXT:    pop {r7, pc}
63entry:
64  %0 = load ptr, ptr @get_idx, align 4
65  %call = tail call signext i16 %0() "cmse_nonsecure_call"
66  %idxprom = sext i16 %call to i32
67  %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom
68  %1 = load i32, ptr %arrayidx, align 4
69  ret i32 %1
70}
71
72define i32 @access_u16() {
73; V8M-COMMON-LABEL: access_u16:
74; V8M-COMMON:       @ %bb.0: @ %entry
75; V8M-COMMON-NEXT:    push {r7, lr}
76; V8M-COMMON-NEXT:    movw r0, :lower16:get_idx
77; V8M-COMMON-NEXT:    movt r0, :upper16:get_idx
78; V8M-COMMON-NEXT:    ldr r0, [r0]
79; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
80; V8M-COMMON-NEXT:    bic r0, r0, #1
81; V8M-COMMON-NEXT:    sub sp, #136
82; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
83; V8M-COMMON-NEXT:    mov r1, r0
84; V8M-COMMON-NEXT:    mov r2, r0
85; V8M-COMMON-NEXT:    mov r3, r0
86; V8M-COMMON-NEXT:    mov r4, r0
87; V8M-COMMON-NEXT:    mov r5, r0
88; V8M-COMMON-NEXT:    mov r6, r0
89; V8M-COMMON-NEXT:    mov r7, r0
90; V8M-COMMON-NEXT:    mov r8, r0
91; V8M-COMMON-NEXT:    mov r9, r0
92; V8M-COMMON-NEXT:    mov r10, r0
93; V8M-COMMON-NEXT:    mov r11, r0
94; V8M-COMMON-NEXT:    mov r12, r0
95; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
96; V8M-COMMON-NEXT:    blxns r0
97; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
98; V8M-COMMON-NEXT:    add sp, #136
99; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
100; V8M-COMMON-NEXT:    movw r1, :lower16:arr
101; V8M-COMMON-NEXT:    uxth r0, r0
102; V8M-COMMON-NEXT:    movt r1, :upper16:arr
103; V8M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
104; V8M-COMMON-NEXT:    pop {r7, pc}
105;
106; V81M-COMMON-LABEL: access_u16:
107; V81M-COMMON:       @ %bb.0: @ %entry
108; V81M-COMMON-NEXT:    push {r7, lr}
109; V81M-COMMON-NEXT:    movw r0, :lower16:get_idx
110; V81M-COMMON-NEXT:    movt r0, :upper16:get_idx
111; V81M-COMMON-NEXT:    ldr r0, [r0]
112; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
113; V81M-COMMON-NEXT:    bic r0, r0, #1
114; V81M-COMMON-NEXT:    sub sp, #136
115; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
116; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
117; V81M-COMMON-NEXT:    blxns r0
118; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
119; V81M-COMMON-NEXT:    add sp, #136
120; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
121; V81M-COMMON-NEXT:    movw r1, :lower16:arr
122; V81M-COMMON-NEXT:    uxth r0, r0
123; V81M-COMMON-NEXT:    movt r1, :upper16:arr
124; V81M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
125; V81M-COMMON-NEXT:    pop {r7, pc}
126entry:
127  %0 = load ptr, ptr @get_idx, align 4
128  %call = tail call zeroext i16 %0() "cmse_nonsecure_call"
129  %idxprom = zext i16 %call to i32
130  %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom
131  %1 = load i32, ptr %arrayidx, align 4
132  ret i32 %1
133}
134
135define i32 @access_i8() {
136; V8M-COMMON-LABEL: access_i8:
137; V8M-COMMON:       @ %bb.0: @ %entry
138; V8M-COMMON-NEXT:    push {r7, lr}
139; V8M-COMMON-NEXT:    movw r0, :lower16:get_idx
140; V8M-COMMON-NEXT:    movt r0, :upper16:get_idx
141; V8M-COMMON-NEXT:    ldr r0, [r0]
142; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
143; V8M-COMMON-NEXT:    bic r0, r0, #1
144; V8M-COMMON-NEXT:    sub sp, #136
145; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
146; V8M-COMMON-NEXT:    mov r1, r0
147; V8M-COMMON-NEXT:    mov r2, r0
148; V8M-COMMON-NEXT:    mov r3, r0
149; V8M-COMMON-NEXT:    mov r4, r0
150; V8M-COMMON-NEXT:    mov r5, r0
151; V8M-COMMON-NEXT:    mov r6, r0
152; V8M-COMMON-NEXT:    mov r7, r0
153; V8M-COMMON-NEXT:    mov r8, r0
154; V8M-COMMON-NEXT:    mov r9, r0
155; V8M-COMMON-NEXT:    mov r10, r0
156; V8M-COMMON-NEXT:    mov r11, r0
157; V8M-COMMON-NEXT:    mov r12, r0
158; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
159; V8M-COMMON-NEXT:    blxns r0
160; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
161; V8M-COMMON-NEXT:    add sp, #136
162; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
163; V8M-COMMON-NEXT:    movw r1, :lower16:arr
164; V8M-COMMON-NEXT:    sxtb r0, r0
165; V8M-COMMON-NEXT:    movt r1, :upper16:arr
166; V8M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
167; V8M-COMMON-NEXT:    pop {r7, pc}
168;
169; V81M-COMMON-LABEL: access_i8:
170; V81M-COMMON:       @ %bb.0: @ %entry
171; V81M-COMMON-NEXT:    push {r7, lr}
172; V81M-COMMON-NEXT:    movw r0, :lower16:get_idx
173; V81M-COMMON-NEXT:    movt r0, :upper16:get_idx
174; V81M-COMMON-NEXT:    ldr r0, [r0]
175; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
176; V81M-COMMON-NEXT:    bic r0, r0, #1
177; V81M-COMMON-NEXT:    sub sp, #136
178; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
179; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
180; V81M-COMMON-NEXT:    blxns r0
181; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
182; V81M-COMMON-NEXT:    add sp, #136
183; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
184; V81M-COMMON-NEXT:    movw r1, :lower16:arr
185; V81M-COMMON-NEXT:    sxtb r0, r0
186; V81M-COMMON-NEXT:    movt r1, :upper16:arr
187; V81M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
188; V81M-COMMON-NEXT:    pop {r7, pc}
189entry:
190  %0 = load ptr, ptr @get_idx, align 4
191  %call = tail call signext i8 %0() "cmse_nonsecure_call"
192  %idxprom = sext i8 %call to i32
193  %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom
194  %1 = load i32, ptr %arrayidx, align 4
195  ret i32 %1
196}
197
198define i32 @access_u8() {
199; V8M-COMMON-LABEL: access_u8:
200; V8M-COMMON:       @ %bb.0: @ %entry
201; V8M-COMMON-NEXT:    push {r7, lr}
202; V8M-COMMON-NEXT:    movw r0, :lower16:get_idx
203; V8M-COMMON-NEXT:    movt r0, :upper16:get_idx
204; V8M-COMMON-NEXT:    ldr r0, [r0]
205; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
206; V8M-COMMON-NEXT:    bic r0, r0, #1
207; V8M-COMMON-NEXT:    sub sp, #136
208; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
209; V8M-COMMON-NEXT:    mov r1, r0
210; V8M-COMMON-NEXT:    mov r2, r0
211; V8M-COMMON-NEXT:    mov r3, r0
212; V8M-COMMON-NEXT:    mov r4, r0
213; V8M-COMMON-NEXT:    mov r5, r0
214; V8M-COMMON-NEXT:    mov r6, r0
215; V8M-COMMON-NEXT:    mov r7, r0
216; V8M-COMMON-NEXT:    mov r8, r0
217; V8M-COMMON-NEXT:    mov r9, r0
218; V8M-COMMON-NEXT:    mov r10, r0
219; V8M-COMMON-NEXT:    mov r11, r0
220; V8M-COMMON-NEXT:    mov r12, r0
221; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
222; V8M-COMMON-NEXT:    blxns r0
223; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
224; V8M-COMMON-NEXT:    add sp, #136
225; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
226; V8M-COMMON-NEXT:    movw r1, :lower16:arr
227; V8M-COMMON-NEXT:    uxtb r0, r0
228; V8M-COMMON-NEXT:    movt r1, :upper16:arr
229; V8M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
230; V8M-COMMON-NEXT:    pop {r7, pc}
231;
232; V81M-COMMON-LABEL: access_u8:
233; V81M-COMMON:       @ %bb.0: @ %entry
234; V81M-COMMON-NEXT:    push {r7, lr}
235; V81M-COMMON-NEXT:    movw r0, :lower16:get_idx
236; V81M-COMMON-NEXT:    movt r0, :upper16:get_idx
237; V81M-COMMON-NEXT:    ldr r0, [r0]
238; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
239; V81M-COMMON-NEXT:    bic r0, r0, #1
240; V81M-COMMON-NEXT:    sub sp, #136
241; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
242; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
243; V81M-COMMON-NEXT:    blxns r0
244; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
245; V81M-COMMON-NEXT:    add sp, #136
246; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
247; V81M-COMMON-NEXT:    movw r1, :lower16:arr
248; V81M-COMMON-NEXT:    uxtb r0, r0
249; V81M-COMMON-NEXT:    movt r1, :upper16:arr
250; V81M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
251; V81M-COMMON-NEXT:    pop {r7, pc}
252entry:
253  %0 = load ptr, ptr @get_idx, align 4
254  %call = tail call zeroext i8 %0() "cmse_nonsecure_call"
255  %idxprom = zext i8 %call to i32
256  %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom
257  %1 = load i32, ptr %arrayidx, align 4
258  ret i32 %1
259}
260
261define i32 @access_i1() {
262; V8M-COMMON-LABEL: access_i1:
263; V8M-COMMON:       @ %bb.0: @ %entry
264; V8M-COMMON-NEXT:    push {r7, lr}
265; V8M-COMMON-NEXT:    movw r0, :lower16:get_idx
266; V8M-COMMON-NEXT:    movt r0, :upper16:get_idx
267; V8M-COMMON-NEXT:    ldr r0, [r0]
268; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
269; V8M-COMMON-NEXT:    bic r0, r0, #1
270; V8M-COMMON-NEXT:    sub sp, #136
271; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
272; V8M-COMMON-NEXT:    mov r1, r0
273; V8M-COMMON-NEXT:    mov r2, r0
274; V8M-COMMON-NEXT:    mov r3, r0
275; V8M-COMMON-NEXT:    mov r4, r0
276; V8M-COMMON-NEXT:    mov r5, r0
277; V8M-COMMON-NEXT:    mov r6, r0
278; V8M-COMMON-NEXT:    mov r7, r0
279; V8M-COMMON-NEXT:    mov r8, r0
280; V8M-COMMON-NEXT:    mov r9, r0
281; V8M-COMMON-NEXT:    mov r10, r0
282; V8M-COMMON-NEXT:    mov r11, r0
283; V8M-COMMON-NEXT:    mov r12, r0
284; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
285; V8M-COMMON-NEXT:    blxns r0
286; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
287; V8M-COMMON-NEXT:    add sp, #136
288; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
289; V8M-COMMON-NEXT:    movw r1, :lower16:arr
290; V8M-COMMON-NEXT:    and r0, r0, #1
291; V8M-COMMON-NEXT:    movt r1, :upper16:arr
292; V8M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
293; V8M-COMMON-NEXT:    pop {r7, pc}
294;
295; V81M-COMMON-LABEL: access_i1:
296; V81M-COMMON:       @ %bb.0: @ %entry
297; V81M-COMMON-NEXT:    push {r7, lr}
298; V81M-COMMON-NEXT:    movw r0, :lower16:get_idx
299; V81M-COMMON-NEXT:    movt r0, :upper16:get_idx
300; V81M-COMMON-NEXT:    ldr r0, [r0]
301; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
302; V81M-COMMON-NEXT:    bic r0, r0, #1
303; V81M-COMMON-NEXT:    sub sp, #136
304; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
305; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
306; V81M-COMMON-NEXT:    blxns r0
307; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
308; V81M-COMMON-NEXT:    add sp, #136
309; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
310; V81M-COMMON-NEXT:    movw r1, :lower16:arr
311; V81M-COMMON-NEXT:    and r0, r0, #1
312; V81M-COMMON-NEXT:    movt r1, :upper16:arr
313; V81M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
314; V81M-COMMON-NEXT:    pop {r7, pc}
315entry:
316  %0 = load ptr, ptr @get_idx, align 4
317  %call = tail call zeroext i1 %0() "cmse_nonsecure_call"
318  %idxprom = zext i1 %call to i32
319  %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom
320  %1 = load i32, ptr %arrayidx, align 4
321  ret i32 %1
322}
323
324define i32 @access_i5() {
325; V8M-COMMON-LABEL: access_i5:
326; V8M-COMMON:       @ %bb.0: @ %entry
327; V8M-COMMON-NEXT:    push {r7, lr}
328; V8M-COMMON-NEXT:    movw r0, :lower16:get_idx
329; V8M-COMMON-NEXT:    movt r0, :upper16:get_idx
330; V8M-COMMON-NEXT:    ldr r0, [r0]
331; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
332; V8M-COMMON-NEXT:    bic r0, r0, #1
333; V8M-COMMON-NEXT:    sub sp, #136
334; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
335; V8M-COMMON-NEXT:    mov r1, r0
336; V8M-COMMON-NEXT:    mov r2, r0
337; V8M-COMMON-NEXT:    mov r3, r0
338; V8M-COMMON-NEXT:    mov r4, r0
339; V8M-COMMON-NEXT:    mov r5, r0
340; V8M-COMMON-NEXT:    mov r6, r0
341; V8M-COMMON-NEXT:    mov r7, r0
342; V8M-COMMON-NEXT:    mov r8, r0
343; V8M-COMMON-NEXT:    mov r9, r0
344; V8M-COMMON-NEXT:    mov r10, r0
345; V8M-COMMON-NEXT:    mov r11, r0
346; V8M-COMMON-NEXT:    mov r12, r0
347; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
348; V8M-COMMON-NEXT:    blxns r0
349; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
350; V8M-COMMON-NEXT:    add sp, #136
351; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
352; V8M-COMMON-NEXT:    movw r1, :lower16:arr
353; V8M-COMMON-NEXT:    sbfx r0, r0, #0, #5
354; V8M-COMMON-NEXT:    movt r1, :upper16:arr
355; V8M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
356; V8M-COMMON-NEXT:    pop {r7, pc}
357;
358; V81M-COMMON-LABEL: access_i5:
359; V81M-COMMON:       @ %bb.0: @ %entry
360; V81M-COMMON-NEXT:    push {r7, lr}
361; V81M-COMMON-NEXT:    movw r0, :lower16:get_idx
362; V81M-COMMON-NEXT:    movt r0, :upper16:get_idx
363; V81M-COMMON-NEXT:    ldr r0, [r0]
364; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
365; V81M-COMMON-NEXT:    bic r0, r0, #1
366; V81M-COMMON-NEXT:    sub sp, #136
367; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
368; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
369; V81M-COMMON-NEXT:    blxns r0
370; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
371; V81M-COMMON-NEXT:    add sp, #136
372; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
373; V81M-COMMON-NEXT:    movw r1, :lower16:arr
374; V81M-COMMON-NEXT:    sbfx r0, r0, #0, #5
375; V81M-COMMON-NEXT:    movt r1, :upper16:arr
376; V81M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
377; V81M-COMMON-NEXT:    pop {r7, pc}
378entry:
379  %0 = load ptr, ptr @get_idx, align 4
380  %call = tail call signext i5 %0() "cmse_nonsecure_call"
381  %idxprom = sext i5 %call to i32
382  %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom
383  %1 = load i32, ptr %arrayidx, align 4
384  ret i32 %1
385}
386
387define i32 @access_u5() {
388; V8M-COMMON-LABEL: access_u5:
389; V8M-COMMON:       @ %bb.0: @ %entry
390; V8M-COMMON-NEXT:    push {r7, lr}
391; V8M-COMMON-NEXT:    movw r0, :lower16:get_idx
392; V8M-COMMON-NEXT:    movt r0, :upper16:get_idx
393; V8M-COMMON-NEXT:    ldr r0, [r0]
394; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
395; V8M-COMMON-NEXT:    bic r0, r0, #1
396; V8M-COMMON-NEXT:    sub sp, #136
397; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
398; V8M-COMMON-NEXT:    mov r1, r0
399; V8M-COMMON-NEXT:    mov r2, r0
400; V8M-COMMON-NEXT:    mov r3, r0
401; V8M-COMMON-NEXT:    mov r4, r0
402; V8M-COMMON-NEXT:    mov r5, r0
403; V8M-COMMON-NEXT:    mov r6, r0
404; V8M-COMMON-NEXT:    mov r7, r0
405; V8M-COMMON-NEXT:    mov r8, r0
406; V8M-COMMON-NEXT:    mov r9, r0
407; V8M-COMMON-NEXT:    mov r10, r0
408; V8M-COMMON-NEXT:    mov r11, r0
409; V8M-COMMON-NEXT:    mov r12, r0
410; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
411; V8M-COMMON-NEXT:    blxns r0
412; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
413; V8M-COMMON-NEXT:    add sp, #136
414; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
415; V8M-COMMON-NEXT:    movw r1, :lower16:arr
416; V8M-COMMON-NEXT:    and r0, r0, #31
417; V8M-COMMON-NEXT:    movt r1, :upper16:arr
418; V8M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
419; V8M-COMMON-NEXT:    pop {r7, pc}
420;
421; V81M-COMMON-LABEL: access_u5:
422; V81M-COMMON:       @ %bb.0: @ %entry
423; V81M-COMMON-NEXT:    push {r7, lr}
424; V81M-COMMON-NEXT:    movw r0, :lower16:get_idx
425; V81M-COMMON-NEXT:    movt r0, :upper16:get_idx
426; V81M-COMMON-NEXT:    ldr r0, [r0]
427; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
428; V81M-COMMON-NEXT:    bic r0, r0, #1
429; V81M-COMMON-NEXT:    sub sp, #136
430; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
431; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
432; V81M-COMMON-NEXT:    blxns r0
433; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
434; V81M-COMMON-NEXT:    add sp, #136
435; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
436; V81M-COMMON-NEXT:    movw r1, :lower16:arr
437; V81M-COMMON-NEXT:    and r0, r0, #31
438; V81M-COMMON-NEXT:    movt r1, :upper16:arr
439; V81M-COMMON-NEXT:    ldr.w r0, [r1, r0, lsl #2]
440; V81M-COMMON-NEXT:    pop {r7, pc}
441entry:
442  %0 = load ptr, ptr @get_idx, align 4
443  %call = tail call zeroext i5 %0() "cmse_nonsecure_call"
444  %idxprom = zext i5 %call to i32
445  %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom
446  %1 = load i32, ptr %arrayidx, align 4
447  ret i32 %1
448}
449
450define i32 @access_i33(ptr %f) {
451; V8M-COMMON-LABEL: access_i33:
452; V8M-COMMON:       @ %bb.0: @ %entry
453; V8M-COMMON-NEXT:    push {r7, lr}
454; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
455; V8M-COMMON-NEXT:    bic r0, r0, #1
456; V8M-COMMON-NEXT:    sub sp, #136
457; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
458; V8M-COMMON-NEXT:    mov r1, r0
459; V8M-COMMON-NEXT:    mov r2, r0
460; V8M-COMMON-NEXT:    mov r3, r0
461; V8M-COMMON-NEXT:    mov r4, r0
462; V8M-COMMON-NEXT:    mov r5, r0
463; V8M-COMMON-NEXT:    mov r6, r0
464; V8M-COMMON-NEXT:    mov r7, r0
465; V8M-COMMON-NEXT:    mov r8, r0
466; V8M-COMMON-NEXT:    mov r9, r0
467; V8M-COMMON-NEXT:    mov r10, r0
468; V8M-COMMON-NEXT:    mov r11, r0
469; V8M-COMMON-NEXT:    mov r12, r0
470; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
471; V8M-COMMON-NEXT:    blxns r0
472; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
473; V8M-COMMON-NEXT:    add sp, #136
474; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
475; V8M-LE-NEXT:        and r0, r1, #1
476; V8M-BE-NEXT:        and r0, r0, #1
477; V8M-COMMON-NEXT:    rsb.w r0, r0, #0
478; V8M-COMMON-NEXT:    pop {r7, pc}
479;
480; V81M-COMMON-LABEL: access_i33:
481; V81M-COMMON:       @ %bb.0: @ %entry
482; V81M-COMMON-NEXT:    push {r7, lr}
483; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
484; V81M-COMMON-NEXT:    bic r0, r0, #1
485; V81M-COMMON-NEXT:    sub sp, #136
486; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
487; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
488; V81M-COMMON-NEXT:    blxns r0
489; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
490; V81M-COMMON-NEXT:    add sp, #136
491; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
492; V81M-LE-NEXT:        and r0, r1, #1
493; V81M-BE-NEXT:        and r0, r0, #1
494; V81M-COMMON-NEXT:    rsb.w r0, r0, #0
495; V81M-COMMON-NEXT:    pop {r7, pc}
496entry:
497  %call = tail call i33 %f() "cmse_nonsecure_call"
498  %shr = ashr i33 %call, 32
499  %conv = trunc nsw i33 %shr to i32
500  ret i32 %conv
501}
502
503define i32 @access_u33(ptr %f) {
504; V8M-COMMON-LABEL: access_u33:
505; V8M-COMMON:       @ %bb.0: @ %entry
506; V8M-COMMON-NEXT:    push {r7, lr}
507; V8M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
508; V8M-COMMON-NEXT:    bic r0, r0, #1
509; V8M-COMMON-NEXT:    sub sp, #136
510; V8M-COMMON-NEXT:    vlstm sp, {d0 - d15}
511; V8M-COMMON-NEXT:    mov r1, r0
512; V8M-COMMON-NEXT:    mov r2, r0
513; V8M-COMMON-NEXT:    mov r3, r0
514; V8M-COMMON-NEXT:    mov r4, r0
515; V8M-COMMON-NEXT:    mov r5, r0
516; V8M-COMMON-NEXT:    mov r6, r0
517; V8M-COMMON-NEXT:    mov r7, r0
518; V8M-COMMON-NEXT:    mov r8, r0
519; V8M-COMMON-NEXT:    mov r9, r0
520; V8M-COMMON-NEXT:    mov r10, r0
521; V8M-COMMON-NEXT:    mov r11, r0
522; V8M-COMMON-NEXT:    mov r12, r0
523; V8M-COMMON-NEXT:    msr apsr_nzcvq, r0
524; V8M-COMMON-NEXT:    blxns r0
525; V8M-COMMON-NEXT:    vlldm sp, {d0 - d15}
526; V8M-COMMON-NEXT:    add sp, #136
527; V8M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
528; V8M-LE-NEXT:        and r0, r1, #1
529; V8M-BE-NEXT:        and r0, r0, #1
530; V8M-COMMON-NEXT:    pop {r7, pc}
531;
532; V81M-COMMON-LABEL: access_u33:
533; V81M-COMMON:       @ %bb.0: @ %entry
534; V81M-COMMON-NEXT:    push {r7, lr}
535; V81M-COMMON-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
536; V81M-COMMON-NEXT:    bic r0, r0, #1
537; V81M-COMMON-NEXT:    sub sp, #136
538; V81M-COMMON-NEXT:    vlstm sp, {d0 - d15}
539; V81M-COMMON-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
540; V81M-COMMON-NEXT:    blxns r0
541; V81M-COMMON-NEXT:    vlldm sp, {d0 - d15}
542; V81M-COMMON-NEXT:    add sp, #136
543; V81M-COMMON-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
544; V81M-LE-NEXT:        and r0, r1, #1
545; V81M-BE-NEXT:        and r0, r0, #1
546; V81M-COMMON-NEXT:    pop {r7, pc}
547entry:
548  %call = tail call i33 %f() "cmse_nonsecure_call"
549  %shr = lshr i33 %call, 32
550  %conv = trunc nuw nsw i33 %shr to i32
551  ret i32 %conv
552}
553