553 lines · plain
1; RUN: llc %s -mtriple=thumbv8m.main -o - | FileCheck %s --check-prefixes V8M-COMMON,V8M-LE2; RUN: llc %s -mtriple=thumbebv8m.main -o - | FileCheck %s --check-prefixes V8M-COMMON,V8M-BE3; RUN: llc %s -mtriple=thumbv8.1m.main -o - | FileCheck %s --check-prefixes V81M-COMMON,V81M-LE4; RUN: llc %s -mtriple=thumbebv8.1m.main -o - | FileCheck %s --check-prefixes V81M-COMMON,V81M-BE5 6@get_idx = hidden local_unnamed_addr global ptr null, align 47@arr = hidden local_unnamed_addr global [256 x i32] zeroinitializer, align 48 9define i32 @access_i16() {10; V8M-COMMON-LABEL: access_i16:11; V8M-COMMON: @ %bb.0: @ %entry12; V8M-COMMON-NEXT: push {r7, lr}13; V8M-COMMON-NEXT: movw r0, :lower16:get_idx14; V8M-COMMON-NEXT: movt r0, :upper16:get_idx15; 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, #118; V8M-COMMON-NEXT: sub sp, #13619; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}20; V8M-COMMON-NEXT: mov r1, r021; V8M-COMMON-NEXT: mov r2, r022; V8M-COMMON-NEXT: mov r3, r023; V8M-COMMON-NEXT: mov r4, r024; V8M-COMMON-NEXT: mov r5, r025; V8M-COMMON-NEXT: mov r6, r026; V8M-COMMON-NEXT: mov r7, r027; V8M-COMMON-NEXT: mov r8, r028; V8M-COMMON-NEXT: mov r9, r029; V8M-COMMON-NEXT: mov r10, r030; V8M-COMMON-NEXT: mov r11, r031; V8M-COMMON-NEXT: mov r12, r032; V8M-COMMON-NEXT: msr apsr_nzcvq, r033; V8M-COMMON-NEXT: blxns r034; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}35; V8M-COMMON-NEXT: add sp, #13636; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}37; V8M-COMMON-NEXT: movw r1, :lower16:arr38; V8M-COMMON-NEXT: sxth r0, r039; V8M-COMMON-NEXT: movt r1, :upper16:arr40; 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: @ %entry45; V81M-COMMON-NEXT: push {r7, lr}46; V81M-COMMON-NEXT: movw r0, :lower16:get_idx47; V81M-COMMON-NEXT: movt r0, :upper16:get_idx48; 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, #151; V81M-COMMON-NEXT: sub sp, #13652; 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 r055; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}56; V81M-COMMON-NEXT: add sp, #13657; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}58; V81M-COMMON-NEXT: movw r1, :lower16:arr59; V81M-COMMON-NEXT: sxth r0, r060; V81M-COMMON-NEXT: movt r1, :upper16:arr61; 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 465 %call = tail call signext i16 %0() "cmse_nonsecure_call"66 %idxprom = sext i16 %call to i3267 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom68 %1 = load i32, ptr %arrayidx, align 469 ret i32 %170}71 72define i32 @access_u16() {73; V8M-COMMON-LABEL: access_u16:74; V8M-COMMON: @ %bb.0: @ %entry75; V8M-COMMON-NEXT: push {r7, lr}76; V8M-COMMON-NEXT: movw r0, :lower16:get_idx77; V8M-COMMON-NEXT: movt r0, :upper16:get_idx78; 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, #181; V8M-COMMON-NEXT: sub sp, #13682; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}83; V8M-COMMON-NEXT: mov r1, r084; V8M-COMMON-NEXT: mov r2, r085; V8M-COMMON-NEXT: mov r3, r086; V8M-COMMON-NEXT: mov r4, r087; V8M-COMMON-NEXT: mov r5, r088; V8M-COMMON-NEXT: mov r6, r089; V8M-COMMON-NEXT: mov r7, r090; V8M-COMMON-NEXT: mov r8, r091; V8M-COMMON-NEXT: mov r9, r092; V8M-COMMON-NEXT: mov r10, r093; V8M-COMMON-NEXT: mov r11, r094; V8M-COMMON-NEXT: mov r12, r095; V8M-COMMON-NEXT: msr apsr_nzcvq, r096; V8M-COMMON-NEXT: blxns r097; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}98; V8M-COMMON-NEXT: add sp, #13699; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}100; V8M-COMMON-NEXT: movw r1, :lower16:arr101; V8M-COMMON-NEXT: uxth r0, r0102; V8M-COMMON-NEXT: movt r1, :upper16:arr103; 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: @ %entry108; V81M-COMMON-NEXT: push {r7, lr}109; V81M-COMMON-NEXT: movw r0, :lower16:get_idx110; V81M-COMMON-NEXT: movt r0, :upper16:get_idx111; 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, #1114; V81M-COMMON-NEXT: sub sp, #136115; 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 r0118; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}119; V81M-COMMON-NEXT: add sp, #136120; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}121; V81M-COMMON-NEXT: movw r1, :lower16:arr122; V81M-COMMON-NEXT: uxth r0, r0123; V81M-COMMON-NEXT: movt r1, :upper16:arr124; 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 4128 %call = tail call zeroext i16 %0() "cmse_nonsecure_call"129 %idxprom = zext i16 %call to i32130 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom131 %1 = load i32, ptr %arrayidx, align 4132 ret i32 %1133}134 135define i32 @access_i8() {136; V8M-COMMON-LABEL: access_i8:137; V8M-COMMON: @ %bb.0: @ %entry138; V8M-COMMON-NEXT: push {r7, lr}139; V8M-COMMON-NEXT: movw r0, :lower16:get_idx140; V8M-COMMON-NEXT: movt r0, :upper16:get_idx141; 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, #1144; V8M-COMMON-NEXT: sub sp, #136145; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}146; V8M-COMMON-NEXT: mov r1, r0147; V8M-COMMON-NEXT: mov r2, r0148; V8M-COMMON-NEXT: mov r3, r0149; V8M-COMMON-NEXT: mov r4, r0150; V8M-COMMON-NEXT: mov r5, r0151; V8M-COMMON-NEXT: mov r6, r0152; V8M-COMMON-NEXT: mov r7, r0153; V8M-COMMON-NEXT: mov r8, r0154; V8M-COMMON-NEXT: mov r9, r0155; V8M-COMMON-NEXT: mov r10, r0156; V8M-COMMON-NEXT: mov r11, r0157; V8M-COMMON-NEXT: mov r12, r0158; V8M-COMMON-NEXT: msr apsr_nzcvq, r0159; V8M-COMMON-NEXT: blxns r0160; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}161; V8M-COMMON-NEXT: add sp, #136162; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}163; V8M-COMMON-NEXT: movw r1, :lower16:arr164; V8M-COMMON-NEXT: sxtb r0, r0165; V8M-COMMON-NEXT: movt r1, :upper16:arr166; 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: @ %entry171; V81M-COMMON-NEXT: push {r7, lr}172; V81M-COMMON-NEXT: movw r0, :lower16:get_idx173; V81M-COMMON-NEXT: movt r0, :upper16:get_idx174; 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, #1177; V81M-COMMON-NEXT: sub sp, #136178; 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 r0181; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}182; V81M-COMMON-NEXT: add sp, #136183; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}184; V81M-COMMON-NEXT: movw r1, :lower16:arr185; V81M-COMMON-NEXT: sxtb r0, r0186; V81M-COMMON-NEXT: movt r1, :upper16:arr187; 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 4191 %call = tail call signext i8 %0() "cmse_nonsecure_call"192 %idxprom = sext i8 %call to i32193 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom194 %1 = load i32, ptr %arrayidx, align 4195 ret i32 %1196}197 198define i32 @access_u8() {199; V8M-COMMON-LABEL: access_u8:200; V8M-COMMON: @ %bb.0: @ %entry201; V8M-COMMON-NEXT: push {r7, lr}202; V8M-COMMON-NEXT: movw r0, :lower16:get_idx203; V8M-COMMON-NEXT: movt r0, :upper16:get_idx204; 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, #1207; V8M-COMMON-NEXT: sub sp, #136208; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}209; V8M-COMMON-NEXT: mov r1, r0210; V8M-COMMON-NEXT: mov r2, r0211; V8M-COMMON-NEXT: mov r3, r0212; V8M-COMMON-NEXT: mov r4, r0213; V8M-COMMON-NEXT: mov r5, r0214; V8M-COMMON-NEXT: mov r6, r0215; V8M-COMMON-NEXT: mov r7, r0216; V8M-COMMON-NEXT: mov r8, r0217; V8M-COMMON-NEXT: mov r9, r0218; V8M-COMMON-NEXT: mov r10, r0219; V8M-COMMON-NEXT: mov r11, r0220; V8M-COMMON-NEXT: mov r12, r0221; V8M-COMMON-NEXT: msr apsr_nzcvq, r0222; V8M-COMMON-NEXT: blxns r0223; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}224; V8M-COMMON-NEXT: add sp, #136225; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}226; V8M-COMMON-NEXT: movw r1, :lower16:arr227; V8M-COMMON-NEXT: uxtb r0, r0228; V8M-COMMON-NEXT: movt r1, :upper16:arr229; 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: @ %entry234; V81M-COMMON-NEXT: push {r7, lr}235; V81M-COMMON-NEXT: movw r0, :lower16:get_idx236; V81M-COMMON-NEXT: movt r0, :upper16:get_idx237; 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, #1240; V81M-COMMON-NEXT: sub sp, #136241; 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 r0244; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}245; V81M-COMMON-NEXT: add sp, #136246; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}247; V81M-COMMON-NEXT: movw r1, :lower16:arr248; V81M-COMMON-NEXT: uxtb r0, r0249; V81M-COMMON-NEXT: movt r1, :upper16:arr250; 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 4254 %call = tail call zeroext i8 %0() "cmse_nonsecure_call"255 %idxprom = zext i8 %call to i32256 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom257 %1 = load i32, ptr %arrayidx, align 4258 ret i32 %1259}260 261define i32 @access_i1() {262; V8M-COMMON-LABEL: access_i1:263; V8M-COMMON: @ %bb.0: @ %entry264; V8M-COMMON-NEXT: push {r7, lr}265; V8M-COMMON-NEXT: movw r0, :lower16:get_idx266; V8M-COMMON-NEXT: movt r0, :upper16:get_idx267; 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, #1270; V8M-COMMON-NEXT: sub sp, #136271; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}272; V8M-COMMON-NEXT: mov r1, r0273; V8M-COMMON-NEXT: mov r2, r0274; V8M-COMMON-NEXT: mov r3, r0275; V8M-COMMON-NEXT: mov r4, r0276; V8M-COMMON-NEXT: mov r5, r0277; V8M-COMMON-NEXT: mov r6, r0278; V8M-COMMON-NEXT: mov r7, r0279; V8M-COMMON-NEXT: mov r8, r0280; V8M-COMMON-NEXT: mov r9, r0281; V8M-COMMON-NEXT: mov r10, r0282; V8M-COMMON-NEXT: mov r11, r0283; V8M-COMMON-NEXT: mov r12, r0284; V8M-COMMON-NEXT: msr apsr_nzcvq, r0285; V8M-COMMON-NEXT: blxns r0286; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}287; V8M-COMMON-NEXT: add sp, #136288; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}289; V8M-COMMON-NEXT: movw r1, :lower16:arr290; V8M-COMMON-NEXT: and r0, r0, #1291; V8M-COMMON-NEXT: movt r1, :upper16:arr292; 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: @ %entry297; V81M-COMMON-NEXT: push {r7, lr}298; V81M-COMMON-NEXT: movw r0, :lower16:get_idx299; V81M-COMMON-NEXT: movt r0, :upper16:get_idx300; 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, #1303; V81M-COMMON-NEXT: sub sp, #136304; 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 r0307; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}308; V81M-COMMON-NEXT: add sp, #136309; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}310; V81M-COMMON-NEXT: movw r1, :lower16:arr311; V81M-COMMON-NEXT: and r0, r0, #1312; V81M-COMMON-NEXT: movt r1, :upper16:arr313; 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 4317 %call = tail call zeroext i1 %0() "cmse_nonsecure_call"318 %idxprom = zext i1 %call to i32319 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom320 %1 = load i32, ptr %arrayidx, align 4321 ret i32 %1322}323 324define i32 @access_i5() {325; V8M-COMMON-LABEL: access_i5:326; V8M-COMMON: @ %bb.0: @ %entry327; V8M-COMMON-NEXT: push {r7, lr}328; V8M-COMMON-NEXT: movw r0, :lower16:get_idx329; V8M-COMMON-NEXT: movt r0, :upper16:get_idx330; 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, #1333; V8M-COMMON-NEXT: sub sp, #136334; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}335; V8M-COMMON-NEXT: mov r1, r0336; V8M-COMMON-NEXT: mov r2, r0337; V8M-COMMON-NEXT: mov r3, r0338; V8M-COMMON-NEXT: mov r4, r0339; V8M-COMMON-NEXT: mov r5, r0340; V8M-COMMON-NEXT: mov r6, r0341; V8M-COMMON-NEXT: mov r7, r0342; V8M-COMMON-NEXT: mov r8, r0343; V8M-COMMON-NEXT: mov r9, r0344; V8M-COMMON-NEXT: mov r10, r0345; V8M-COMMON-NEXT: mov r11, r0346; V8M-COMMON-NEXT: mov r12, r0347; V8M-COMMON-NEXT: msr apsr_nzcvq, r0348; V8M-COMMON-NEXT: blxns r0349; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}350; V8M-COMMON-NEXT: add sp, #136351; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}352; V8M-COMMON-NEXT: movw r1, :lower16:arr353; V8M-COMMON-NEXT: sbfx r0, r0, #0, #5354; V8M-COMMON-NEXT: movt r1, :upper16:arr355; 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: @ %entry360; V81M-COMMON-NEXT: push {r7, lr}361; V81M-COMMON-NEXT: movw r0, :lower16:get_idx362; V81M-COMMON-NEXT: movt r0, :upper16:get_idx363; 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, #1366; V81M-COMMON-NEXT: sub sp, #136367; 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 r0370; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}371; V81M-COMMON-NEXT: add sp, #136372; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}373; V81M-COMMON-NEXT: movw r1, :lower16:arr374; V81M-COMMON-NEXT: sbfx r0, r0, #0, #5375; V81M-COMMON-NEXT: movt r1, :upper16:arr376; 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 4380 %call = tail call signext i5 %0() "cmse_nonsecure_call"381 %idxprom = sext i5 %call to i32382 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom383 %1 = load i32, ptr %arrayidx, align 4384 ret i32 %1385}386 387define i32 @access_u5() {388; V8M-COMMON-LABEL: access_u5:389; V8M-COMMON: @ %bb.0: @ %entry390; V8M-COMMON-NEXT: push {r7, lr}391; V8M-COMMON-NEXT: movw r0, :lower16:get_idx392; V8M-COMMON-NEXT: movt r0, :upper16:get_idx393; 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, #1396; V8M-COMMON-NEXT: sub sp, #136397; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}398; V8M-COMMON-NEXT: mov r1, r0399; V8M-COMMON-NEXT: mov r2, r0400; V8M-COMMON-NEXT: mov r3, r0401; V8M-COMMON-NEXT: mov r4, r0402; V8M-COMMON-NEXT: mov r5, r0403; V8M-COMMON-NEXT: mov r6, r0404; V8M-COMMON-NEXT: mov r7, r0405; V8M-COMMON-NEXT: mov r8, r0406; V8M-COMMON-NEXT: mov r9, r0407; V8M-COMMON-NEXT: mov r10, r0408; V8M-COMMON-NEXT: mov r11, r0409; V8M-COMMON-NEXT: mov r12, r0410; V8M-COMMON-NEXT: msr apsr_nzcvq, r0411; V8M-COMMON-NEXT: blxns r0412; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}413; V8M-COMMON-NEXT: add sp, #136414; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}415; V8M-COMMON-NEXT: movw r1, :lower16:arr416; V8M-COMMON-NEXT: and r0, r0, #31417; V8M-COMMON-NEXT: movt r1, :upper16:arr418; 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: @ %entry423; V81M-COMMON-NEXT: push {r7, lr}424; V81M-COMMON-NEXT: movw r0, :lower16:get_idx425; V81M-COMMON-NEXT: movt r0, :upper16:get_idx426; 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, #1429; V81M-COMMON-NEXT: sub sp, #136430; 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 r0433; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}434; V81M-COMMON-NEXT: add sp, #136435; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}436; V81M-COMMON-NEXT: movw r1, :lower16:arr437; V81M-COMMON-NEXT: and r0, r0, #31438; V81M-COMMON-NEXT: movt r1, :upper16:arr439; 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 4443 %call = tail call zeroext i5 %0() "cmse_nonsecure_call"444 %idxprom = zext i5 %call to i32445 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom446 %1 = load i32, ptr %arrayidx, align 4447 ret i32 %1448}449 450define i32 @access_i33(ptr %f) {451; V8M-COMMON-LABEL: access_i33:452; V8M-COMMON: @ %bb.0: @ %entry453; 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, #1456; V8M-COMMON-NEXT: sub sp, #136457; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}458; V8M-COMMON-NEXT: mov r1, r0459; V8M-COMMON-NEXT: mov r2, r0460; V8M-COMMON-NEXT: mov r3, r0461; V8M-COMMON-NEXT: mov r4, r0462; V8M-COMMON-NEXT: mov r5, r0463; V8M-COMMON-NEXT: mov r6, r0464; V8M-COMMON-NEXT: mov r7, r0465; V8M-COMMON-NEXT: mov r8, r0466; V8M-COMMON-NEXT: mov r9, r0467; V8M-COMMON-NEXT: mov r10, r0468; V8M-COMMON-NEXT: mov r11, r0469; V8M-COMMON-NEXT: mov r12, r0470; V8M-COMMON-NEXT: msr apsr_nzcvq, r0471; V8M-COMMON-NEXT: blxns r0472; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}473; V8M-COMMON-NEXT: add sp, #136474; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}475; V8M-LE-NEXT: and r0, r1, #1476; V8M-BE-NEXT: and r0, r0, #1477; V8M-COMMON-NEXT: rsb.w r0, r0, #0478; V8M-COMMON-NEXT: pop {r7, pc}479;480; V81M-COMMON-LABEL: access_i33:481; V81M-COMMON: @ %bb.0: @ %entry482; 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, #1485; V81M-COMMON-NEXT: sub sp, #136486; 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 r0489; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}490; V81M-COMMON-NEXT: add sp, #136491; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}492; V81M-LE-NEXT: and r0, r1, #1493; V81M-BE-NEXT: and r0, r0, #1494; V81M-COMMON-NEXT: rsb.w r0, r0, #0495; V81M-COMMON-NEXT: pop {r7, pc}496entry:497 %call = tail call i33 %f() "cmse_nonsecure_call"498 %shr = ashr i33 %call, 32499 %conv = trunc nsw i33 %shr to i32500 ret i32 %conv501}502 503define i32 @access_u33(ptr %f) {504; V8M-COMMON-LABEL: access_u33:505; V8M-COMMON: @ %bb.0: @ %entry506; 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, #1509; V8M-COMMON-NEXT: sub sp, #136510; V8M-COMMON-NEXT: vlstm sp, {d0 - d15}511; V8M-COMMON-NEXT: mov r1, r0512; V8M-COMMON-NEXT: mov r2, r0513; V8M-COMMON-NEXT: mov r3, r0514; V8M-COMMON-NEXT: mov r4, r0515; V8M-COMMON-NEXT: mov r5, r0516; V8M-COMMON-NEXT: mov r6, r0517; V8M-COMMON-NEXT: mov r7, r0518; V8M-COMMON-NEXT: mov r8, r0519; V8M-COMMON-NEXT: mov r9, r0520; V8M-COMMON-NEXT: mov r10, r0521; V8M-COMMON-NEXT: mov r11, r0522; V8M-COMMON-NEXT: mov r12, r0523; V8M-COMMON-NEXT: msr apsr_nzcvq, r0524; V8M-COMMON-NEXT: blxns r0525; V8M-COMMON-NEXT: vlldm sp, {d0 - d15}526; V8M-COMMON-NEXT: add sp, #136527; V8M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}528; V8M-LE-NEXT: and r0, r1, #1529; V8M-BE-NEXT: and r0, r0, #1530; V8M-COMMON-NEXT: pop {r7, pc}531;532; V81M-COMMON-LABEL: access_u33:533; V81M-COMMON: @ %bb.0: @ %entry534; 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, #1537; V81M-COMMON-NEXT: sub sp, #136538; 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 r0541; V81M-COMMON-NEXT: vlldm sp, {d0 - d15}542; V81M-COMMON-NEXT: add sp, #136543; V81M-COMMON-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}544; V81M-LE-NEXT: and r0, r1, #1545; V81M-BE-NEXT: and r0, r0, #1546; V81M-COMMON-NEXT: pop {r7, pc}547entry:548 %call = tail call i33 %f() "cmse_nonsecure_call"549 %shr = lshr i33 %call, 32550 %conv = trunc nuw nsw i33 %shr to i32551 ret i32 %conv552}553