173 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-eabi -mattr=+8msecext,+mve.fp %s -o - | FileCheck %s --check-prefix=CHECK-SOFTFP3; RUN: llc -mtriple=thumbebv8.1m.main-eabi -mattr=+8msecext,+mve.fp %s -o - | FileCheck %s --check-prefix=CHECK-SOFTFP4; RUN: llc -mtriple=thumbv8.1m.main-eabi -mattr=+8msecext,+mve.fp --float-abi=hard %s -o - | FileCheck %s --check-prefix=CHECK-HARD5; RUN: llc -mtriple=thumbebv8.1m.main-eabi -mattr=+8msecext,+mve.fp --float-abi=hard %s -o - | FileCheck %s --check-prefix=CHECK-HARD6 7declare <8 x i16> @g0(...) #08declare <4 x float> @g1(...) #09 10;;11;; Test clearing before return to nonsecure state12;;13 14define <8 x i16> @f0() #1 {15; CHECK-SOFTFP-LABEL: f0:16; CHECK-SOFTFP: @ %bb.0: @ %entry17; CHECK-SOFTFP-NEXT: vstr fpcxtns, [sp, #-4]!18; CHECK-SOFTFP-NEXT: .save {r7, lr}19; CHECK-SOFTFP-NEXT: push {r7, lr}20; CHECK-SOFTFP-NEXT: .pad #421; CHECK-SOFTFP-NEXT: sub sp, #422; CHECK-SOFTFP-NEXT: bl g023; CHECK-SOFTFP-NEXT: add sp, #424; CHECK-SOFTFP-NEXT: pop.w {r7, lr}25; CHECK-SOFTFP-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}26; CHECK-SOFTFP-NEXT: vldr fpcxtns, [sp], #427; CHECK-SOFTFP-NEXT: clrm {r12, apsr}28; CHECK-SOFTFP-NEXT: bxns lr29;30; CHECK-HARD-LABEL: f0:31; CHECK-HARD: @ %bb.0: @ %entry32; CHECK-HARD-NEXT: vstr fpcxtns, [sp, #-4]!33; CHECK-HARD-NEXT: .save {r7, lr}34; CHECK-HARD-NEXT: push {r7, lr}35; CHECK-HARD-NEXT: .pad #436; CHECK-HARD-NEXT: sub sp, #437; CHECK-HARD-NEXT: bl g038; CHECK-HARD-NEXT: add sp, #439; CHECK-HARD-NEXT: pop.w {r7, lr}40; CHECK-HARD-NEXT: vscclrm {s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}41; CHECK-HARD-NEXT: vldr fpcxtns, [sp], #442; CHECK-HARD-NEXT: clrm {r0, r1, r2, r3, r12, apsr}43; CHECK-HARD-NEXT: bxns lr44entry:45 %call = call <8 x i16> @g0() #046 ret <8 x i16> %call47}48 49define <4 x float> @f1() #1 {50; CHECK-SOFTFP-LABEL: f1:51; CHECK-SOFTFP: @ %bb.0: @ %entry52; CHECK-SOFTFP-NEXT: vstr fpcxtns, [sp, #-4]!53; CHECK-SOFTFP-NEXT: .save {r7, lr}54; CHECK-SOFTFP-NEXT: push {r7, lr}55; CHECK-SOFTFP-NEXT: .pad #456; CHECK-SOFTFP-NEXT: sub sp, #457; CHECK-SOFTFP-NEXT: bl g158; CHECK-SOFTFP-NEXT: add sp, #459; CHECK-SOFTFP-NEXT: pop.w {r7, lr}60; CHECK-SOFTFP-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}61; CHECK-SOFTFP-NEXT: vldr fpcxtns, [sp], #462; CHECK-SOFTFP-NEXT: clrm {r12, apsr}63; CHECK-SOFTFP-NEXT: bxns lr64;65; CHECK-HARD-LABEL: f1:66; CHECK-HARD: @ %bb.0: @ %entry67; CHECK-HARD-NEXT: vstr fpcxtns, [sp, #-4]!68; CHECK-HARD-NEXT: .save {r7, lr}69; CHECK-HARD-NEXT: push {r7, lr}70; CHECK-HARD-NEXT: .pad #471; CHECK-HARD-NEXT: sub sp, #472; CHECK-HARD-NEXT: bl g173; CHECK-HARD-NEXT: add sp, #474; CHECK-HARD-NEXT: pop.w {r7, lr}75; CHECK-HARD-NEXT: vscclrm {s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}76; CHECK-HARD-NEXT: vldr fpcxtns, [sp], #477; CHECK-HARD-NEXT: clrm {r0, r1, r2, r3, r12, apsr}78; CHECK-HARD-NEXT: bxns lr79entry:80 %call = call nnan ninf nsz <4 x float> @g1() #081 ret <4 x float> %call82}83 84;;85;; Test clearing around nonsecure calls86;;87 88define void @f2(ptr nocapture %cb) #0 {89; CHECK-SOFTFP-LABEL: f2:90; CHECK-SOFTFP: @ %bb.0: @ %entry91; CHECK-SOFTFP-NEXT: .save {r4, lr}92; CHECK-SOFTFP-NEXT: push {r4, lr}93; CHECK-SOFTFP-NEXT: mov r4, r094; CHECK-SOFTFP-NEXT: bl g095; CHECK-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}96; CHECK-SOFTFP-NEXT: bic r4, r4, #197; CHECK-SOFTFP-NEXT: sub sp, #13698; CHECK-SOFTFP-NEXT: vlstm sp99; CHECK-SOFTFP-NEXT: clrm {r5, r6, r7, r8, r9, r10, r11, r12, apsr}100; CHECK-SOFTFP-NEXT: blxns r4101; CHECK-SOFTFP-NEXT: vlldm sp102; CHECK-SOFTFP-NEXT: add sp, #136103; CHECK-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}104; CHECK-SOFTFP-NEXT: pop {r4, pc}105;106; CHECK-HARD-LABEL: f2:107; CHECK-HARD: @ %bb.0: @ %entry108; CHECK-HARD-NEXT: .save {r4, lr}109; CHECK-HARD-NEXT: push {r4, lr}110; CHECK-HARD-NEXT: mov r4, r0111; CHECK-HARD-NEXT: bl g0112; CHECK-HARD-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}113; CHECK-HARD-NEXT: bic r4, r4, #1114; CHECK-HARD-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}115; CHECK-HARD-NEXT: vscclrm {s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}116; CHECK-HARD-NEXT: vstr fpcxts, [sp, #-8]!117; CHECK-HARD-NEXT: clrm {r0, r1, r2, r3, r5, r6, r7, r8, r9, r10, r11, r12, apsr}118; CHECK-HARD-NEXT: blxns r4119; CHECK-HARD-NEXT: vldr fpcxts, [sp], #8120; CHECK-HARD-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}121; CHECK-HARD-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}122; CHECK-HARD-NEXT: pop {r4, pc}123entry:124 %call = tail call <8 x i16> @g0() #0125 tail call void %cb(<8 x i16> %call) #2126 ret void127}128 129define void @f3(ptr nocapture %cb) #0 {130; CHECK-SOFTFP-LABEL: f3:131; CHECK-SOFTFP: @ %bb.0: @ %entry132; CHECK-SOFTFP-NEXT: .save {r4, lr}133; CHECK-SOFTFP-NEXT: push {r4, lr}134; CHECK-SOFTFP-NEXT: mov r4, r0135; CHECK-SOFTFP-NEXT: bl g1136; CHECK-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}137; CHECK-SOFTFP-NEXT: bic r4, r4, #1138; CHECK-SOFTFP-NEXT: sub sp, #136139; CHECK-SOFTFP-NEXT: vlstm sp140; CHECK-SOFTFP-NEXT: clrm {r5, r6, r7, r8, r9, r10, r11, r12, apsr}141; CHECK-SOFTFP-NEXT: blxns r4142; CHECK-SOFTFP-NEXT: vlldm sp143; CHECK-SOFTFP-NEXT: add sp, #136144; CHECK-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}145; CHECK-SOFTFP-NEXT: pop {r4, pc}146;147; CHECK-HARD-LABEL: f3:148; CHECK-HARD: @ %bb.0: @ %entry149; CHECK-HARD-NEXT: .save {r4, lr}150; CHECK-HARD-NEXT: push {r4, lr}151; CHECK-HARD-NEXT: mov r4, r0152; CHECK-HARD-NEXT: bl g1153; CHECK-HARD-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11}154; CHECK-HARD-NEXT: bic r4, r4, #1155; CHECK-HARD-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}156; CHECK-HARD-NEXT: vscclrm {s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}157; CHECK-HARD-NEXT: vstr fpcxts, [sp, #-8]!158; CHECK-HARD-NEXT: clrm {r0, r1, r2, r3, r5, r6, r7, r8, r9, r10, r11, r12, apsr}159; CHECK-HARD-NEXT: blxns r4160; CHECK-HARD-NEXT: vldr fpcxts, [sp], #8161; CHECK-HARD-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}162; CHECK-HARD-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11}163; CHECK-HARD-NEXT: pop {r4, pc}164entry:165 %call = tail call nnan ninf nsz <4 x float> @g1() #0166 tail call void %cb(<4 x float> %call) #2167 ret void168}169 170attributes #0 = { nounwind }171attributes #1 = { nounwind "cmse_nonsecure_entry" }172attributes #2 = { nounwind "cmse_nonsecure_call" }173