369 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@arr = hidden local_unnamed_addr global [256 x i32] zeroinitializer, align 47 8define i32 @access_i16(i16 signext %idx) "cmse_nonsecure_entry" {9; V8M-COMMON-LABEL: access_i16:10; V8M-COMMON: @ %bb.0: @ %entry11; V8M-COMMON-NEXT: movw r1, :lower16:arr12; V8M-COMMON-NEXT: sxth r0, r013; V8M-COMMON-NEXT: movt r1, :upper16:arr14; V8M-COMMON-NEXT: mov r2, lr15; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]16; V8M-COMMON-NEXT: mov r1, lr17; V8M-COMMON-NEXT: mov r3, lr18; V8M-COMMON-NEXT: msr apsr_nzcvq, lr19; V8M-COMMON-NEXT: mov r12, lr20; V8M-COMMON-NEXT: bxns lr21;22; V81M-COMMON-LABEL: access_i16:23; V81M-COMMON: @ %bb.0: @ %entry24; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!25; V81M-COMMON-NEXT: movw r1, :lower16:arr26; V81M-COMMON-NEXT: sxth r0, r027; V81M-COMMON-NEXT: movt r1, :upper16:arr28; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]29; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}30; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #431; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}32; V81M-COMMON-NEXT: bxns lr33entry:34 %idxprom = sext i16 %idx to i3235 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom36 %0 = load i32, ptr %arrayidx, align 437 ret i32 %038}39 40define i32 @access_u16(i16 zeroext %idx) "cmse_nonsecure_entry" {41; V8M-COMMON-LABEL: access_u16:42; V8M-COMMON: @ %bb.0: @ %entry43; V8M-COMMON-NEXT: movw r1, :lower16:arr44; V8M-COMMON-NEXT: uxth r0, r045; V8M-COMMON-NEXT: movt r1, :upper16:arr46; V8M-COMMON-NEXT: mov r2, lr47; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]48; V8M-COMMON-NEXT: mov r1, lr49; V8M-COMMON-NEXT: mov r3, lr50; V8M-COMMON-NEXT: msr apsr_nzcvq, lr51; V8M-COMMON-NEXT: mov r12, lr52; V8M-COMMON-NEXT: bxns lr53;54; V81M-COMMON-LABEL: access_u16:55; V81M-COMMON: @ %bb.0: @ %entry56; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!57; V81M-COMMON-NEXT: movw r1, :lower16:arr58; V81M-COMMON-NEXT: uxth r0, r059; V81M-COMMON-NEXT: movt r1, :upper16:arr60; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]61; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}62; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #463; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}64; V81M-COMMON-NEXT: bxns lr65entry:66 %idxprom = zext i16 %idx to i3267 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom68 %0 = load i32, ptr %arrayidx, align 469 ret i32 %070}71 72define i32 @access_i8(i8 signext %idx) "cmse_nonsecure_entry" {73; V8M-COMMON-LABEL: access_i8:74; V8M-COMMON: @ %bb.0: @ %entry75; V8M-COMMON-NEXT: movw r1, :lower16:arr76; V8M-COMMON-NEXT: sxtb r0, r077; V8M-COMMON-NEXT: movt r1, :upper16:arr78; V8M-COMMON-NEXT: mov r2, lr79; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]80; V8M-COMMON-NEXT: mov r1, lr81; V8M-COMMON-NEXT: mov r3, lr82; V8M-COMMON-NEXT: msr apsr_nzcvq, lr83; V8M-COMMON-NEXT: mov r12, lr84; V8M-COMMON-NEXT: bxns lr85;86; V81M-COMMON-LABEL: access_i8:87; V81M-COMMON: @ %bb.0: @ %entry88; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!89; V81M-COMMON-NEXT: movw r1, :lower16:arr90; V81M-COMMON-NEXT: sxtb r0, r091; V81M-COMMON-NEXT: movt r1, :upper16:arr92; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]93; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}94; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #495; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}96; V81M-COMMON-NEXT: bxns lr97entry:98 %idxprom = sext i8 %idx to i3299 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom100 %0 = load i32, ptr %arrayidx, align 4101 ret i32 %0102}103 104define i32 @access_u8(i8 zeroext %idx) "cmse_nonsecure_entry" {105; V8M-COMMON-LABEL: access_u8:106; V8M-COMMON: @ %bb.0: @ %entry107; V8M-COMMON-NEXT: movw r1, :lower16:arr108; V8M-COMMON-NEXT: uxtb r0, r0109; V8M-COMMON-NEXT: movt r1, :upper16:arr110; V8M-COMMON-NEXT: mov r2, lr111; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]112; V8M-COMMON-NEXT: mov r1, lr113; V8M-COMMON-NEXT: mov r3, lr114; V8M-COMMON-NEXT: msr apsr_nzcvq, lr115; V8M-COMMON-NEXT: mov r12, lr116; V8M-COMMON-NEXT: bxns lr117;118; V81M-COMMON-LABEL: access_u8:119; V81M-COMMON: @ %bb.0: @ %entry120; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!121; V81M-COMMON-NEXT: movw r1, :lower16:arr122; V81M-COMMON-NEXT: uxtb r0, r0123; V81M-COMMON-NEXT: movt r1, :upper16:arr124; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]125; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}126; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4127; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}128; V81M-COMMON-NEXT: bxns lr129entry:130 %idxprom = zext i8 %idx to i32131 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom132 %0 = load i32, ptr %arrayidx, align 4133 ret i32 %0134}135 136define i32 @access_i1(i1 signext %idx) "cmse_nonsecure_entry" {137; V8M-COMMON-LABEL: access_i1:138; V8M-COMMON: @ %bb.0: @ %entry139; V8M-COMMON-NEXT: and r0, r0, #1140; V8M-COMMON-NEXT: movw r1, :lower16:arr141; V8M-COMMON-NEXT: rsbs r0, r0, #0142; V8M-COMMON-NEXT: movt r1, :upper16:arr143; V8M-COMMON-NEXT: and r0, r0, #1144; V8M-COMMON-NEXT: mov r2, lr145; V8M-COMMON-NEXT: mov r3, lr146; V8M-COMMON-NEXT: mov r12, lr147; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]148; V8M-COMMON-NEXT: mov r1, lr149; V8M-COMMON-NEXT: msr apsr_nzcvq, lr150; V8M-COMMON-NEXT: bxns lr151;152; V81M-COMMON-LABEL: access_i1:153; V81M-COMMON: @ %bb.0: @ %entry154; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!155; V81M-COMMON-NEXT: and r0, r0, #1156; V81M-COMMON-NEXT: movw r1, :lower16:arr157; V81M-COMMON-NEXT: rsbs r0, r0, #0158; V81M-COMMON-NEXT: movt r1, :upper16:arr159; V81M-COMMON-NEXT: and r0, r0, #1160; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]161; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}162; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4163; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}164; V81M-COMMON-NEXT: bxns lr165entry:166 %idxprom = zext i1 %idx to i32167 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom168 %0 = load i32, ptr %arrayidx, align 4169 ret i32 %0170}171 172define i32 @access_i5(i5 signext %idx) "cmse_nonsecure_entry" {173; V8M-COMMON-LABEL: access_i5:174; V8M-COMMON: @ %bb.0: @ %entry175; V8M-COMMON-NEXT: movw r1, :lower16:arr176; V8M-COMMON-NEXT: sbfx r0, r0, #0, #5177; V8M-COMMON-NEXT: movt r1, :upper16:arr178; V8M-COMMON-NEXT: mov r2, lr179; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]180; V8M-COMMON-NEXT: mov r1, lr181; V8M-COMMON-NEXT: mov r3, lr182; V8M-COMMON-NEXT: msr apsr_nzcvq, lr183; V8M-COMMON-NEXT: mov r12, lr184; V8M-COMMON-NEXT: bxns lr185;186; V81M-COMMON-LABEL: access_i5:187; V81M-COMMON: @ %bb.0: @ %entry188; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!189; V81M-COMMON-NEXT: movw r1, :lower16:arr190; V81M-COMMON-NEXT: sbfx r0, r0, #0, #5191; V81M-COMMON-NEXT: movt r1, :upper16:arr192; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]193; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}194; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4195; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}196; V81M-COMMON-NEXT: bxns lr197entry:198 %idxprom = sext i5 %idx to i32199 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom200 %0 = load i32, ptr %arrayidx, align 4201 ret i32 %0202}203 204define i32 @access_u5(i5 zeroext %idx) "cmse_nonsecure_entry" {205; V8M-COMMON-LABEL: access_u5:206; V8M-COMMON: @ %bb.0: @ %entry207; V8M-COMMON-NEXT: movw r1, :lower16:arr208; V8M-COMMON-NEXT: and r0, r0, #31209; V8M-COMMON-NEXT: movt r1, :upper16:arr210; V8M-COMMON-NEXT: mov r2, lr211; V8M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]212; V8M-COMMON-NEXT: mov r1, lr213; V8M-COMMON-NEXT: mov r3, lr214; V8M-COMMON-NEXT: msr apsr_nzcvq, lr215; V8M-COMMON-NEXT: mov r12, lr216; V8M-COMMON-NEXT: bxns lr217;218; V81M-COMMON-LABEL: access_u5:219; V81M-COMMON: @ %bb.0: @ %entry220; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!221; V81M-COMMON-NEXT: movw r1, :lower16:arr222; V81M-COMMON-NEXT: and r0, r0, #31223; V81M-COMMON-NEXT: movt r1, :upper16:arr224; V81M-COMMON-NEXT: ldr.w r0, [r1, r0, lsl #2]225; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}226; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4227; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}228; V81M-COMMON-NEXT: bxns lr229entry:230 %idxprom = zext i5 %idx to i32231 %arrayidx = getelementptr inbounds [256 x i32], ptr @arr, i32 0, i32 %idxprom232 %0 = load i32, ptr %arrayidx, align 4233 ret i32 %0234}235 236define i32 @access_i33(i33 %arg) "cmse_nonsecure_entry" {237; V8M-COMMON-LABEL: access_i33:238; V8M-COMMON: @ %bb.0: @ %entry239; V8M-LE-NEXT: and r0, r1, #1240; V8M-BE-NEXT: and r0, r0, #1241; V8M-COMMON-NEXT: mov r1, lr242; V8M-COMMON-NEXT: rsbs r0, r0, #0243; V8M-COMMON-NEXT: mov r2, lr244; V8M-COMMON-NEXT: mov r3, lr245; V8M-COMMON-NEXT: mov r12, lr246; V8M-COMMON-NEXT: msr apsr_nzcvq, lr247; V8M-COMMON-NEXT: bxns lr248;249; V81M-COMMON-LABEL: access_i33:250; V81M-COMMON: @ %bb.0: @ %entry251; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!252; V81M-LE-NEXT: and r0, r1, #1253; V81M-BE-NEXT: and r0, r0, #1254; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}255; V81M-COMMON-NEXT: rsbs r0, r0, #0256; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4257; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}258; V81M-COMMON-NEXT: bxns lr259entry:260 %shr = ashr i33 %arg, 32261 %conv = trunc nsw i33 %shr to i32262 ret i32 %conv263}264 265define i32 @access_u33(i33 %arg) "cmse_nonsecure_entry" {266; V8M-COMMON-LABEL: access_u33:267; V8M-COMMON: @ %bb.0: @ %entry268; V8M-LE-NEXT: and r0, r1, #1269; V8M-BE-NEXT: and r0, r0, #1270; V8M-COMMON-NEXT: mov r1, lr271; V8M-COMMON-NEXT: mov r2, lr272; V8M-COMMON-NEXT: mov r3, lr273; V8M-COMMON-NEXT: mov r12, lr274; V8M-COMMON-NEXT: msr apsr_nzcvq, lr275; V8M-COMMON-NEXT: bxns lr276;277; V81M-COMMON-LABEL: access_u33:278; V81M-COMMON: @ %bb.0: @ %entry279; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!280; V81M-LE-NEXT: and r0, r1, #1281; V81M-BE-NEXT: and r0, r0, #1282; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}283; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4284; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}285; V81M-COMMON-NEXT: bxns lr286entry:287 %shr = lshr i33 %arg, 32288 %conv = trunc nuw nsw i33 %shr to i32289 ret i32 %conv290}291 292define i32 @access_i65(ptr byval(i65) %0) "cmse_nonsecure_entry" {293; V8M-COMMON-LABEL: access_i65:294; V8M-COMMON: @ %bb.0: @ %entry295; V8M-COMMON-NEXT: sub sp, #16296; V8M-COMMON-NEXT: stm.w sp, {r0, r1, r2, r3}297; V8M-LE-NEXT: ldrb.w r0, [sp, #8]298; V8M-LE-NEXT: and r0, r0, #1299; V8M-LE-NEXT: rsbs r0, r0, #0300; V8M-BE-NEXT: movs r1, #0301; V8M-BE-NEXT: sub.w r0, r1, r0, lsr #24302; V8M-COMMON-NEXT: add sp, #16303; V8M-COMMON-NEXT: mov r1, lr304; V8M-COMMON-NEXT: mov r2, lr305; V8M-COMMON-NEXT: mov r3, lr306; V8M-COMMON-NEXT: mov r12, lr307; V8M-COMMON-NEXT: msr apsr_nzcvq, lr308; V8M-COMMON-NEXT: bxns lr309;310; V81M-COMMON-LABEL: access_i65:311; V81M-COMMON: @ %bb.0: @ %entry312; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!313; V81M-COMMON-NEXT: sub sp, #16314; V81M-COMMON-NEXT: add sp, #4315; V81M-COMMON-NEXT: stm.w sp, {r0, r1, r2, r3}316; V81M-LE-NEXT: ldrb.w r0, [sp, #8]317; V81M-LE-NEXT: and r0, r0, #1318; V81M-LE-NEXT: rsbs r0, r0, #0319; V81M-BE-NEXT: movs r1, #0320; V81M-BE-NEXT: sub.w r0, r1, r0, lsr #24321; V81M-COMMON-NEXT: sub sp, #4322; V81M-COMMON-NEXT: add sp, #16323; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}324; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4325; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}326; V81M-COMMON-NEXT: bxns lr327entry:328 %arg = load i65, ptr %0, align 8329 %shr = ashr i65 %arg, 64330 %conv = trunc nsw i65 %shr to i32331 ret i32 %conv332}333 334define i32 @access_u65(ptr byval(i65) %0) "cmse_nonsecure_entry" {335; V8M-COMMON-LABEL: access_u65:336; V8M-COMMON: @ %bb.0: @ %entry337; V8M-COMMON-NEXT: sub sp, #16338; V8M-COMMON-NEXT: stm.w sp, {r0, r1, r2, r3}339; V8M-LE-NEXT: ldrb.w r0, [sp, #8]340; V8M-BE-NEXT: lsrs r0, r0, #24341; V8M-COMMON-NEXT: add sp, #16342; V8M-COMMON-NEXT: mov r1, lr343; V8M-COMMON-NEXT: mov r2, lr344; V8M-COMMON-NEXT: mov r3, lr345; V8M-COMMON-NEXT: mov r12, lr346; V8M-COMMON-NEXT: msr apsr_nzcvq, lr347; V8M-COMMON-NEXT: bxns lr348;349; V81M-COMMON-LABEL: access_u65:350; V81M-COMMON: @ %bb.0: @ %entry351; V81M-COMMON-NEXT: vstr fpcxtns, [sp, #-4]!352; V81M-COMMON-NEXT: sub sp, #16353; V81M-COMMON-NEXT: add sp, #4354; V81M-COMMON-NEXT: stm.w sp, {r0, r1, r2, r3}355; V81M-LE-NEXT: ldrb.w r0, [sp, #8]356; V81M-BE-NEXT: lsrs r0, r0, #24357; V81M-COMMON-NEXT: sub sp, #4358; V81M-COMMON-NEXT: add sp, #16359; V81M-COMMON-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}360; V81M-COMMON-NEXT: vldr fpcxtns, [sp], #4361; V81M-COMMON-NEXT: clrm {r1, r2, r3, r12, apsr}362; V81M-COMMON-NEXT: bxns lr363entry:364 %arg = load i65, ptr %0, align 8365 %shr = lshr i65 %arg, 64366 %conv = trunc nuw nsw i65 %shr to i32367 ret i32 %conv368}369