1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc %s -o - -mtriple=thumbv8m.base | \ 3; RUN: FileCheck %s --check-prefix=CHECK-8B 4; RUN: llc %s -o - -mtriple=thumbebv8m.base | \ 5; RUN: FileCheck %s --check-prefix=CHECK-8B 6; RUN: llc %s -o - -mtriple=thumbv8m.main -mattr=-fpregs,+dsp | \ 7; RUN: FileCheck %s --check-prefix=CHECK-8M-SOFT 8; RUN: llc %s -o - -mtriple=thumbebv8m.main -mattr=-fpregs,+dsp | \ 9; RUN: FileCheck %s --check-prefix=CHECK-8M-SOFT 10; RUN: llc %s -o - -mtriple=thumbv8m.main -mattr=+fp-armv8d16sp,+dsp | \ 11; RUN: FileCheck %s --check-prefix=CHECK-8M-SOFTFP 12; RUN: llc %s -o - -mtriple=thumbebv8m.main -mattr=+fp-armv8d16sp,+dsp | \ 13; RUN: FileCheck %s --check-prefix=CHECK-8M-SOFTFP 14; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=-fpregs,+dsp | \ 15; RUN: FileCheck %s --check-prefix=CHECK-81M-SOFT 16; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=-fpregs,+dsp | \ 17; RUN: FileCheck %s --check-prefix=CHECK-81M-SOFT 18; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+fp-armv8d16sp,+dsp | \ 19; RUN: FileCheck %s --check-prefix=CHECK-81M-SOFTFP 20; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+fp-armv8d16sp,+dsp | \ 21; RUN: FileCheck %s --check-prefix=CHECK-81M-SOFTFP 22; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+mve | \ 23; RUN: FileCheck %s --check-prefix=CHECK-81M-SOFTFP 24; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=mve | \ 25; RUN: FileCheck %s --check-prefix=CHECK-81M-SOFTFP 26 27define i32 @ns_entry(ptr nocapture %fptr) #0 { 28; CHECK-8B-LABEL: ns_entry: 29; CHECK-8B: @ %bb.0: @ %entry 30; CHECK-8B-NEXT: push {r7, lr} 31; CHECK-8B-NEXT: mov r1, r0 32; CHECK-8B-NEXT: movs r0, #10 33; CHECK-8B-NEXT: blx r1 34; CHECK-8B-NEXT: pop {r7} 35; CHECK-8B-NEXT: pop {r1} 36; CHECK-8B-NEXT: mov lr, r1 37; CHECK-8B-NEXT: mov r1, lr 38; CHECK-8B-NEXT: mov r2, lr 39; CHECK-8B-NEXT: mov r3, lr 40; CHECK-8B-NEXT: mov r12, lr 41; CHECK-8B-NEXT: msr apsr, lr 42; CHECK-8B-NEXT: bxns lr 43; 44; CHECK-8M-SOFT-LABEL: ns_entry: 45; CHECK-8M-SOFT: @ %bb.0: @ %entry 46; CHECK-8M-SOFT-NEXT: push {r7, lr} 47; CHECK-8M-SOFT-NEXT: mov r1, r0 48; CHECK-8M-SOFT-NEXT: movs r0, #10 49; CHECK-8M-SOFT-NEXT: blx r1 50; CHECK-8M-SOFT-NEXT: pop.w {r7, lr} 51; CHECK-8M-SOFT-NEXT: mov r1, lr 52; CHECK-8M-SOFT-NEXT: mov r2, lr 53; CHECK-8M-SOFT-NEXT: mov r3, lr 54; CHECK-8M-SOFT-NEXT: mov r12, lr 55; CHECK-8M-SOFT-NEXT: msr apsr_nzcvqg, lr 56; CHECK-8M-SOFT-NEXT: bxns lr 57; 58; CHECK-8M-SOFTFP-LABEL: ns_entry: 59; CHECK-8M-SOFTFP: @ %bb.0: @ %entry 60; CHECK-8M-SOFTFP-NEXT: push {r7, lr} 61; CHECK-8M-SOFTFP-NEXT: mov r1, r0 62; CHECK-8M-SOFTFP-NEXT: movs r0, #10 63; CHECK-8M-SOFTFP-NEXT: blx r1 64; CHECK-8M-SOFTFP-NEXT: pop.w {r7, lr} 65; CHECK-8M-SOFTFP-NEXT: mrs r12, control 66; CHECK-8M-SOFTFP-NEXT: tst.w r12, #8 67; CHECK-8M-SOFTFP-NEXT: beq .LBB0_2 68; CHECK-8M-SOFTFP-NEXT: @ %bb.1: @ %entry 69; CHECK-8M-SOFTFP-NEXT: vmrs r12, fpscr 70; CHECK-8M-SOFTFP-NEXT: vmov d0, lr, lr 71; CHECK-8M-SOFTFP-NEXT: vmov d1, lr, lr 72; CHECK-8M-SOFTFP-NEXT: vmov d2, lr, lr 73; CHECK-8M-SOFTFP-NEXT: vmov d3, lr, lr 74; CHECK-8M-SOFTFP-NEXT: vmov d4, lr, lr 75; CHECK-8M-SOFTFP-NEXT: vmov d5, lr, lr 76; CHECK-8M-SOFTFP-NEXT: vmov d6, lr, lr 77; CHECK-8M-SOFTFP-NEXT: vmov d7, lr, lr 78; CHECK-8M-SOFTFP-NEXT: bic r12, r12, #159 79; CHECK-8M-SOFTFP-NEXT: bic r12, r12, #4026531840 80; CHECK-8M-SOFTFP-NEXT: vmsr fpscr, r12 81; CHECK-8M-SOFTFP-NEXT: .LBB0_2: @ %entry 82; CHECK-8M-SOFTFP-NEXT: mov r1, lr 83; CHECK-8M-SOFTFP-NEXT: mov r2, lr 84; CHECK-8M-SOFTFP-NEXT: mov r3, lr 85; CHECK-8M-SOFTFP-NEXT: mov r12, lr 86; CHECK-8M-SOFTFP-NEXT: msr apsr_nzcvqg, lr 87; CHECK-8M-SOFTFP-NEXT: bxns lr 88; 89; CHECK-81M-SOFT-LABEL: ns_entry: 90; CHECK-81M-SOFT: @ %bb.0: @ %entry 91; CHECK-81M-SOFT-NEXT: vstr fpcxtns, [sp, #-4]! 92; CHECK-81M-SOFT-NEXT: push {r7, lr} 93; CHECK-81M-SOFT-NEXT: sub sp, #4 94; CHECK-81M-SOFT-NEXT: mov r1, r0 95; CHECK-81M-SOFT-NEXT: movs r0, #10 96; CHECK-81M-SOFT-NEXT: blx r1 97; CHECK-81M-SOFT-NEXT: add sp, #4 98; CHECK-81M-SOFT-NEXT: pop.w {r7, lr} 99; CHECK-81M-SOFT-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 100; CHECK-81M-SOFT-NEXT: vldr fpcxtns, [sp], #4 101; CHECK-81M-SOFT-NEXT: clrm {r1, r2, r3, r12, apsr} 102; CHECK-81M-SOFT-NEXT: bxns lr 103; 104; CHECK-81M-SOFTFP-LABEL: ns_entry: 105; CHECK-81M-SOFTFP: @ %bb.0: @ %entry 106; CHECK-81M-SOFTFP-NEXT: vstr fpcxtns, [sp, #-4]! 107; CHECK-81M-SOFTFP-NEXT: push {r7, lr} 108; CHECK-81M-SOFTFP-NEXT: sub sp, #4 109; CHECK-81M-SOFTFP-NEXT: mov r1, r0 110; CHECK-81M-SOFTFP-NEXT: movs r0, #10 111; CHECK-81M-SOFTFP-NEXT: blx r1 112; CHECK-81M-SOFTFP-NEXT: add sp, #4 113; CHECK-81M-SOFTFP-NEXT: pop.w {r7, lr} 114; CHECK-81M-SOFTFP-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 115; CHECK-81M-SOFTFP-NEXT: vldr fpcxtns, [sp], #4 116; CHECK-81M-SOFTFP-NEXT: clrm {r1, r2, r3, r12, apsr} 117; CHECK-81M-SOFTFP-NEXT: bxns lr 118entry: 119 %call = call i32 %fptr(i32 10) #1 120 ret i32 %call 121} 122 123attributes #0 = { "cmse_nonsecure_entry" nounwind } 124attributes #1 = { nounwind } 125 126 127define i32 @ns_call(ptr nocapture %fptr) #2 { 128; CHECK-8B-LABEL: ns_call: 129; CHECK-8B: @ %bb.0: @ %entry 130; CHECK-8B-NEXT: push {r7, lr} 131; CHECK-8B-NEXT: mov r1, r0 132; CHECK-8B-NEXT: movs r0, #10 133; CHECK-8B-NEXT: push {r4, r5, r6, r7} 134; CHECK-8B-NEXT: mov r7, r11 135; CHECK-8B-NEXT: mov r6, r10 136; CHECK-8B-NEXT: mov r5, r9 137; CHECK-8B-NEXT: mov r4, r8 138; CHECK-8B-NEXT: push {r4, r5, r6, r7} 139; CHECK-8B-NEXT: mov r2, #1 140; CHECK-8B-NEXT: bics r1, r2 141; CHECK-8B-NEXT: mov r2, r1 142; CHECK-8B-NEXT: mov r3, r1 143; CHECK-8B-NEXT: mov r4, r1 144; CHECK-8B-NEXT: mov r5, r1 145; CHECK-8B-NEXT: mov r6, r1 146; CHECK-8B-NEXT: mov r7, r1 147; CHECK-8B-NEXT: mov r8, r1 148; CHECK-8B-NEXT: mov r9, r1 149; CHECK-8B-NEXT: mov r10, r1 150; CHECK-8B-NEXT: mov r11, r1 151; CHECK-8B-NEXT: mov r12, r1 152; CHECK-8B-NEXT: msr apsr, r1 153; CHECK-8B-NEXT: blxns r1 154; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 155; CHECK-8B-NEXT: mov r8, r4 156; CHECK-8B-NEXT: mov r9, r5 157; CHECK-8B-NEXT: mov r10, r6 158; CHECK-8B-NEXT: mov r11, r7 159; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 160; CHECK-8B-NEXT: pop {r7, pc} 161; 162; CHECK-8M-SOFT-LABEL: ns_call: 163; CHECK-8M-SOFT: @ %bb.0: @ %entry 164; CHECK-8M-SOFT-NEXT: push {r7, lr} 165; CHECK-8M-SOFT-NEXT: mov r1, r0 166; CHECK-8M-SOFT-NEXT: movs r0, #10 167; CHECK-8M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 168; CHECK-8M-SOFT-NEXT: bic r1, r1, #1 169; CHECK-8M-SOFT-NEXT: sub sp, #136 170; CHECK-8M-SOFT-NEXT: vlstm sp 171; CHECK-8M-SOFT-NEXT: mov r2, r1 172; CHECK-8M-SOFT-NEXT: mov r3, r1 173; CHECK-8M-SOFT-NEXT: mov r4, r1 174; CHECK-8M-SOFT-NEXT: mov r5, r1 175; CHECK-8M-SOFT-NEXT: mov r6, r1 176; CHECK-8M-SOFT-NEXT: mov r7, r1 177; CHECK-8M-SOFT-NEXT: mov r8, r1 178; CHECK-8M-SOFT-NEXT: mov r9, r1 179; CHECK-8M-SOFT-NEXT: mov r10, r1 180; CHECK-8M-SOFT-NEXT: mov r11, r1 181; CHECK-8M-SOFT-NEXT: mov r12, r1 182; CHECK-8M-SOFT-NEXT: msr apsr_nzcvqg, r1 183; CHECK-8M-SOFT-NEXT: blxns r1 184; CHECK-8M-SOFT-NEXT: vlldm sp 185; CHECK-8M-SOFT-NEXT: add sp, #136 186; CHECK-8M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 187; CHECK-8M-SOFT-NEXT: pop {r7, pc} 188; 189; CHECK-8M-SOFTFP-LABEL: ns_call: 190; CHECK-8M-SOFTFP: @ %bb.0: @ %entry 191; CHECK-8M-SOFTFP-NEXT: push {r7, lr} 192; CHECK-8M-SOFTFP-NEXT: mov r1, r0 193; CHECK-8M-SOFTFP-NEXT: movs r0, #10 194; CHECK-8M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 195; CHECK-8M-SOFTFP-NEXT: bic r1, r1, #1 196; CHECK-8M-SOFTFP-NEXT: sub sp, #136 197; CHECK-8M-SOFTFP-NEXT: vlstm sp 198; CHECK-8M-SOFTFP-NEXT: mov r2, r1 199; CHECK-8M-SOFTFP-NEXT: mov r3, r1 200; CHECK-8M-SOFTFP-NEXT: mov r4, r1 201; CHECK-8M-SOFTFP-NEXT: mov r5, r1 202; CHECK-8M-SOFTFP-NEXT: mov r6, r1 203; CHECK-8M-SOFTFP-NEXT: mov r7, r1 204; CHECK-8M-SOFTFP-NEXT: mov r8, r1 205; CHECK-8M-SOFTFP-NEXT: mov r9, r1 206; CHECK-8M-SOFTFP-NEXT: mov r10, r1 207; CHECK-8M-SOFTFP-NEXT: mov r11, r1 208; CHECK-8M-SOFTFP-NEXT: mov r12, r1 209; CHECK-8M-SOFTFP-NEXT: msr apsr_nzcvqg, r1 210; CHECK-8M-SOFTFP-NEXT: blxns r1 211; CHECK-8M-SOFTFP-NEXT: vlldm sp 212; CHECK-8M-SOFTFP-NEXT: add sp, #136 213; CHECK-8M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 214; CHECK-8M-SOFTFP-NEXT: pop {r7, pc} 215; 216; CHECK-81M-SOFT-LABEL: ns_call: 217; CHECK-81M-SOFT: @ %bb.0: @ %entry 218; CHECK-81M-SOFT-NEXT: push {r7, lr} 219; CHECK-81M-SOFT-NEXT: mov r1, r0 220; CHECK-81M-SOFT-NEXT: movs r0, #10 221; CHECK-81M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 222; CHECK-81M-SOFT-NEXT: bic r1, r1, #1 223; CHECK-81M-SOFT-NEXT: sub sp, #136 224; CHECK-81M-SOFT-NEXT: vlstm sp 225; CHECK-81M-SOFT-NEXT: clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 226; CHECK-81M-SOFT-NEXT: blxns r1 227; CHECK-81M-SOFT-NEXT: vlldm sp 228; CHECK-81M-SOFT-NEXT: add sp, #136 229; CHECK-81M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 230; CHECK-81M-SOFT-NEXT: pop {r7, pc} 231; 232; CHECK-81M-SOFTFP-LABEL: ns_call: 233; CHECK-81M-SOFTFP: @ %bb.0: @ %entry 234; CHECK-81M-SOFTFP-NEXT: push {r7, lr} 235; CHECK-81M-SOFTFP-NEXT: mov r1, r0 236; CHECK-81M-SOFTFP-NEXT: movs r0, #10 237; CHECK-81M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 238; CHECK-81M-SOFTFP-NEXT: bic r1, r1, #1 239; CHECK-81M-SOFTFP-NEXT: sub sp, #136 240; CHECK-81M-SOFTFP-NEXT: vlstm sp 241; CHECK-81M-SOFTFP-NEXT: clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 242; CHECK-81M-SOFTFP-NEXT: blxns r1 243; CHECK-81M-SOFTFP-NEXT: vlldm sp 244; CHECK-81M-SOFTFP-NEXT: add sp, #136 245; CHECK-81M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 246; CHECK-81M-SOFTFP-NEXT: pop {r7, pc} 247entry: 248 %call = call i32 %fptr(i32 10) #3 249 ret i32 %call 250} 251 252attributes #2 = { nounwind } 253attributes #3 = { "cmse_nonsecure_call" nounwind } 254 255 256define i32 @ns_tail_call(ptr nocapture %fptr) #4 { 257; CHECK-8B-LABEL: ns_tail_call: 258; CHECK-8B: @ %bb.0: @ %entry 259; CHECK-8B-NEXT: push {r7, lr} 260; CHECK-8B-NEXT: mov r1, r0 261; CHECK-8B-NEXT: movs r0, #10 262; CHECK-8B-NEXT: push {r4, r5, r6, r7} 263; CHECK-8B-NEXT: mov r7, r11 264; CHECK-8B-NEXT: mov r6, r10 265; CHECK-8B-NEXT: mov r5, r9 266; CHECK-8B-NEXT: mov r4, r8 267; CHECK-8B-NEXT: push {r4, r5, r6, r7} 268; CHECK-8B-NEXT: mov r2, #1 269; CHECK-8B-NEXT: bics r1, r2 270; CHECK-8B-NEXT: mov r2, r1 271; CHECK-8B-NEXT: mov r3, r1 272; CHECK-8B-NEXT: mov r4, r1 273; CHECK-8B-NEXT: mov r5, r1 274; CHECK-8B-NEXT: mov r6, r1 275; CHECK-8B-NEXT: mov r7, r1 276; CHECK-8B-NEXT: mov r8, r1 277; CHECK-8B-NEXT: mov r9, r1 278; CHECK-8B-NEXT: mov r10, r1 279; CHECK-8B-NEXT: mov r11, r1 280; CHECK-8B-NEXT: mov r12, r1 281; CHECK-8B-NEXT: msr apsr, r1 282; CHECK-8B-NEXT: blxns r1 283; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 284; CHECK-8B-NEXT: mov r8, r4 285; CHECK-8B-NEXT: mov r9, r5 286; CHECK-8B-NEXT: mov r10, r6 287; CHECK-8B-NEXT: mov r11, r7 288; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 289; CHECK-8B-NEXT: pop {r7, pc} 290; 291; CHECK-8M-SOFT-LABEL: ns_tail_call: 292; CHECK-8M-SOFT: @ %bb.0: @ %entry 293; CHECK-8M-SOFT-NEXT: push {r7, lr} 294; CHECK-8M-SOFT-NEXT: mov r1, r0 295; CHECK-8M-SOFT-NEXT: movs r0, #10 296; CHECK-8M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 297; CHECK-8M-SOFT-NEXT: bic r1, r1, #1 298; CHECK-8M-SOFT-NEXT: sub sp, #136 299; CHECK-8M-SOFT-NEXT: vlstm sp 300; CHECK-8M-SOFT-NEXT: mov r2, r1 301; CHECK-8M-SOFT-NEXT: mov r3, r1 302; CHECK-8M-SOFT-NEXT: mov r4, r1 303; CHECK-8M-SOFT-NEXT: mov r5, r1 304; CHECK-8M-SOFT-NEXT: mov r6, r1 305; CHECK-8M-SOFT-NEXT: mov r7, r1 306; CHECK-8M-SOFT-NEXT: mov r8, r1 307; CHECK-8M-SOFT-NEXT: mov r9, r1 308; CHECK-8M-SOFT-NEXT: mov r10, r1 309; CHECK-8M-SOFT-NEXT: mov r11, r1 310; CHECK-8M-SOFT-NEXT: mov r12, r1 311; CHECK-8M-SOFT-NEXT: msr apsr_nzcvqg, r1 312; CHECK-8M-SOFT-NEXT: blxns r1 313; CHECK-8M-SOFT-NEXT: vlldm sp 314; CHECK-8M-SOFT-NEXT: add sp, #136 315; CHECK-8M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 316; CHECK-8M-SOFT-NEXT: pop {r7, pc} 317; 318; CHECK-8M-SOFTFP-LABEL: ns_tail_call: 319; CHECK-8M-SOFTFP: @ %bb.0: @ %entry 320; CHECK-8M-SOFTFP-NEXT: push {r7, lr} 321; CHECK-8M-SOFTFP-NEXT: mov r1, r0 322; CHECK-8M-SOFTFP-NEXT: movs r0, #10 323; CHECK-8M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 324; CHECK-8M-SOFTFP-NEXT: bic r1, r1, #1 325; CHECK-8M-SOFTFP-NEXT: sub sp, #136 326; CHECK-8M-SOFTFP-NEXT: vlstm sp 327; CHECK-8M-SOFTFP-NEXT: mov r2, r1 328; CHECK-8M-SOFTFP-NEXT: mov r3, r1 329; CHECK-8M-SOFTFP-NEXT: mov r4, r1 330; CHECK-8M-SOFTFP-NEXT: mov r5, r1 331; CHECK-8M-SOFTFP-NEXT: mov r6, r1 332; CHECK-8M-SOFTFP-NEXT: mov r7, r1 333; CHECK-8M-SOFTFP-NEXT: mov r8, r1 334; CHECK-8M-SOFTFP-NEXT: mov r9, r1 335; CHECK-8M-SOFTFP-NEXT: mov r10, r1 336; CHECK-8M-SOFTFP-NEXT: mov r11, r1 337; CHECK-8M-SOFTFP-NEXT: mov r12, r1 338; CHECK-8M-SOFTFP-NEXT: msr apsr_nzcvqg, r1 339; CHECK-8M-SOFTFP-NEXT: blxns r1 340; CHECK-8M-SOFTFP-NEXT: vlldm sp 341; CHECK-8M-SOFTFP-NEXT: add sp, #136 342; CHECK-8M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 343; CHECK-8M-SOFTFP-NEXT: pop {r7, pc} 344; 345; CHECK-81M-SOFT-LABEL: ns_tail_call: 346; CHECK-81M-SOFT: @ %bb.0: @ %entry 347; CHECK-81M-SOFT-NEXT: push {r7, lr} 348; CHECK-81M-SOFT-NEXT: mov r1, r0 349; CHECK-81M-SOFT-NEXT: movs r0, #10 350; CHECK-81M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 351; CHECK-81M-SOFT-NEXT: bic r1, r1, #1 352; CHECK-81M-SOFT-NEXT: sub sp, #136 353; CHECK-81M-SOFT-NEXT: vlstm sp 354; CHECK-81M-SOFT-NEXT: clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 355; CHECK-81M-SOFT-NEXT: blxns r1 356; CHECK-81M-SOFT-NEXT: vlldm sp 357; CHECK-81M-SOFT-NEXT: add sp, #136 358; CHECK-81M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 359; CHECK-81M-SOFT-NEXT: pop {r7, pc} 360; 361; CHECK-81M-SOFTFP-LABEL: ns_tail_call: 362; CHECK-81M-SOFTFP: @ %bb.0: @ %entry 363; CHECK-81M-SOFTFP-NEXT: push {r7, lr} 364; CHECK-81M-SOFTFP-NEXT: mov r1, r0 365; CHECK-81M-SOFTFP-NEXT: movs r0, #10 366; CHECK-81M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 367; CHECK-81M-SOFTFP-NEXT: bic r1, r1, #1 368; CHECK-81M-SOFTFP-NEXT: sub sp, #136 369; CHECK-81M-SOFTFP-NEXT: vlstm sp 370; CHECK-81M-SOFTFP-NEXT: clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 371; CHECK-81M-SOFTFP-NEXT: blxns r1 372; CHECK-81M-SOFTFP-NEXT: vlldm sp 373; CHECK-81M-SOFTFP-NEXT: add sp, #136 374; CHECK-81M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 375; CHECK-81M-SOFTFP-NEXT: pop {r7, pc} 376entry: 377 %call = tail call i32 %fptr(i32 10) #5 378 ret i32 %call 379} 380 381attributes #4 = { nounwind } 382attributes #5 = { "cmse_nonsecure_call" nounwind } 383 384 385define ptr @ns_tail_call_many_args(ptr %f, i32 %a, i32 %b, i32 %c, i32 %d) #6 { 386; CHECK-8B-LABEL: ns_tail_call_many_args: 387; CHECK-8B: @ %bb.0: 388; CHECK-8B-NEXT: push {r4, r5, r7, lr} 389; CHECK-8B-NEXT: mov r5, r3 390; CHECK-8B-NEXT: mov r4, r0 391; CHECK-8B-NEXT: ldr r3, [sp, #16] 392; CHECK-8B-NEXT: mov r0, r1 393; CHECK-8B-NEXT: mov r1, r2 394; CHECK-8B-NEXT: mov r2, r5 395; CHECK-8B-NEXT: push {r4, r5, r6, r7} 396; CHECK-8B-NEXT: mov r7, r11 397; CHECK-8B-NEXT: mov r6, r10 398; CHECK-8B-NEXT: mov r5, r9 399; CHECK-8B-NEXT: push {r5, r6, r7} 400; CHECK-8B-NEXT: mov r5, r8 401; CHECK-8B-NEXT: push {r5} 402; CHECK-8B-NEXT: mov r5, #1 403; CHECK-8B-NEXT: bics r4, r5 404; CHECK-8B-NEXT: mov r5, r4 405; CHECK-8B-NEXT: mov r6, r4 406; CHECK-8B-NEXT: mov r7, r4 407; CHECK-8B-NEXT: mov r8, r4 408; CHECK-8B-NEXT: mov r9, r4 409; CHECK-8B-NEXT: mov r10, r4 410; CHECK-8B-NEXT: mov r11, r4 411; CHECK-8B-NEXT: mov r12, r4 412; CHECK-8B-NEXT: msr apsr, r4 413; CHECK-8B-NEXT: blxns r4 414; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 415; CHECK-8B-NEXT: mov r8, r4 416; CHECK-8B-NEXT: mov r9, r5 417; CHECK-8B-NEXT: mov r10, r6 418; CHECK-8B-NEXT: mov r11, r7 419; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 420; CHECK-8B-NEXT: mov r0, r4 421; CHECK-8B-NEXT: pop {r4, r5, r7, pc} 422; 423; CHECK-8M-SOFT-LABEL: ns_tail_call_many_args: 424; CHECK-8M-SOFT: @ %bb.0: 425; CHECK-8M-SOFT-NEXT: push {r4, lr} 426; CHECK-8M-SOFT-NEXT: mov r4, r0 427; CHECK-8M-SOFT-NEXT: mov r12, r3 428; CHECK-8M-SOFT-NEXT: mov r0, r1 429; CHECK-8M-SOFT-NEXT: mov r1, r2 430; CHECK-8M-SOFT-NEXT: ldr r3, [sp, #8] 431; CHECK-8M-SOFT-NEXT: mov r2, r12 432; CHECK-8M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 433; CHECK-8M-SOFT-NEXT: bic r4, r4, #1 434; CHECK-8M-SOFT-NEXT: sub sp, #136 435; CHECK-8M-SOFT-NEXT: vlstm sp 436; CHECK-8M-SOFT-NEXT: mov r5, r4 437; CHECK-8M-SOFT-NEXT: mov r6, r4 438; CHECK-8M-SOFT-NEXT: mov r7, r4 439; CHECK-8M-SOFT-NEXT: mov r8, r4 440; CHECK-8M-SOFT-NEXT: mov r9, r4 441; CHECK-8M-SOFT-NEXT: mov r10, r4 442; CHECK-8M-SOFT-NEXT: mov r11, r4 443; CHECK-8M-SOFT-NEXT: mov r12, r4 444; CHECK-8M-SOFT-NEXT: msr apsr_nzcvqg, r4 445; CHECK-8M-SOFT-NEXT: blxns r4 446; CHECK-8M-SOFT-NEXT: vlldm sp 447; CHECK-8M-SOFT-NEXT: add sp, #136 448; CHECK-8M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 449; CHECK-8M-SOFT-NEXT: mov r0, r4 450; CHECK-8M-SOFT-NEXT: pop {r4, pc} 451; 452; CHECK-8M-SOFTFP-LABEL: ns_tail_call_many_args: 453; CHECK-8M-SOFTFP: @ %bb.0: 454; CHECK-8M-SOFTFP-NEXT: push {r4, lr} 455; CHECK-8M-SOFTFP-NEXT: mov r4, r0 456; CHECK-8M-SOFTFP-NEXT: mov r12, r3 457; CHECK-8M-SOFTFP-NEXT: mov r0, r1 458; CHECK-8M-SOFTFP-NEXT: mov r1, r2 459; CHECK-8M-SOFTFP-NEXT: ldr r3, [sp, #8] 460; CHECK-8M-SOFTFP-NEXT: mov r2, r12 461; CHECK-8M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 462; CHECK-8M-SOFTFP-NEXT: bic r4, r4, #1 463; CHECK-8M-SOFTFP-NEXT: sub sp, #136 464; CHECK-8M-SOFTFP-NEXT: vlstm sp 465; CHECK-8M-SOFTFP-NEXT: mov r5, r4 466; CHECK-8M-SOFTFP-NEXT: mov r6, r4 467; CHECK-8M-SOFTFP-NEXT: mov r7, r4 468; CHECK-8M-SOFTFP-NEXT: mov r8, r4 469; CHECK-8M-SOFTFP-NEXT: mov r9, r4 470; CHECK-8M-SOFTFP-NEXT: mov r10, r4 471; CHECK-8M-SOFTFP-NEXT: mov r11, r4 472; CHECK-8M-SOFTFP-NEXT: mov r12, r4 473; CHECK-8M-SOFTFP-NEXT: msr apsr_nzcvqg, r4 474; CHECK-8M-SOFTFP-NEXT: blxns r4 475; CHECK-8M-SOFTFP-NEXT: vlldm sp 476; CHECK-8M-SOFTFP-NEXT: add sp, #136 477; CHECK-8M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 478; CHECK-8M-SOFTFP-NEXT: mov r0, r4 479; CHECK-8M-SOFTFP-NEXT: pop {r4, pc} 480; 481; CHECK-81M-SOFT-LABEL: ns_tail_call_many_args: 482; CHECK-81M-SOFT: @ %bb.0: 483; CHECK-81M-SOFT-NEXT: push {r4, lr} 484; CHECK-81M-SOFT-NEXT: mov r4, r0 485; CHECK-81M-SOFT-NEXT: mov r12, r3 486; CHECK-81M-SOFT-NEXT: mov r0, r1 487; CHECK-81M-SOFT-NEXT: mov r1, r2 488; CHECK-81M-SOFT-NEXT: ldr r3, [sp, #8] 489; CHECK-81M-SOFT-NEXT: mov r2, r12 490; CHECK-81M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 491; CHECK-81M-SOFT-NEXT: bic r4, r4, #1 492; CHECK-81M-SOFT-NEXT: sub sp, #136 493; CHECK-81M-SOFT-NEXT: vlstm sp 494; CHECK-81M-SOFT-NEXT: clrm {r5, r6, r7, r8, r9, r10, r11, r12, apsr} 495; CHECK-81M-SOFT-NEXT: blxns r4 496; CHECK-81M-SOFT-NEXT: vlldm sp 497; CHECK-81M-SOFT-NEXT: add sp, #136 498; CHECK-81M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 499; CHECK-81M-SOFT-NEXT: mov r0, r4 500; CHECK-81M-SOFT-NEXT: pop {r4, pc} 501; 502; CHECK-81M-SOFTFP-LABEL: ns_tail_call_many_args: 503; CHECK-81M-SOFTFP: @ %bb.0: 504; CHECK-81M-SOFTFP-NEXT: push {r4, lr} 505; CHECK-81M-SOFTFP-NEXT: mov r4, r0 506; CHECK-81M-SOFTFP-NEXT: mov r12, r3 507; CHECK-81M-SOFTFP-NEXT: mov r0, r1 508; CHECK-81M-SOFTFP-NEXT: mov r1, r2 509; CHECK-81M-SOFTFP-NEXT: ldr r3, [sp, #8] 510; CHECK-81M-SOFTFP-NEXT: mov r2, r12 511; CHECK-81M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 512; CHECK-81M-SOFTFP-NEXT: bic r4, r4, #1 513; CHECK-81M-SOFTFP-NEXT: sub sp, #136 514; CHECK-81M-SOFTFP-NEXT: vlstm sp 515; CHECK-81M-SOFTFP-NEXT: clrm {r5, r6, r7, r8, r9, r10, r11, r12, apsr} 516; CHECK-81M-SOFTFP-NEXT: blxns r4 517; CHECK-81M-SOFTFP-NEXT: vlldm sp 518; CHECK-81M-SOFTFP-NEXT: add sp, #136 519; CHECK-81M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 520; CHECK-81M-SOFTFP-NEXT: mov r0, r4 521; CHECK-81M-SOFTFP-NEXT: pop {r4, pc} 522 tail call void %f(i32 %a, i32 %b, i32 %c, i32 %d) #7 523 ret ptr %f 524} 525 526attributes #6 = { nounwind } 527attributes #7 = { "cmse_nonsecure_call" nounwind } 528 529 530define i32 @ns_call_void(i32 %reg0, ptr nocapture %fptr) #8 { 531; CHECK-8B-LABEL: ns_call_void: 532; CHECK-8B: @ %bb.0: @ %entry 533; CHECK-8B-NEXT: push {r7, lr} 534; CHECK-8B-NEXT: push {r4, r5, r6, r7} 535; CHECK-8B-NEXT: mov r7, r11 536; CHECK-8B-NEXT: mov r6, r10 537; CHECK-8B-NEXT: mov r5, r9 538; CHECK-8B-NEXT: mov r4, r8 539; CHECK-8B-NEXT: push {r4, r5, r6, r7} 540; CHECK-8B-NEXT: mov r0, #1 541; CHECK-8B-NEXT: bics r1, r0 542; CHECK-8B-NEXT: mov r0, r1 543; CHECK-8B-NEXT: mov r2, r1 544; CHECK-8B-NEXT: mov r3, r1 545; CHECK-8B-NEXT: mov r4, r1 546; CHECK-8B-NEXT: mov r5, r1 547; CHECK-8B-NEXT: mov r6, r1 548; CHECK-8B-NEXT: mov r7, r1 549; CHECK-8B-NEXT: mov r8, r1 550; CHECK-8B-NEXT: mov r9, r1 551; CHECK-8B-NEXT: mov r10, r1 552; CHECK-8B-NEXT: mov r11, r1 553; CHECK-8B-NEXT: mov r12, r1 554; CHECK-8B-NEXT: msr apsr, r1 555; CHECK-8B-NEXT: blxns r1 556; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 557; CHECK-8B-NEXT: mov r8, r4 558; CHECK-8B-NEXT: mov r9, r5 559; CHECK-8B-NEXT: mov r10, r6 560; CHECK-8B-NEXT: mov r11, r7 561; CHECK-8B-NEXT: pop {r4, r5, r6, r7} 562; CHECK-8B-NEXT: pop {r7, pc} 563; 564; CHECK-8M-SOFT-LABEL: ns_call_void: 565; CHECK-8M-SOFT: @ %bb.0: @ %entry 566; CHECK-8M-SOFT-NEXT: push {r7, lr} 567; CHECK-8M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 568; CHECK-8M-SOFT-NEXT: bic r1, r1, #1 569; CHECK-8M-SOFT-NEXT: sub sp, #136 570; CHECK-8M-SOFT-NEXT: vlstm sp 571; CHECK-8M-SOFT-NEXT: mov r0, r1 572; CHECK-8M-SOFT-NEXT: mov r2, r1 573; CHECK-8M-SOFT-NEXT: mov r3, r1 574; CHECK-8M-SOFT-NEXT: mov r4, r1 575; CHECK-8M-SOFT-NEXT: mov r5, r1 576; CHECK-8M-SOFT-NEXT: mov r6, r1 577; CHECK-8M-SOFT-NEXT: mov r7, r1 578; CHECK-8M-SOFT-NEXT: mov r8, r1 579; CHECK-8M-SOFT-NEXT: mov r9, r1 580; CHECK-8M-SOFT-NEXT: mov r10, r1 581; CHECK-8M-SOFT-NEXT: mov r11, r1 582; CHECK-8M-SOFT-NEXT: mov r12, r1 583; CHECK-8M-SOFT-NEXT: msr apsr_nzcvqg, r1 584; CHECK-8M-SOFT-NEXT: blxns r1 585; CHECK-8M-SOFT-NEXT: vlldm sp 586; CHECK-8M-SOFT-NEXT: add sp, #136 587; CHECK-8M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 588; CHECK-8M-SOFT-NEXT: pop {r7, pc} 589; 590; CHECK-8M-SOFTFP-LABEL: ns_call_void: 591; CHECK-8M-SOFTFP: @ %bb.0: @ %entry 592; CHECK-8M-SOFTFP-NEXT: push {r7, lr} 593; CHECK-8M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 594; CHECK-8M-SOFTFP-NEXT: bic r1, r1, #1 595; CHECK-8M-SOFTFP-NEXT: sub sp, #136 596; CHECK-8M-SOFTFP-NEXT: vlstm sp 597; CHECK-8M-SOFTFP-NEXT: mov r0, r1 598; CHECK-8M-SOFTFP-NEXT: mov r2, r1 599; CHECK-8M-SOFTFP-NEXT: mov r3, r1 600; CHECK-8M-SOFTFP-NEXT: mov r4, r1 601; CHECK-8M-SOFTFP-NEXT: mov r5, r1 602; CHECK-8M-SOFTFP-NEXT: mov r6, r1 603; CHECK-8M-SOFTFP-NEXT: mov r7, r1 604; CHECK-8M-SOFTFP-NEXT: mov r8, r1 605; CHECK-8M-SOFTFP-NEXT: mov r9, r1 606; CHECK-8M-SOFTFP-NEXT: mov r10, r1 607; CHECK-8M-SOFTFP-NEXT: mov r11, r1 608; CHECK-8M-SOFTFP-NEXT: mov r12, r1 609; CHECK-8M-SOFTFP-NEXT: msr apsr_nzcvqg, r1 610; CHECK-8M-SOFTFP-NEXT: blxns r1 611; CHECK-8M-SOFTFP-NEXT: vlldm sp 612; CHECK-8M-SOFTFP-NEXT: add sp, #136 613; CHECK-8M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 614; CHECK-8M-SOFTFP-NEXT: pop {r7, pc} 615; 616; CHECK-81M-SOFT-LABEL: ns_call_void: 617; CHECK-81M-SOFT: @ %bb.0: @ %entry 618; CHECK-81M-SOFT-NEXT: push {r7, lr} 619; CHECK-81M-SOFT-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 620; CHECK-81M-SOFT-NEXT: bic r1, r1, #1 621; CHECK-81M-SOFT-NEXT: sub sp, #136 622; CHECK-81M-SOFT-NEXT: vlstm sp 623; CHECK-81M-SOFT-NEXT: clrm {r0, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 624; CHECK-81M-SOFT-NEXT: blxns r1 625; CHECK-81M-SOFT-NEXT: vlldm sp 626; CHECK-81M-SOFT-NEXT: add sp, #136 627; CHECK-81M-SOFT-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 628; CHECK-81M-SOFT-NEXT: pop {r7, pc} 629; 630; CHECK-81M-SOFTFP-LABEL: ns_call_void: 631; CHECK-81M-SOFTFP: @ %bb.0: @ %entry 632; CHECK-81M-SOFTFP-NEXT: push {r7, lr} 633; CHECK-81M-SOFTFP-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 634; CHECK-81M-SOFTFP-NEXT: bic r1, r1, #1 635; CHECK-81M-SOFTFP-NEXT: sub sp, #136 636; CHECK-81M-SOFTFP-NEXT: vlstm sp 637; CHECK-81M-SOFTFP-NEXT: clrm {r0, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 638; CHECK-81M-SOFTFP-NEXT: blxns r1 639; CHECK-81M-SOFTFP-NEXT: vlldm sp 640; CHECK-81M-SOFTFP-NEXT: add sp, #136 641; CHECK-81M-SOFTFP-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 642; CHECK-81M-SOFTFP-NEXT: pop {r7, pc} 643entry: 644 %call = call i32 %fptr() #9 645 ret i32 %call 646} 647 648attributes #8 = { nounwind } 649attributes #9 = { "cmse_nonsecure_call" nounwind } 650 651