355 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc %s -o - -mtriple=thumbv8m.base | \3; RUN: FileCheck %s --check-prefix=CHECK-8B4; RUN: llc %s -o - -mtriple=thumbebv8m.base | \5; RUN: FileCheck %s --check-prefix=CHECK-8B6; RUN: llc %s -o - -mtriple=thumbv8m.main | \7; RUN: FileCheck %s --check-prefix=CHECK-8M8; RUN: llc %s -o - -mtriple=thumbebv8m.main | \9; RUN: FileCheck %s --check-prefix=CHECK-8M10 11; RUN: llc %s -o - -mtriple=thumbv8.1m.main | \12; RUN: FileCheck %s --check-prefix=CHECK-81M13; RUN: llc %s -o - -mtriple=thumbebv8.1m.main | \14; RUN: FileCheck %s --check-prefix=CHECK-81M15 16define void @func1(ptr nocapture %fptr) #0 {17; CHECK-8B-LABEL: func1:18; CHECK-8B: @ %bb.0: @ %entry19; CHECK-8B-NEXT: push {r7, lr}20; CHECK-8B-NEXT: push {r4, r5, r6, r7}21; CHECK-8B-NEXT: mov r7, r1122; CHECK-8B-NEXT: mov r6, r1023; CHECK-8B-NEXT: mov r5, r924; CHECK-8B-NEXT: mov r4, r825; CHECK-8B-NEXT: push {r4, r5, r6, r7}26; CHECK-8B-NEXT: mov r1, #127; CHECK-8B-NEXT: bics r0, r128; CHECK-8B-NEXT: mov r1, r029; CHECK-8B-NEXT: mov r2, r030; CHECK-8B-NEXT: mov r3, r031; CHECK-8B-NEXT: mov r4, r032; CHECK-8B-NEXT: mov r5, r033; CHECK-8B-NEXT: mov r6, r034; CHECK-8B-NEXT: mov r7, r035; CHECK-8B-NEXT: mov r8, r036; CHECK-8B-NEXT: mov r9, r037; CHECK-8B-NEXT: mov r10, r038; CHECK-8B-NEXT: mov r11, r039; CHECK-8B-NEXT: mov r12, r040; CHECK-8B-NEXT: msr apsr, r041; CHECK-8B-NEXT: blxns r042; CHECK-8B-NEXT: pop {r4, r5, r6, r7}43; CHECK-8B-NEXT: mov r8, r444; CHECK-8B-NEXT: mov r9, r545; CHECK-8B-NEXT: mov r10, r646; CHECK-8B-NEXT: mov r11, r747; CHECK-8B-NEXT: pop {r4, r5, r6, r7}48; CHECK-8B-NEXT: pop {r7}49; CHECK-8B-NEXT: pop {r0}50; CHECK-8B-NEXT: mov lr, r051; CHECK-8B-NEXT: mov r0, lr52; CHECK-8B-NEXT: mov r1, lr53; CHECK-8B-NEXT: mov r2, lr54; CHECK-8B-NEXT: mov r3, lr55; CHECK-8B-NEXT: mov r12, lr56; CHECK-8B-NEXT: msr apsr, lr57; CHECK-8B-NEXT: bxns lr58;59; CHECK-8M-LABEL: func1:60; CHECK-8M: @ %bb.0: @ %entry61; CHECK-8M-NEXT: push {r7, lr}62; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}63; CHECK-8M-NEXT: bic r0, r0, #164; CHECK-8M-NEXT: sub sp, #13665; CHECK-8M-NEXT: vlstm sp66; CHECK-8M-NEXT: mov r1, r067; CHECK-8M-NEXT: mov r2, r068; CHECK-8M-NEXT: mov r3, r069; CHECK-8M-NEXT: mov r4, r070; CHECK-8M-NEXT: mov r5, r071; CHECK-8M-NEXT: mov r6, r072; CHECK-8M-NEXT: mov r7, r073; CHECK-8M-NEXT: mov r8, r074; CHECK-8M-NEXT: mov r9, r075; CHECK-8M-NEXT: mov r10, r076; CHECK-8M-NEXT: mov r11, r077; CHECK-8M-NEXT: mov r12, r078; CHECK-8M-NEXT: msr apsr_nzcvq, r079; CHECK-8M-NEXT: blxns r080; CHECK-8M-NEXT: vlldm sp81; CHECK-8M-NEXT: add sp, #13682; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}83; CHECK-8M-NEXT: pop.w {r7, lr}84; CHECK-8M-NEXT: mov r0, lr85; CHECK-8M-NEXT: mov r1, lr86; CHECK-8M-NEXT: mov r2, lr87; CHECK-8M-NEXT: mov r3, lr88; CHECK-8M-NEXT: mov r12, lr89; CHECK-8M-NEXT: msr apsr_nzcvq, lr90; CHECK-8M-NEXT: bxns lr91;92; CHECK-81M-LABEL: func1:93; CHECK-81M: @ %bb.0: @ %entry94; CHECK-81M-NEXT: vstr fpcxtns, [sp, #-4]!95; CHECK-81M-NEXT: push {r7, lr}96; CHECK-81M-NEXT: sub sp, #497; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}98; CHECK-81M-NEXT: bic r0, r0, #199; CHECK-81M-NEXT: sub sp, #136100; CHECK-81M-NEXT: vlstm sp101; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}102; CHECK-81M-NEXT: blxns r0103; CHECK-81M-NEXT: vlldm sp104; CHECK-81M-NEXT: add sp, #136105; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}106; CHECK-81M-NEXT: add sp, #4107; CHECK-81M-NEXT: pop.w {r7, lr}108; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}109; CHECK-81M-NEXT: vldr fpcxtns, [sp], #4110; CHECK-81M-NEXT: clrm {r0, r1, r2, r3, r12, apsr}111; CHECK-81M-NEXT: bxns lr112entry:113 call void %fptr() #1114 ret void115}116 117attributes #0 = { "cmse_nonsecure_entry" nounwind }118attributes #1 = { "cmse_nonsecure_call" nounwind }119 120define void @func2(ptr nocapture %fptr) #2 {121; CHECK-8B-LABEL: func2:122; CHECK-8B: @ %bb.0: @ %entry123; CHECK-8B-NEXT: push {r7, lr}124; CHECK-8B-NEXT: push {r4, r5, r6, r7}125; CHECK-8B-NEXT: mov r7, r11126; CHECK-8B-NEXT: mov r6, r10127; CHECK-8B-NEXT: mov r5, r9128; CHECK-8B-NEXT: mov r4, r8129; CHECK-8B-NEXT: push {r4, r5, r6, r7}130; CHECK-8B-NEXT: mov r1, #1131; CHECK-8B-NEXT: bics r0, r1132; CHECK-8B-NEXT: mov r1, r0133; CHECK-8B-NEXT: mov r2, r0134; CHECK-8B-NEXT: mov r3, r0135; CHECK-8B-NEXT: mov r4, r0136; CHECK-8B-NEXT: mov r5, r0137; CHECK-8B-NEXT: mov r6, r0138; CHECK-8B-NEXT: mov r7, r0139; CHECK-8B-NEXT: mov r8, r0140; CHECK-8B-NEXT: mov r9, r0141; CHECK-8B-NEXT: mov r10, r0142; CHECK-8B-NEXT: mov r11, r0143; CHECK-8B-NEXT: mov r12, r0144; CHECK-8B-NEXT: msr apsr, r0145; CHECK-8B-NEXT: blxns r0146; CHECK-8B-NEXT: pop {r4, r5, r6, r7}147; CHECK-8B-NEXT: mov r8, r4148; CHECK-8B-NEXT: mov r9, r5149; CHECK-8B-NEXT: mov r10, r6150; CHECK-8B-NEXT: mov r11, r7151; CHECK-8B-NEXT: pop {r4, r5, r6, r7}152; CHECK-8B-NEXT: pop {r7, pc}153;154; CHECK-8M-LABEL: func2:155; CHECK-8M: @ %bb.0: @ %entry156; CHECK-8M-NEXT: push {r7, lr}157; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}158; CHECK-8M-NEXT: bic r0, r0, #1159; CHECK-8M-NEXT: sub sp, #136160; CHECK-8M-NEXT: vlstm sp161; CHECK-8M-NEXT: mov r1, r0162; CHECK-8M-NEXT: mov r2, r0163; CHECK-8M-NEXT: mov r3, r0164; CHECK-8M-NEXT: mov r4, r0165; CHECK-8M-NEXT: mov r5, r0166; CHECK-8M-NEXT: mov r6, r0167; CHECK-8M-NEXT: mov r7, r0168; CHECK-8M-NEXT: mov r8, r0169; CHECK-8M-NEXT: mov r9, r0170; CHECK-8M-NEXT: mov r10, r0171; CHECK-8M-NEXT: mov r11, r0172; CHECK-8M-NEXT: mov r12, r0173; CHECK-8M-NEXT: msr apsr_nzcvq, r0174; CHECK-8M-NEXT: blxns r0175; CHECK-8M-NEXT: vlldm sp176; CHECK-8M-NEXT: add sp, #136177; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}178; CHECK-8M-NEXT: pop {r7, pc}179;180; CHECK-81M-LABEL: func2:181; CHECK-81M: @ %bb.0: @ %entry182; CHECK-81M-NEXT: push {r7, lr}183; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}184; CHECK-81M-NEXT: bic r0, r0, #1185; CHECK-81M-NEXT: sub sp, #136186; CHECK-81M-NEXT: vlstm sp187; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}188; CHECK-81M-NEXT: blxns r0189; CHECK-81M-NEXT: vlldm sp190; CHECK-81M-NEXT: add sp, #136191; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}192; CHECK-81M-NEXT: pop {r7, pc}193entry:194 tail call void %fptr() #3195 ret void196}197 198attributes #2 = { nounwind }199attributes #3 = { "cmse_nonsecure_call" nounwind }200 201define void @func3() #4 {202; CHECK-8B-LABEL: func3:203; CHECK-8B: @ %bb.0: @ %entry204; CHECK-8B-NEXT: mov r0, lr205; CHECK-8B-NEXT: mov r1, lr206; CHECK-8B-NEXT: mov r2, lr207; CHECK-8B-NEXT: mov r3, lr208; CHECK-8B-NEXT: mov r12, lr209; CHECK-8B-NEXT: msr apsr, lr210; CHECK-8B-NEXT: bxns lr211;212; CHECK-8M-LABEL: func3:213; CHECK-8M: @ %bb.0: @ %entry214; CHECK-8M-NEXT: mov r0, lr215; CHECK-8M-NEXT: mov r1, lr216; CHECK-8M-NEXT: mov r2, lr217; CHECK-8M-NEXT: mov r3, lr218; CHECK-8M-NEXT: mov r12, lr219; CHECK-8M-NEXT: msr apsr_nzcvq, lr220; CHECK-8M-NEXT: bxns lr221;222; CHECK-81M-LABEL: func3:223; CHECK-81M: @ %bb.0: @ %entry224; CHECK-81M-NEXT: vstr fpcxtns, [sp, #-4]!225; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}226; CHECK-81M-NEXT: vldr fpcxtns, [sp], #4227; CHECK-81M-NEXT: clrm {r0, r1, r2, r3, r12, apsr}228; CHECK-81M-NEXT: bxns lr229entry:230 ret void231}232 233define void @func4() #4 {234; CHECK-8B-LABEL: func4:235; CHECK-8B: @ %bb.0: @ %entry236; CHECK-8B-NEXT: push {r7, lr}237; CHECK-8B-NEXT: bl func3238; CHECK-8B-NEXT: pop {r7}239; CHECK-8B-NEXT: pop {r0}240; CHECK-8B-NEXT: mov lr, r0241; CHECK-8B-NEXT: mov r0, lr242; CHECK-8B-NEXT: mov r1, lr243; CHECK-8B-NEXT: mov r2, lr244; CHECK-8B-NEXT: mov r3, lr245; CHECK-8B-NEXT: mov r12, lr246; CHECK-8B-NEXT: msr apsr, lr247; CHECK-8B-NEXT: bxns lr248;249; CHECK-8M-LABEL: func4:250; CHECK-8M: @ %bb.0: @ %entry251; CHECK-8M-NEXT: push {r7, lr}252; CHECK-8M-NEXT: bl func3253; CHECK-8M-NEXT: pop.w {r7, lr}254; CHECK-8M-NEXT: mov r0, lr255; CHECK-8M-NEXT: mov r1, lr256; CHECK-8M-NEXT: mov r2, lr257; CHECK-8M-NEXT: mov r3, lr258; CHECK-8M-NEXT: mov r12, lr259; CHECK-8M-NEXT: msr apsr_nzcvq, lr260; CHECK-8M-NEXT: bxns lr261;262; CHECK-81M-LABEL: func4:263; CHECK-81M: @ %bb.0: @ %entry264; CHECK-81M-NEXT: vstr fpcxtns, [sp, #-4]!265; CHECK-81M-NEXT: push {r7, lr}266; CHECK-81M-NEXT: sub sp, #4267; CHECK-81M-NEXT: bl func3268; CHECK-81M-NEXT: add sp, #4269; CHECK-81M-NEXT: pop.w {r7, lr}270; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}271; CHECK-81M-NEXT: vldr fpcxtns, [sp], #4272; CHECK-81M-NEXT: clrm {r0, r1, r2, r3, r12, apsr}273; CHECK-81M-NEXT: bxns lr274entry:275 tail call void @func3() #5276 ret void277}278 279declare void @func51(ptr);280 281define void @func5() #4 {282; CHECK-8B-LABEL: func5:283; CHECK-8B: @ %bb.0:284; CHECK-8B-NEXT: push {r4, r6, r7, lr}285; CHECK-8B-NEXT: add r7, sp, #8286; CHECK-8B-NEXT: sub sp, #16287; CHECK-8B-NEXT: mov r4, sp288; CHECK-8B-NEXT: lsrs r4, r4, #4289; CHECK-8B-NEXT: lsls r4, r4, #4290; CHECK-8B-NEXT: mov sp, r4291; CHECK-8B-NEXT: mov r0, sp292; CHECK-8B-NEXT: bl func51293; CHECK-8B-NEXT: subs r6, r7, #7294; CHECK-8B-NEXT: subs r6, #1295; CHECK-8B-NEXT: mov sp, r6296; CHECK-8B-NEXT: pop {r4, r6, r7}297; CHECK-8B-NEXT: pop {r0}298; CHECK-8B-NEXT: mov lr, r0299; CHECK-8B-NEXT: mov r0, lr300; CHECK-8B-NEXT: mov r1, lr301; CHECK-8B-NEXT: mov r2, lr302; CHECK-8B-NEXT: mov r3, lr303; CHECK-8B-NEXT: mov r12, lr304; CHECK-8B-NEXT: msr apsr, lr305; CHECK-8B-NEXT: bxns lr306;307; CHECK-8M-LABEL: func5:308; CHECK-8M: @ %bb.0:309; CHECK-8M-NEXT: push {r4, r6, r7, lr}310; CHECK-8M-NEXT: add r7, sp, #8311; CHECK-8M-NEXT: sub sp, #16312; CHECK-8M-NEXT: mov r4, sp313; CHECK-8M-NEXT: bfc r4, #0, #4314; CHECK-8M-NEXT: mov sp, r4315; CHECK-8M-NEXT: mov r0, sp316; CHECK-8M-NEXT: bl func51317; CHECK-8M-NEXT: sub.w r4, r7, #8318; CHECK-8M-NEXT: mov sp, r4319; CHECK-8M-NEXT: pop.w {r4, r6, r7, lr}320; CHECK-8M-NEXT: mov r0, lr321; CHECK-8M-NEXT: mov r1, lr322; CHECK-8M-NEXT: mov r2, lr323; CHECK-8M-NEXT: mov r3, lr324; CHECK-8M-NEXT: mov r12, lr325; CHECK-8M-NEXT: msr apsr_nzcvq, lr326; CHECK-8M-NEXT: bxns lr327;328; CHECK-81M-LABEL: func5:329; CHECK-81M: @ %bb.0:330; CHECK-81M-NEXT: vstr fpcxtns, [sp, #-4]!331; CHECK-81M-NEXT: push {r4, r6, r7, lr}332; CHECK-81M-NEXT: add r7, sp, #8333; CHECK-81M-NEXT: sub sp, #12334; CHECK-81M-NEXT: mov r4, sp335; CHECK-81M-NEXT: bfc r4, #0, #4336; CHECK-81M-NEXT: mov sp, r4337; CHECK-81M-NEXT: mov r0, sp338; CHECK-81M-NEXT: bl func51339; CHECK-81M-NEXT: sub.w r4, r7, #8340; CHECK-81M-NEXT: mov sp, r4341; CHECK-81M-NEXT: pop.w {r4, r6, r7, lr}342; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}343; CHECK-81M-NEXT: vldr fpcxtns, [sp], #4344; CHECK-81M-NEXT: clrm {r0, r1, r2, r3, r12, apsr}345; CHECK-81M-NEXT: bxns lr346 %1 = alloca i8, align 16347 call void @func51(ptr nonnull %1) #5348 ret void349}350 351 352attributes #4 = { "cmse_nonsecure_entry" nounwind }353attributes #5 = { nounwind }354 355