1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc %s -o - -mtriple=thumbv8m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \ 3; RUN: FileCheck %s --check-prefix=CHECK-8M --check-prefix=CHECK-8M-LE 4; RUN: llc %s -o - -mtriple=thumbebv8m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \ 5; RUN: FileCheck %s --check-prefix=CHECK-8M --check-prefix=CHECK-8M-BE 6; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \ 7; RUN: FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-NO-MVE --check-prefix=CHECK-81M-LE 8; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \ 9; RUN: FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-NO-MVE --check-prefix=CHECK-81M-BE 10; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+mve.fp -float-abi=hard | \ 11; RUN: FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-MVE --check-prefix=CHECK-81M-LE 12; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+mve.fp -float-abi=hard | \ 13; RUN: FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-MVE --check-prefix=CHECK-81M-BE 14 15define float @f1(ptr nocapture %fptr) #0 { 16; CHECK-8M-LABEL: f1: 17; CHECK-8M: @ %bb.0: @ %entry 18; CHECK-8M-NEXT: push {r7, lr} 19; CHECK-8M-NEXT: vmov.f32 s0, #1.000000e+01 20; CHECK-8M-NEXT: blx r0 21; CHECK-8M-NEXT: pop.w {r7, lr} 22; CHECK-8M-NEXT: mrs r12, control 23; CHECK-8M-NEXT: tst.w r12, #8 24; CHECK-8M-NEXT: beq .LBB0_2 25; CHECK-8M-NEXT: @ %bb.1: @ %entry 26; CHECK-8M-NEXT: vmrs r12, fpscr 27; CHECK-8M-NEXT: vmov s1, lr 28; CHECK-8M-NEXT: vmov d1, lr, lr 29; CHECK-8M-NEXT: vmov d2, lr, lr 30; CHECK-8M-NEXT: vmov d3, lr, lr 31; CHECK-8M-NEXT: vmov d4, lr, lr 32; CHECK-8M-NEXT: vmov d5, lr, lr 33; CHECK-8M-NEXT: vmov d6, lr, lr 34; CHECK-8M-NEXT: vmov d7, lr, lr 35; CHECK-8M-NEXT: bic r12, r12, #159 36; CHECK-8M-NEXT: bic r12, r12, #4026531840 37; CHECK-8M-NEXT: vmsr fpscr, r12 38; CHECK-8M-NEXT: .LBB0_2: @ %entry 39; CHECK-8M-NEXT: mov r0, lr 40; CHECK-8M-NEXT: mov r1, lr 41; CHECK-8M-NEXT: mov r2, lr 42; CHECK-8M-NEXT: mov r3, lr 43; CHECK-8M-NEXT: mov r12, lr 44; CHECK-8M-NEXT: msr apsr_nzcvqg, lr 45; CHECK-8M-NEXT: bxns lr 46; 47; CHECK-81M-LABEL: f1: 48; CHECK-81M: @ %bb.0: @ %entry 49; CHECK-81M-NEXT: vstr fpcxtns, [sp, #-4]! 50; CHECK-81M-NEXT: push {r7, lr} 51; CHECK-81M-NEXT: sub sp, #4 52; CHECK-81M-NEXT: vmov.f32 s0, #1.000000e+01 53; CHECK-81M-NEXT: blx r0 54; CHECK-81M-NEXT: add sp, #4 55; CHECK-81M-NEXT: pop.w {r7, lr} 56; CHECK-81M-NEXT: vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 57; CHECK-81M-NEXT: vldr fpcxtns, [sp], #4 58; CHECK-81M-NEXT: clrm {r0, r1, r2, r3, r12, apsr} 59; CHECK-81M-NEXT: bxns lr 60entry: 61 %call = call float %fptr(float 10.0) #1 62 ret float %call 63} 64 65attributes #0 = { "cmse_nonsecure_entry" nounwind } 66attributes #1 = { nounwind } 67 68define double @d1(ptr nocapture %fptr) #0 { 69; CHECK-8M-LE-LABEL: d1: 70; CHECK-8M-LE: @ %bb.0: @ %entry 71; CHECK-8M-LE-NEXT: push {r7, lr} 72; CHECK-8M-LE-NEXT: vldr d0, .LCPI1_0 73; CHECK-8M-LE-NEXT: blx r0 74; CHECK-8M-LE-NEXT: pop.w {r7, lr} 75; CHECK-8M-LE-NEXT: mrs r12, control 76; CHECK-8M-LE-NEXT: tst.w r12, #8 77; CHECK-8M-LE-NEXT: beq .LBB1_2 78; CHECK-8M-LE-NEXT: @ %bb.1: @ %entry 79; CHECK-8M-LE-NEXT: vmrs r12, fpscr 80; CHECK-8M-LE-NEXT: vmov d1, lr, lr 81; CHECK-8M-LE-NEXT: vmov d2, lr, lr 82; CHECK-8M-LE-NEXT: vmov d3, lr, lr 83; CHECK-8M-LE-NEXT: vmov d4, lr, lr 84; CHECK-8M-LE-NEXT: vmov d5, lr, lr 85; CHECK-8M-LE-NEXT: vmov d6, lr, lr 86; CHECK-8M-LE-NEXT: vmov d7, lr, lr 87; CHECK-8M-LE-NEXT: bic r12, r12, #159 88; CHECK-8M-LE-NEXT: bic r12, r12, #4026531840 89; CHECK-8M-LE-NEXT: vmsr fpscr, r12 90; CHECK-8M-LE-NEXT: .LBB1_2: @ %entry 91; CHECK-8M-LE-NEXT: mov r0, lr 92; CHECK-8M-LE-NEXT: mov r1, lr 93; CHECK-8M-LE-NEXT: mov r2, lr 94; CHECK-8M-LE-NEXT: mov r3, lr 95; CHECK-8M-LE-NEXT: mov r12, lr 96; CHECK-8M-LE-NEXT: msr apsr_nzcvqg, lr 97; CHECK-8M-LE-NEXT: bxns lr 98; CHECK-8M-LE-NEXT: .p2align 3 99; CHECK-8M-LE-NEXT: @ %bb.3: 100; CHECK-8M-LE-NEXT: .LCPI1_0: 101; CHECK-8M-LE-NEXT: .long 0 @ double 10 102; CHECK-8M-LE-NEXT: .long 1076101120 103; 104; CHECK-8M-BE-LABEL: d1: 105; CHECK-8M-BE: @ %bb.0: @ %entry 106; CHECK-8M-BE-NEXT: push {r7, lr} 107; CHECK-8M-BE-NEXT: vldr d0, .LCPI1_0 108; CHECK-8M-BE-NEXT: blx r0 109; CHECK-8M-BE-NEXT: pop.w {r7, lr} 110; CHECK-8M-BE-NEXT: mrs r12, control 111; CHECK-8M-BE-NEXT: tst.w r12, #8 112; CHECK-8M-BE-NEXT: beq .LBB1_2 113; CHECK-8M-BE-NEXT: @ %bb.1: @ %entry 114; CHECK-8M-BE-NEXT: vmrs r12, fpscr 115; CHECK-8M-BE-NEXT: vmov d1, lr, lr 116; CHECK-8M-BE-NEXT: vmov d2, lr, lr 117; CHECK-8M-BE-NEXT: vmov d3, lr, lr 118; CHECK-8M-BE-NEXT: vmov d4, lr, lr 119; CHECK-8M-BE-NEXT: vmov d5, lr, lr 120; CHECK-8M-BE-NEXT: vmov d6, lr, lr 121; CHECK-8M-BE-NEXT: vmov d7, lr, lr 122; CHECK-8M-BE-NEXT: bic r12, r12, #159 123; CHECK-8M-BE-NEXT: bic r12, r12, #4026531840 124; CHECK-8M-BE-NEXT: vmsr fpscr, r12 125; CHECK-8M-BE-NEXT: .LBB1_2: @ %entry 126; CHECK-8M-BE-NEXT: mov r0, lr 127; CHECK-8M-BE-NEXT: mov r1, lr 128; CHECK-8M-BE-NEXT: mov r2, lr 129; CHECK-8M-BE-NEXT: mov r3, lr 130; CHECK-8M-BE-NEXT: mov r12, lr 131; CHECK-8M-BE-NEXT: msr apsr_nzcvqg, lr 132; CHECK-8M-BE-NEXT: bxns lr 133; CHECK-8M-BE-NEXT: .p2align 3 134; CHECK-8M-BE-NEXT: @ %bb.3: 135; CHECK-8M-BE-NEXT: .LCPI1_0: 136; CHECK-8M-BE-NEXT: .long 1076101120 @ double 10 137; CHECK-8M-BE-NEXT: .long 0 138; 139; CHECK-81M-LE-LABEL: d1: 140; CHECK-81M-LE: @ %bb.0: @ %entry 141; CHECK-81M-LE-NEXT: vstr fpcxtns, [sp, #-4]! 142; CHECK-81M-LE-NEXT: push {r7, lr} 143; CHECK-81M-LE-NEXT: sub sp, #4 144; CHECK-81M-LE-NEXT: vldr d0, .LCPI1_0 145; CHECK-81M-LE-NEXT: blx r0 146; CHECK-81M-LE-NEXT: add sp, #4 147; CHECK-81M-LE-NEXT: pop.w {r7, lr} 148; CHECK-81M-LE-NEXT: vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 149; CHECK-81M-LE-NEXT: vldr fpcxtns, [sp], #4 150; CHECK-81M-LE-NEXT: clrm {r0, r1, r2, r3, r12, apsr} 151; CHECK-81M-LE-NEXT: bxns lr 152; CHECK-81M-LE-NEXT: .p2align 3 153; CHECK-81M-LE-NEXT: @ %bb.1: 154; CHECK-81M-LE-NEXT: .LCPI1_0: 155; CHECK-81M-LE-NEXT: .long 0 @ double 10 156; CHECK-81M-LE-NEXT: .long 1076101120 157; 158; CHECK-81M-BE-LABEL: d1: 159; CHECK-81M-BE: @ %bb.0: @ %entry 160; CHECK-81M-BE-NEXT: vstr fpcxtns, [sp, #-4]! 161; CHECK-81M-BE-NEXT: push {r7, lr} 162; CHECK-81M-BE-NEXT: sub sp, #4 163; CHECK-81M-BE-NEXT: vldr d0, .LCPI1_0 164; CHECK-81M-BE-NEXT: blx r0 165; CHECK-81M-BE-NEXT: add sp, #4 166; CHECK-81M-BE-NEXT: pop.w {r7, lr} 167; CHECK-81M-BE-NEXT: vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 168; CHECK-81M-BE-NEXT: vldr fpcxtns, [sp], #4 169; CHECK-81M-BE-NEXT: clrm {r0, r1, r2, r3, r12, apsr} 170; CHECK-81M-BE-NEXT: bxns lr 171; CHECK-81M-BE-NEXT: .p2align 3 172; CHECK-81M-BE-NEXT: @ %bb.1: 173; CHECK-81M-BE-NEXT: .LCPI1_0: 174; CHECK-81M-BE-NEXT: .long 1076101120 @ double 10 175; CHECK-81M-BE-NEXT: .long 0 176entry: 177 %call = call double %fptr(double 10.0) #1 178 ret double %call 179} 180 181define float @f2(ptr nocapture %fptr) #2 { 182; CHECK-8M-LABEL: f2: 183; CHECK-8M: @ %bb.0: @ %entry 184; CHECK-8M-NEXT: push {r7, lr} 185; CHECK-8M-NEXT: vmov.f32 s0, #1.000000e+01 186; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 187; CHECK-8M-NEXT: bic r0, r0, #1 188; CHECK-8M-NEXT: sub sp, #136 189; CHECK-8M-NEXT: vmov r12, s0 190; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 191; CHECK-8M-NEXT: vmov s0, r12 192; CHECK-8M-NEXT: ldr r1, [sp, #64] 193; CHECK-8M-NEXT: bic r1, r1, #159 194; CHECK-8M-NEXT: bic r1, r1, #4026531840 195; CHECK-8M-NEXT: vmsr fpscr, r1 196; CHECK-8M-NEXT: mov r1, r0 197; CHECK-8M-NEXT: mov r2, r0 198; CHECK-8M-NEXT: mov r3, r0 199; CHECK-8M-NEXT: mov r4, r0 200; CHECK-8M-NEXT: mov r5, r0 201; CHECK-8M-NEXT: mov r6, r0 202; CHECK-8M-NEXT: mov r7, r0 203; CHECK-8M-NEXT: mov r8, r0 204; CHECK-8M-NEXT: mov r9, r0 205; CHECK-8M-NEXT: mov r10, r0 206; CHECK-8M-NEXT: mov r11, r0 207; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 208; CHECK-8M-NEXT: blxns r0 209; CHECK-8M-NEXT: vmov r12, s0 210; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 211; CHECK-8M-NEXT: vmov s0, r12 212; CHECK-8M-NEXT: add sp, #136 213; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 214; CHECK-8M-NEXT: pop {r7, pc} 215; 216; CHECK-81M-LABEL: f2: 217; CHECK-81M: @ %bb.0: @ %entry 218; CHECK-81M-NEXT: push {r7, lr} 219; CHECK-81M-NEXT: vmov.f32 s0, #1.000000e+01 220; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 221; CHECK-81M-NEXT: bic r0, r0, #1 222; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 223; CHECK-81M-NEXT: vscclrm {s1, s2, s3, 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} 224; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 225; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 226; CHECK-81M-NEXT: blxns r0 227; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 228; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 229; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 230; CHECK-81M-NEXT: pop {r7, pc} 231entry: 232 %call = call float %fptr(float 10.0) #3 233 ret float %call 234} 235 236attributes #2 = { nounwind } 237attributes #3 = { "cmse_nonsecure_call" nounwind } 238 239define double @d2(ptr nocapture %fptr) #2 { 240; CHECK-8M-LE-LABEL: d2: 241; CHECK-8M-LE: @ %bb.0: @ %entry 242; CHECK-8M-LE-NEXT: push {r7, lr} 243; CHECK-8M-LE-NEXT: vldr d0, .LCPI3_0 244; CHECK-8M-LE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 245; CHECK-8M-LE-NEXT: bic r0, r0, #1 246; CHECK-8M-LE-NEXT: sub sp, #136 247; CHECK-8M-LE-NEXT: vmov r11, r12, d0 248; CHECK-8M-LE-NEXT: vlstm sp, {d0 - d15} 249; CHECK-8M-LE-NEXT: vmov d0, r11, r12 250; CHECK-8M-LE-NEXT: ldr r1, [sp, #64] 251; CHECK-8M-LE-NEXT: bic r1, r1, #159 252; CHECK-8M-LE-NEXT: bic r1, r1, #4026531840 253; CHECK-8M-LE-NEXT: vmsr fpscr, r1 254; CHECK-8M-LE-NEXT: mov r1, r0 255; CHECK-8M-LE-NEXT: mov r2, r0 256; CHECK-8M-LE-NEXT: mov r3, r0 257; CHECK-8M-LE-NEXT: mov r4, r0 258; CHECK-8M-LE-NEXT: mov r5, r0 259; CHECK-8M-LE-NEXT: mov r6, r0 260; CHECK-8M-LE-NEXT: mov r7, r0 261; CHECK-8M-LE-NEXT: mov r8, r0 262; CHECK-8M-LE-NEXT: mov r9, r0 263; CHECK-8M-LE-NEXT: mov r10, r0 264; CHECK-8M-LE-NEXT: msr apsr_nzcvqg, r0 265; CHECK-8M-LE-NEXT: blxns r0 266; CHECK-8M-LE-NEXT: vmov r11, r12, d0 267; CHECK-8M-LE-NEXT: vlldm sp, {d0 - d15} 268; CHECK-8M-LE-NEXT: vmov d0, r11, r12 269; CHECK-8M-LE-NEXT: add sp, #136 270; CHECK-8M-LE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 271; CHECK-8M-LE-NEXT: pop {r7, pc} 272; CHECK-8M-LE-NEXT: .p2align 3 273; CHECK-8M-LE-NEXT: @ %bb.1: 274; CHECK-8M-LE-NEXT: .LCPI3_0: 275; CHECK-8M-LE-NEXT: .long 0 @ double 10 276; CHECK-8M-LE-NEXT: .long 1076101120 277; 278; CHECK-8M-BE-LABEL: d2: 279; CHECK-8M-BE: @ %bb.0: @ %entry 280; CHECK-8M-BE-NEXT: push {r7, lr} 281; CHECK-8M-BE-NEXT: vldr d0, .LCPI3_0 282; CHECK-8M-BE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 283; CHECK-8M-BE-NEXT: bic r0, r0, #1 284; CHECK-8M-BE-NEXT: sub sp, #136 285; CHECK-8M-BE-NEXT: vmov r11, r12, d0 286; CHECK-8M-BE-NEXT: vlstm sp, {d0 - d15} 287; CHECK-8M-BE-NEXT: vmov d0, r11, r12 288; CHECK-8M-BE-NEXT: ldr r1, [sp, #64] 289; CHECK-8M-BE-NEXT: bic r1, r1, #159 290; CHECK-8M-BE-NEXT: bic r1, r1, #4026531840 291; CHECK-8M-BE-NEXT: vmsr fpscr, r1 292; CHECK-8M-BE-NEXT: mov r1, r0 293; CHECK-8M-BE-NEXT: mov r2, r0 294; CHECK-8M-BE-NEXT: mov r3, r0 295; CHECK-8M-BE-NEXT: mov r4, r0 296; CHECK-8M-BE-NEXT: mov r5, r0 297; CHECK-8M-BE-NEXT: mov r6, r0 298; CHECK-8M-BE-NEXT: mov r7, r0 299; CHECK-8M-BE-NEXT: mov r8, r0 300; CHECK-8M-BE-NEXT: mov r9, r0 301; CHECK-8M-BE-NEXT: mov r10, r0 302; CHECK-8M-BE-NEXT: msr apsr_nzcvqg, r0 303; CHECK-8M-BE-NEXT: blxns r0 304; CHECK-8M-BE-NEXT: vmov r11, r12, d0 305; CHECK-8M-BE-NEXT: vlldm sp, {d0 - d15} 306; CHECK-8M-BE-NEXT: vmov d0, r11, r12 307; CHECK-8M-BE-NEXT: add sp, #136 308; CHECK-8M-BE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 309; CHECK-8M-BE-NEXT: pop {r7, pc} 310; CHECK-8M-BE-NEXT: .p2align 3 311; CHECK-8M-BE-NEXT: @ %bb.1: 312; CHECK-8M-BE-NEXT: .LCPI3_0: 313; CHECK-8M-BE-NEXT: .long 1076101120 @ double 10 314; CHECK-8M-BE-NEXT: .long 0 315; 316; CHECK-81M-LE-LABEL: d2: 317; CHECK-81M-LE: @ %bb.0: @ %entry 318; CHECK-81M-LE-NEXT: push {r7, lr} 319; CHECK-81M-LE-NEXT: vldr d0, .LCPI3_0 320; CHECK-81M-LE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 321; CHECK-81M-LE-NEXT: bic r0, r0, #1 322; CHECK-81M-LE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 323; CHECK-81M-LE-NEXT: vscclrm {s2, s3, 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} 324; CHECK-81M-LE-NEXT: vstr fpcxts, [sp, #-8]! 325; CHECK-81M-LE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 326; CHECK-81M-LE-NEXT: blxns r0 327; CHECK-81M-LE-NEXT: vldr fpcxts, [sp], #8 328; CHECK-81M-LE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 329; CHECK-81M-LE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 330; CHECK-81M-LE-NEXT: pop {r7, pc} 331; CHECK-81M-LE-NEXT: .p2align 3 332; CHECK-81M-LE-NEXT: @ %bb.1: 333; CHECK-81M-LE-NEXT: .LCPI3_0: 334; CHECK-81M-LE-NEXT: .long 0 @ double 10 335; CHECK-81M-LE-NEXT: .long 1076101120 336; 337; CHECK-81M-BE-LABEL: d2: 338; CHECK-81M-BE: @ %bb.0: @ %entry 339; CHECK-81M-BE-NEXT: push {r7, lr} 340; CHECK-81M-BE-NEXT: vldr d0, .LCPI3_0 341; CHECK-81M-BE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 342; CHECK-81M-BE-NEXT: bic r0, r0, #1 343; CHECK-81M-BE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 344; CHECK-81M-BE-NEXT: vscclrm {s2, s3, 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} 345; CHECK-81M-BE-NEXT: vstr fpcxts, [sp, #-8]! 346; CHECK-81M-BE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 347; CHECK-81M-BE-NEXT: blxns r0 348; CHECK-81M-BE-NEXT: vldr fpcxts, [sp], #8 349; CHECK-81M-BE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 350; CHECK-81M-BE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 351; CHECK-81M-BE-NEXT: pop {r7, pc} 352; CHECK-81M-BE-NEXT: .p2align 3 353; CHECK-81M-BE-NEXT: @ %bb.1: 354; CHECK-81M-BE-NEXT: .LCPI3_0: 355; CHECK-81M-BE-NEXT: .long 1076101120 @ double 10 356; CHECK-81M-BE-NEXT: .long 0 357entry: 358 %call = call double %fptr(double 10.0) #3 359 ret double %call 360} 361 362define float @f3(ptr nocapture %fptr) #4 { 363; CHECK-8M-LABEL: f3: 364; CHECK-8M: @ %bb.0: @ %entry 365; CHECK-8M-NEXT: push {r7, lr} 366; CHECK-8M-NEXT: vmov.f32 s0, #1.000000e+01 367; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 368; CHECK-8M-NEXT: bic r0, r0, #1 369; CHECK-8M-NEXT: sub sp, #136 370; CHECK-8M-NEXT: vmov r12, s0 371; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 372; CHECK-8M-NEXT: vmov s0, r12 373; CHECK-8M-NEXT: ldr r1, [sp, #64] 374; CHECK-8M-NEXT: bic r1, r1, #159 375; CHECK-8M-NEXT: bic r1, r1, #4026531840 376; CHECK-8M-NEXT: vmsr fpscr, r1 377; CHECK-8M-NEXT: mov r1, r0 378; CHECK-8M-NEXT: mov r2, r0 379; CHECK-8M-NEXT: mov r3, r0 380; CHECK-8M-NEXT: mov r4, r0 381; CHECK-8M-NEXT: mov r5, r0 382; CHECK-8M-NEXT: mov r6, r0 383; CHECK-8M-NEXT: mov r7, r0 384; CHECK-8M-NEXT: mov r8, r0 385; CHECK-8M-NEXT: mov r9, r0 386; CHECK-8M-NEXT: mov r10, r0 387; CHECK-8M-NEXT: mov r11, r0 388; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 389; CHECK-8M-NEXT: blxns r0 390; CHECK-8M-NEXT: vmov r12, s0 391; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 392; CHECK-8M-NEXT: vmov s0, r12 393; CHECK-8M-NEXT: add sp, #136 394; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 395; CHECK-8M-NEXT: pop {r7, pc} 396; 397; CHECK-81M-LABEL: f3: 398; CHECK-81M: @ %bb.0: @ %entry 399; CHECK-81M-NEXT: push {r7, lr} 400; CHECK-81M-NEXT: vmov.f32 s0, #1.000000e+01 401; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 402; CHECK-81M-NEXT: bic r0, r0, #1 403; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 404; CHECK-81M-NEXT: vscclrm {s1, s2, s3, 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} 405; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 406; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 407; CHECK-81M-NEXT: blxns r0 408; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 409; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 410; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 411; CHECK-81M-NEXT: pop {r7, pc} 412entry: 413 %call = tail call float %fptr(float 10.0) #5 414 ret float %call 415} 416 417attributes #4 = { nounwind } 418attributes #5 = { "cmse_nonsecure_call" nounwind } 419 420define double @d3(ptr nocapture %fptr) #4 { 421; CHECK-8M-LE-LABEL: d3: 422; CHECK-8M-LE: @ %bb.0: @ %entry 423; CHECK-8M-LE-NEXT: push {r7, lr} 424; CHECK-8M-LE-NEXT: vldr d0, .LCPI5_0 425; CHECK-8M-LE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 426; CHECK-8M-LE-NEXT: bic r0, r0, #1 427; CHECK-8M-LE-NEXT: sub sp, #136 428; CHECK-8M-LE-NEXT: vmov r11, r12, d0 429; CHECK-8M-LE-NEXT: vlstm sp, {d0 - d15} 430; CHECK-8M-LE-NEXT: vmov d0, r11, r12 431; CHECK-8M-LE-NEXT: ldr r1, [sp, #64] 432; CHECK-8M-LE-NEXT: bic r1, r1, #159 433; CHECK-8M-LE-NEXT: bic r1, r1, #4026531840 434; CHECK-8M-LE-NEXT: vmsr fpscr, r1 435; CHECK-8M-LE-NEXT: mov r1, r0 436; CHECK-8M-LE-NEXT: mov r2, r0 437; CHECK-8M-LE-NEXT: mov r3, r0 438; CHECK-8M-LE-NEXT: mov r4, r0 439; CHECK-8M-LE-NEXT: mov r5, r0 440; CHECK-8M-LE-NEXT: mov r6, r0 441; CHECK-8M-LE-NEXT: mov r7, r0 442; CHECK-8M-LE-NEXT: mov r8, r0 443; CHECK-8M-LE-NEXT: mov r9, r0 444; CHECK-8M-LE-NEXT: mov r10, r0 445; CHECK-8M-LE-NEXT: msr apsr_nzcvqg, r0 446; CHECK-8M-LE-NEXT: blxns r0 447; CHECK-8M-LE-NEXT: vmov r11, r12, d0 448; CHECK-8M-LE-NEXT: vlldm sp, {d0 - d15} 449; CHECK-8M-LE-NEXT: vmov d0, r11, r12 450; CHECK-8M-LE-NEXT: add sp, #136 451; CHECK-8M-LE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 452; CHECK-8M-LE-NEXT: pop {r7, pc} 453; CHECK-8M-LE-NEXT: .p2align 3 454; CHECK-8M-LE-NEXT: @ %bb.1: 455; CHECK-8M-LE-NEXT: .LCPI5_0: 456; CHECK-8M-LE-NEXT: .long 0 @ double 10 457; CHECK-8M-LE-NEXT: .long 1076101120 458; 459; CHECK-8M-BE-LABEL: d3: 460; CHECK-8M-BE: @ %bb.0: @ %entry 461; CHECK-8M-BE-NEXT: push {r7, lr} 462; CHECK-8M-BE-NEXT: vldr d0, .LCPI5_0 463; CHECK-8M-BE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 464; CHECK-8M-BE-NEXT: bic r0, r0, #1 465; CHECK-8M-BE-NEXT: sub sp, #136 466; CHECK-8M-BE-NEXT: vmov r11, r12, d0 467; CHECK-8M-BE-NEXT: vlstm sp, {d0 - d15} 468; CHECK-8M-BE-NEXT: vmov d0, r11, r12 469; CHECK-8M-BE-NEXT: ldr r1, [sp, #64] 470; CHECK-8M-BE-NEXT: bic r1, r1, #159 471; CHECK-8M-BE-NEXT: bic r1, r1, #4026531840 472; CHECK-8M-BE-NEXT: vmsr fpscr, r1 473; CHECK-8M-BE-NEXT: mov r1, r0 474; CHECK-8M-BE-NEXT: mov r2, r0 475; CHECK-8M-BE-NEXT: mov r3, r0 476; CHECK-8M-BE-NEXT: mov r4, r0 477; CHECK-8M-BE-NEXT: mov r5, r0 478; CHECK-8M-BE-NEXT: mov r6, r0 479; CHECK-8M-BE-NEXT: mov r7, r0 480; CHECK-8M-BE-NEXT: mov r8, r0 481; CHECK-8M-BE-NEXT: mov r9, r0 482; CHECK-8M-BE-NEXT: mov r10, r0 483; CHECK-8M-BE-NEXT: msr apsr_nzcvqg, r0 484; CHECK-8M-BE-NEXT: blxns r0 485; CHECK-8M-BE-NEXT: vmov r11, r12, d0 486; CHECK-8M-BE-NEXT: vlldm sp, {d0 - d15} 487; CHECK-8M-BE-NEXT: vmov d0, r11, r12 488; CHECK-8M-BE-NEXT: add sp, #136 489; CHECK-8M-BE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 490; CHECK-8M-BE-NEXT: pop {r7, pc} 491; CHECK-8M-BE-NEXT: .p2align 3 492; CHECK-8M-BE-NEXT: @ %bb.1: 493; CHECK-8M-BE-NEXT: .LCPI5_0: 494; CHECK-8M-BE-NEXT: .long 1076101120 @ double 10 495; CHECK-8M-BE-NEXT: .long 0 496; 497; CHECK-81M-LE-LABEL: d3: 498; CHECK-81M-LE: @ %bb.0: @ %entry 499; CHECK-81M-LE-NEXT: push {r7, lr} 500; CHECK-81M-LE-NEXT: vldr d0, .LCPI5_0 501; CHECK-81M-LE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 502; CHECK-81M-LE-NEXT: bic r0, r0, #1 503; CHECK-81M-LE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 504; CHECK-81M-LE-NEXT: vscclrm {s2, s3, 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} 505; CHECK-81M-LE-NEXT: vstr fpcxts, [sp, #-8]! 506; CHECK-81M-LE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 507; CHECK-81M-LE-NEXT: blxns r0 508; CHECK-81M-LE-NEXT: vldr fpcxts, [sp], #8 509; CHECK-81M-LE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 510; CHECK-81M-LE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 511; CHECK-81M-LE-NEXT: pop {r7, pc} 512; CHECK-81M-LE-NEXT: .p2align 3 513; CHECK-81M-LE-NEXT: @ %bb.1: 514; CHECK-81M-LE-NEXT: .LCPI5_0: 515; CHECK-81M-LE-NEXT: .long 0 @ double 10 516; CHECK-81M-LE-NEXT: .long 1076101120 517; 518; CHECK-81M-BE-LABEL: d3: 519; CHECK-81M-BE: @ %bb.0: @ %entry 520; CHECK-81M-BE-NEXT: push {r7, lr} 521; CHECK-81M-BE-NEXT: vldr d0, .LCPI5_0 522; CHECK-81M-BE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 523; CHECK-81M-BE-NEXT: bic r0, r0, #1 524; CHECK-81M-BE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 525; CHECK-81M-BE-NEXT: vscclrm {s2, s3, 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} 526; CHECK-81M-BE-NEXT: vstr fpcxts, [sp, #-8]! 527; CHECK-81M-BE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 528; CHECK-81M-BE-NEXT: blxns r0 529; CHECK-81M-BE-NEXT: vldr fpcxts, [sp], #8 530; CHECK-81M-BE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 531; CHECK-81M-BE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 532; CHECK-81M-BE-NEXT: pop {r7, pc} 533; CHECK-81M-BE-NEXT: .p2align 3 534; CHECK-81M-BE-NEXT: @ %bb.1: 535; CHECK-81M-BE-NEXT: .LCPI5_0: 536; CHECK-81M-BE-NEXT: .long 1076101120 @ double 10 537; CHECK-81M-BE-NEXT: .long 0 538entry: 539 %call = tail call double %fptr(double 10.0) #5 540 ret double %call 541} 542 543define float @f4(ptr nocapture %fptr) #6 { 544; CHECK-8M-LABEL: f4: 545; CHECK-8M: @ %bb.0: @ %entry 546; CHECK-8M-NEXT: push {r7, lr} 547; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 548; CHECK-8M-NEXT: bic r0, r0, #1 549; CHECK-8M-NEXT: sub sp, #136 550; CHECK-8M-NEXT: vmov.f32 s0, s0 551; CHECK-8M-NEXT: mov r1, r0 552; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 553; CHECK-8M-NEXT: mov r2, r0 554; CHECK-8M-NEXT: mov r3, r0 555; CHECK-8M-NEXT: mov r4, r0 556; CHECK-8M-NEXT: mov r5, r0 557; CHECK-8M-NEXT: mov r6, r0 558; CHECK-8M-NEXT: mov r7, r0 559; CHECK-8M-NEXT: mov r8, r0 560; CHECK-8M-NEXT: mov r9, r0 561; CHECK-8M-NEXT: mov r10, r0 562; CHECK-8M-NEXT: mov r11, r0 563; CHECK-8M-NEXT: mov r12, r0 564; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 565; CHECK-8M-NEXT: blxns r0 566; CHECK-8M-NEXT: vmov r12, s0 567; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 568; CHECK-8M-NEXT: vmov s0, r12 569; CHECK-8M-NEXT: add sp, #136 570; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 571; CHECK-8M-NEXT: pop {r7, pc} 572; 573; CHECK-81M-LABEL: f4: 574; CHECK-81M: @ %bb.0: @ %entry 575; CHECK-81M-NEXT: push {r7, lr} 576; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 577; CHECK-81M-NEXT: bic r0, r0, #1 578; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 579; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, 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} 580; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 581; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 582; CHECK-81M-NEXT: blxns r0 583; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 584; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 585; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 586; CHECK-81M-NEXT: pop {r7, pc} 587entry: 588 %call = call float %fptr() #7 589 ret float %call 590} 591 592attributes #6 = { nounwind } 593attributes #7 = { "cmse_nonsecure_call" nounwind } 594 595define double @d4(ptr nocapture %fptr) #6 { 596; CHECK-8M-LABEL: d4: 597; CHECK-8M: @ %bb.0: @ %entry 598; CHECK-8M-NEXT: push {r7, lr} 599; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 600; CHECK-8M-NEXT: bic r0, r0, #1 601; CHECK-8M-NEXT: sub sp, #136 602; CHECK-8M-NEXT: vmov.f32 s0, s0 603; CHECK-8M-NEXT: mov r1, r0 604; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 605; CHECK-8M-NEXT: mov r2, r0 606; CHECK-8M-NEXT: mov r3, r0 607; CHECK-8M-NEXT: mov r4, r0 608; CHECK-8M-NEXT: mov r5, r0 609; CHECK-8M-NEXT: mov r6, r0 610; CHECK-8M-NEXT: mov r7, r0 611; CHECK-8M-NEXT: mov r8, r0 612; CHECK-8M-NEXT: mov r9, r0 613; CHECK-8M-NEXT: mov r10, r0 614; CHECK-8M-NEXT: mov r11, r0 615; CHECK-8M-NEXT: mov r12, r0 616; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 617; CHECK-8M-NEXT: blxns r0 618; CHECK-8M-NEXT: vmov r11, r12, d0 619; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 620; CHECK-8M-NEXT: vmov d0, r11, r12 621; CHECK-8M-NEXT: add sp, #136 622; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 623; CHECK-8M-NEXT: pop {r7, pc} 624; 625; CHECK-81M-LABEL: d4: 626; CHECK-81M: @ %bb.0: @ %entry 627; CHECK-81M-NEXT: push {r7, lr} 628; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 629; CHECK-81M-NEXT: bic r0, r0, #1 630; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 631; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, 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} 632; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 633; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 634; CHECK-81M-NEXT: blxns r0 635; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 636; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 637; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 638; CHECK-81M-NEXT: pop {r7, pc} 639entry: 640 %call = call double %fptr() #7 641 ret double %call 642} 643 644define void @fd(ptr %f, float %a, double %b) #8 { 645; CHECK-8M-LABEL: fd: 646; CHECK-8M: @ %bb.0: @ %entry 647; CHECK-8M-NEXT: push {r7, lr} 648; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 649; CHECK-8M-NEXT: bic r0, r0, #1 650; CHECK-8M-NEXT: sub sp, #136 651; CHECK-8M-NEXT: vmov r12, s0 652; CHECK-8M-NEXT: mov r2, r0 653; CHECK-8M-NEXT: vmov r10, r11, d1 654; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 655; CHECK-8M-NEXT: vmov s0, r12 656; CHECK-8M-NEXT: vmov d1, r10, r11 657; CHECK-8M-NEXT: ldr r1, [sp, #64] 658; CHECK-8M-NEXT: bic r1, r1, #159 659; CHECK-8M-NEXT: bic r1, r1, #4026531840 660; CHECK-8M-NEXT: vmsr fpscr, r1 661; CHECK-8M-NEXT: mov r1, r0 662; CHECK-8M-NEXT: mov r3, r0 663; CHECK-8M-NEXT: mov r4, r0 664; CHECK-8M-NEXT: mov r5, r0 665; CHECK-8M-NEXT: mov r6, r0 666; CHECK-8M-NEXT: mov r7, r0 667; CHECK-8M-NEXT: mov r8, r0 668; CHECK-8M-NEXT: mov r9, r0 669; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 670; CHECK-8M-NEXT: blxns r0 671; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 672; CHECK-8M-NEXT: add sp, #136 673; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 674; CHECK-8M-NEXT: pop {r7, pc} 675; 676; CHECK-81M-LABEL: fd: 677; CHECK-81M: @ %bb.0: @ %entry 678; CHECK-81M-NEXT: push {r7, lr} 679; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 680; CHECK-81M-NEXT: bic r0, r0, #1 681; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 682; CHECK-81M-NEXT: vscclrm {s1, vpr} 683; CHECK-81M-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} 684; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 685; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 686; CHECK-81M-NEXT: blxns r0 687; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 688; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 689; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 690; CHECK-81M-NEXT: pop {r7, pc} 691entry: 692 call void %f(float %a, double %b) #9 693 ret void 694} 695 696attributes #8 = { nounwind } 697attributes #9 = { "cmse_nonsecure_call" nounwind } 698 699define void @fdff(ptr %f, float %a, double %b, float %c, float %d) #8 { 700; CHECK-8M-LABEL: fdff: 701; CHECK-8M: @ %bb.0: @ %entry 702; CHECK-8M-NEXT: push {r7, lr} 703; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 704; CHECK-8M-NEXT: bic r0, r0, #1 705; CHECK-8M-NEXT: sub sp, #136 706; CHECK-8M-NEXT: vmov r12, s0 707; CHECK-8M-NEXT: mov r2, r0 708; CHECK-8M-NEXT: vmov r10, r11, d1 709; CHECK-8M-NEXT: mov r3, r0 710; CHECK-8M-NEXT: vmov r9, s1 711; CHECK-8M-NEXT: mov r4, r0 712; CHECK-8M-NEXT: vmov r8, s4 713; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 714; CHECK-8M-NEXT: vmov s0, r12 715; CHECK-8M-NEXT: vmov d1, r10, r11 716; CHECK-8M-NEXT: vmov s1, r9 717; CHECK-8M-NEXT: vmov s4, r8 718; CHECK-8M-NEXT: ldr r1, [sp, #64] 719; CHECK-8M-NEXT: bic r1, r1, #159 720; CHECK-8M-NEXT: bic r1, r1, #4026531840 721; CHECK-8M-NEXT: vmsr fpscr, r1 722; CHECK-8M-NEXT: mov r1, r0 723; CHECK-8M-NEXT: mov r5, r0 724; CHECK-8M-NEXT: mov r6, r0 725; CHECK-8M-NEXT: mov r7, r0 726; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 727; CHECK-8M-NEXT: blxns r0 728; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 729; CHECK-8M-NEXT: add sp, #136 730; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 731; CHECK-8M-NEXT: pop {r7, pc} 732; 733; CHECK-81M-LABEL: fdff: 734; CHECK-81M: @ %bb.0: @ %entry 735; CHECK-81M-NEXT: push {r7, lr} 736; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 737; CHECK-81M-NEXT: bic r0, r0, #1 738; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 739; CHECK-81M-NEXT: vscclrm {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} 740; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 741; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 742; CHECK-81M-NEXT: blxns r0 743; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 744; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 745; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 746; CHECK-81M-NEXT: pop {r7, pc} 747entry: 748 call void %f(float %a, double %b, float %c, float %d) #9 749 ret void 750} 751 752define void @fidififid(ptr %fu, float %a, i32 %b, double %c, i32 %d, float %e, i32 %f, float %g, i32 %h, double %i) #8 { 753; CHECK-8M-LABEL: fidififid: 754; CHECK-8M: @ %bb.0: @ %entry 755; CHECK-8M-NEXT: push {r7, lr} 756; CHECK-8M-NEXT: mov lr, r3 757; CHECK-8M-NEXT: mov r12, r0 758; CHECK-8M-NEXT: mov r0, r1 759; CHECK-8M-NEXT: mov r1, r2 760; CHECK-8M-NEXT: ldr r3, [sp, #8] 761; CHECK-8M-NEXT: mov r2, lr 762; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 763; CHECK-8M-NEXT: bic r12, r12, #1 764; CHECK-8M-NEXT: sub sp, #136 765; CHECK-8M-NEXT: vmov r11, s0 766; CHECK-8M-NEXT: vmov r9, r10, d1 767; CHECK-8M-NEXT: vmov r8, s1 768; CHECK-8M-NEXT: vmov r7, s4 769; CHECK-8M-NEXT: vmov r5, r6, d3 770; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 771; CHECK-8M-NEXT: vmov s0, r11 772; CHECK-8M-NEXT: vmov d1, r9, r10 773; CHECK-8M-NEXT: vmov s1, r8 774; CHECK-8M-NEXT: vmov s4, r7 775; CHECK-8M-NEXT: vmov d3, r5, r6 776; CHECK-8M-NEXT: ldr r4, [sp, #64] 777; CHECK-8M-NEXT: bic r4, r4, #159 778; CHECK-8M-NEXT: bic r4, r4, #4026531840 779; CHECK-8M-NEXT: vmsr fpscr, r4 780; CHECK-8M-NEXT: mov r4, r12 781; CHECK-8M-NEXT: msr apsr_nzcvqg, r12 782; CHECK-8M-NEXT: blxns r12 783; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 784; CHECK-8M-NEXT: add sp, #136 785; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 786; CHECK-8M-NEXT: pop {r7, pc} 787; 788; CHECK-81M-LABEL: fidififid: 789; CHECK-81M: @ %bb.0: @ %entry 790; CHECK-81M-NEXT: push {r7, lr} 791; CHECK-81M-NEXT: mov lr, r3 792; CHECK-81M-NEXT: mov r12, r0 793; CHECK-81M-NEXT: mov r0, r1 794; CHECK-81M-NEXT: mov r1, r2 795; CHECK-81M-NEXT: ldr r3, [sp, #8] 796; CHECK-81M-NEXT: mov r2, lr 797; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 798; CHECK-81M-NEXT: bic r12, r12, #1 799; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 800; CHECK-81M-NEXT: vscclrm {s5, vpr} 801; CHECK-81M-NEXT: vscclrm {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} 802; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 803; CHECK-81M-NEXT: clrm {r4, r5, r6, r7, r8, r9, r10, r11, apsr} 804; CHECK-81M-NEXT: blxns r12 805; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 806; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 807; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 808; CHECK-81M-NEXT: pop {r7, pc} 809entry: 810 call void %fu(float %a, i32 %b, double %c, i32 %d, float %e, i32 %f, float %g, i32 %h, double %i) #9 811 ret void 812} 813 814define half @h1(ptr nocapture %hptr) "cmse_nonsecure_entry" nounwind { 815; CHECK-8M-LABEL: h1: 816; CHECK-8M: @ %bb.0: 817; CHECK-8M-NEXT: push {r7, lr} 818; CHECK-8M-NEXT: vldr s0, .LCPI11_0 819; CHECK-8M-NEXT: blx r0 820; CHECK-8M-NEXT: vmov r0, s0 821; CHECK-8M-NEXT: uxth r0, r0 822; CHECK-8M-NEXT: vmov s0, r0 823; CHECK-8M-NEXT: pop.w {r7, lr} 824; CHECK-8M-NEXT: mrs r12, control 825; CHECK-8M-NEXT: tst.w r12, #8 826; CHECK-8M-NEXT: beq .LBB11_2 827; CHECK-8M-NEXT: @ %bb.1: 828; CHECK-8M-NEXT: vmrs r12, fpscr 829; CHECK-8M-NEXT: vmov s1, lr 830; CHECK-8M-NEXT: vmov d1, lr, lr 831; CHECK-8M-NEXT: vmov d2, lr, lr 832; CHECK-8M-NEXT: vmov d3, lr, lr 833; CHECK-8M-NEXT: vmov d4, lr, lr 834; CHECK-8M-NEXT: vmov d5, lr, lr 835; CHECK-8M-NEXT: vmov d6, lr, lr 836; CHECK-8M-NEXT: vmov d7, lr, lr 837; CHECK-8M-NEXT: bic r12, r12, #159 838; CHECK-8M-NEXT: bic r12, r12, #4026531840 839; CHECK-8M-NEXT: vmsr fpscr, r12 840; CHECK-8M-NEXT: .LBB11_2: 841; CHECK-8M-NEXT: mov r0, lr 842; CHECK-8M-NEXT: mov r1, lr 843; CHECK-8M-NEXT: mov r2, lr 844; CHECK-8M-NEXT: mov r3, lr 845; CHECK-8M-NEXT: mov r12, lr 846; CHECK-8M-NEXT: msr apsr_nzcvqg, lr 847; CHECK-8M-NEXT: bxns lr 848; CHECK-8M-NEXT: .p2align 2 849; CHECK-8M-NEXT: @ %bb.3: 850; CHECK-8M-NEXT: .LCPI11_0: 851; CHECK-8M-NEXT: .long 0x00004900 @ float 2.61874657E-41 852; 853; CHECK-NO-MVE-LABEL: h1: 854; CHECK-NO-MVE: @ %bb.0: 855; CHECK-NO-MVE-NEXT: vstr fpcxtns, [sp, #-4]! 856; CHECK-NO-MVE-NEXT: push {r7, lr} 857; CHECK-NO-MVE-NEXT: sub sp, #4 858; CHECK-NO-MVE-NEXT: vldr s0, .LCPI11_0 859; CHECK-NO-MVE-NEXT: blx r0 860; CHECK-NO-MVE-NEXT: vmov r0, s0 861; CHECK-NO-MVE-NEXT: uxth r0, r0 862; CHECK-NO-MVE-NEXT: vmov s0, r0 863; CHECK-NO-MVE-NEXT: add sp, #4 864; CHECK-NO-MVE-NEXT: pop.w {r7, lr} 865; CHECK-NO-MVE-NEXT: vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 866; CHECK-NO-MVE-NEXT: vldr fpcxtns, [sp], #4 867; CHECK-NO-MVE-NEXT: clrm {r0, r1, r2, r3, r12, apsr} 868; CHECK-NO-MVE-NEXT: bxns lr 869; CHECK-NO-MVE-NEXT: .p2align 2 870; CHECK-NO-MVE-NEXT: @ %bb.1: 871; CHECK-NO-MVE-NEXT: .LCPI11_0: 872; CHECK-NO-MVE-NEXT: .long 0x00004900 @ float 2.61874657E-41 873; 874; CHECK-MVE-LABEL: h1: 875; CHECK-MVE: @ %bb.0: 876; CHECK-MVE-NEXT: vstr fpcxtns, [sp, #-4]! 877; CHECK-MVE-NEXT: push {r7, lr} 878; CHECK-MVE-NEXT: sub sp, #4 879; CHECK-MVE-NEXT: vmov.f16 s0, #1.000000e+01 880; CHECK-MVE-NEXT: blx r0 881; CHECK-MVE-NEXT: vmov.f16 r0, s0 882; CHECK-MVE-NEXT: vmov s0, r0 883; CHECK-MVE-NEXT: add sp, #4 884; CHECK-MVE-NEXT: pop.w {r7, lr} 885; CHECK-MVE-NEXT: vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 886; CHECK-MVE-NEXT: vldr fpcxtns, [sp], #4 887; CHECK-MVE-NEXT: clrm {r0, r1, r2, r3, r12, apsr} 888; CHECK-MVE-NEXT: bxns lr 889 %call = call half %hptr(half 10.0) nounwind 890 ret half %call 891} 892 893define half @h2(ptr nocapture %hptr) nounwind { 894; CHECK-8M-LABEL: h2: 895; CHECK-8M: @ %bb.0: @ %entry 896; CHECK-8M-NEXT: push {r7, lr} 897; CHECK-8M-NEXT: vldr s0, .LCPI12_0 898; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 899; CHECK-8M-NEXT: bic r0, r0, #1 900; CHECK-8M-NEXT: sub sp, #136 901; CHECK-8M-NEXT: vmov r12, s0 902; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 903; CHECK-8M-NEXT: vmov s0, r12 904; CHECK-8M-NEXT: ldr r1, [sp, #64] 905; CHECK-8M-NEXT: bic r1, r1, #159 906; CHECK-8M-NEXT: bic r1, r1, #4026531840 907; CHECK-8M-NEXT: vmsr fpscr, r1 908; CHECK-8M-NEXT: mov r1, r0 909; CHECK-8M-NEXT: mov r2, r0 910; CHECK-8M-NEXT: mov r3, r0 911; CHECK-8M-NEXT: mov r4, r0 912; CHECK-8M-NEXT: mov r5, r0 913; CHECK-8M-NEXT: mov r6, r0 914; CHECK-8M-NEXT: mov r7, r0 915; CHECK-8M-NEXT: mov r8, r0 916; CHECK-8M-NEXT: mov r9, r0 917; CHECK-8M-NEXT: mov r10, r0 918; CHECK-8M-NEXT: mov r11, r0 919; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 920; CHECK-8M-NEXT: blxns r0 921; CHECK-8M-NEXT: vmov r12, s0 922; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 923; CHECK-8M-NEXT: vmov s0, r12 924; CHECK-8M-NEXT: add sp, #136 925; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 926; CHECK-8M-NEXT: pop {r7, pc} 927; CHECK-8M-NEXT: .p2align 2 928; CHECK-8M-NEXT: @ %bb.1: 929; CHECK-8M-NEXT: .LCPI12_0: 930; CHECK-8M-NEXT: .long 0x00004900 @ float 2.61874657E-41 931; 932; CHECK-NO-MVE-LABEL: h2: 933; CHECK-NO-MVE: @ %bb.0: @ %entry 934; CHECK-NO-MVE-NEXT: push {r7, lr} 935; CHECK-NO-MVE-NEXT: vldr s0, .LCPI12_0 936; CHECK-NO-MVE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 937; CHECK-NO-MVE-NEXT: bic r0, r0, #1 938; CHECK-NO-MVE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 939; CHECK-NO-MVE-NEXT: vscclrm {s1, s2, s3, 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} 940; CHECK-NO-MVE-NEXT: vstr fpcxts, [sp, #-8]! 941; CHECK-NO-MVE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 942; CHECK-NO-MVE-NEXT: blxns r0 943; CHECK-NO-MVE-NEXT: vldr fpcxts, [sp], #8 944; CHECK-NO-MVE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 945; CHECK-NO-MVE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 946; CHECK-NO-MVE-NEXT: pop {r7, pc} 947; CHECK-NO-MVE-NEXT: .p2align 2 948; CHECK-NO-MVE-NEXT: @ %bb.1: 949; CHECK-NO-MVE-NEXT: .LCPI12_0: 950; CHECK-NO-MVE-NEXT: .long 0x00004900 @ float 2.61874657E-41 951; 952; CHECK-MVE-LABEL: h2: 953; CHECK-MVE: @ %bb.0: @ %entry 954; CHECK-MVE-NEXT: push {r7, lr} 955; CHECK-MVE-NEXT: vmov.f16 s0, #1.000000e+01 956; CHECK-MVE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 957; CHECK-MVE-NEXT: bic r0, r0, #1 958; CHECK-MVE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 959; CHECK-MVE-NEXT: vscclrm {s1, s2, s3, 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} 960; CHECK-MVE-NEXT: vstr fpcxts, [sp, #-8]! 961; CHECK-MVE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 962; CHECK-MVE-NEXT: blxns r0 963; CHECK-MVE-NEXT: vldr fpcxts, [sp], #8 964; CHECK-MVE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 965; CHECK-MVE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 966; CHECK-MVE-NEXT: pop {r7, pc} 967entry: 968 %call = call half %hptr(half 10.0) "cmse_nonsecure_call" nounwind 969 ret half %call 970} 971 972define half @h3(ptr nocapture %hptr) nounwind { 973; CHECK-8M-LABEL: h3: 974; CHECK-8M: @ %bb.0: @ %entry 975; CHECK-8M-NEXT: push {r7, lr} 976; CHECK-8M-NEXT: vldr s0, .LCPI13_0 977; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 978; CHECK-8M-NEXT: bic r0, r0, #1 979; CHECK-8M-NEXT: sub sp, #136 980; CHECK-8M-NEXT: vmov r12, s0 981; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 982; CHECK-8M-NEXT: vmov s0, r12 983; CHECK-8M-NEXT: ldr r1, [sp, #64] 984; CHECK-8M-NEXT: bic r1, r1, #159 985; CHECK-8M-NEXT: bic r1, r1, #4026531840 986; CHECK-8M-NEXT: vmsr fpscr, r1 987; CHECK-8M-NEXT: mov r1, r0 988; CHECK-8M-NEXT: mov r2, r0 989; CHECK-8M-NEXT: mov r3, r0 990; CHECK-8M-NEXT: mov r4, r0 991; CHECK-8M-NEXT: mov r5, r0 992; CHECK-8M-NEXT: mov r6, r0 993; CHECK-8M-NEXT: mov r7, r0 994; CHECK-8M-NEXT: mov r8, r0 995; CHECK-8M-NEXT: mov r9, r0 996; CHECK-8M-NEXT: mov r10, r0 997; CHECK-8M-NEXT: mov r11, r0 998; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 999; CHECK-8M-NEXT: blxns r0 1000; CHECK-8M-NEXT: vmov r12, s0 1001; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 1002; CHECK-8M-NEXT: vmov s0, r12 1003; CHECK-8M-NEXT: add sp, #136 1004; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1005; CHECK-8M-NEXT: pop {r7, pc} 1006; CHECK-8M-NEXT: .p2align 2 1007; CHECK-8M-NEXT: @ %bb.1: 1008; CHECK-8M-NEXT: .LCPI13_0: 1009; CHECK-8M-NEXT: .long 0x00004900 @ float 2.61874657E-41 1010; 1011; CHECK-NO-MVE-LABEL: h3: 1012; CHECK-NO-MVE: @ %bb.0: @ %entry 1013; CHECK-NO-MVE-NEXT: push {r7, lr} 1014; CHECK-NO-MVE-NEXT: vldr s0, .LCPI13_0 1015; CHECK-NO-MVE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1016; CHECK-NO-MVE-NEXT: bic r0, r0, #1 1017; CHECK-NO-MVE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1018; CHECK-NO-MVE-NEXT: vscclrm {s1, s2, s3, 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} 1019; CHECK-NO-MVE-NEXT: vstr fpcxts, [sp, #-8]! 1020; CHECK-NO-MVE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 1021; CHECK-NO-MVE-NEXT: blxns r0 1022; CHECK-NO-MVE-NEXT: vldr fpcxts, [sp], #8 1023; CHECK-NO-MVE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1024; CHECK-NO-MVE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1025; CHECK-NO-MVE-NEXT: pop {r7, pc} 1026; CHECK-NO-MVE-NEXT: .p2align 2 1027; CHECK-NO-MVE-NEXT: @ %bb.1: 1028; CHECK-NO-MVE-NEXT: .LCPI13_0: 1029; CHECK-NO-MVE-NEXT: .long 0x00004900 @ float 2.61874657E-41 1030; 1031; CHECK-MVE-LABEL: h3: 1032; CHECK-MVE: @ %bb.0: @ %entry 1033; CHECK-MVE-NEXT: push {r7, lr} 1034; CHECK-MVE-NEXT: vmov.f16 s0, #1.000000e+01 1035; CHECK-MVE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1036; CHECK-MVE-NEXT: bic r0, r0, #1 1037; CHECK-MVE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1038; CHECK-MVE-NEXT: vscclrm {s1, s2, s3, 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} 1039; CHECK-MVE-NEXT: vstr fpcxts, [sp, #-8]! 1040; CHECK-MVE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 1041; CHECK-MVE-NEXT: blxns r0 1042; CHECK-MVE-NEXT: vldr fpcxts, [sp], #8 1043; CHECK-MVE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1044; CHECK-MVE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1045; CHECK-MVE-NEXT: pop {r7, pc} 1046entry: 1047 %call = tail call half %hptr(half 10.0) "cmse_nonsecure_call" nounwind 1048 ret half %call 1049} 1050 1051define half @h4(ptr nocapture %hptr) nounwind { 1052; CHECK-8M-LABEL: h4: 1053; CHECK-8M: @ %bb.0: @ %entry 1054; CHECK-8M-NEXT: push {r7, lr} 1055; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1056; CHECK-8M-NEXT: bic r0, r0, #1 1057; CHECK-8M-NEXT: sub sp, #136 1058; CHECK-8M-NEXT: vmov.f32 s0, s0 1059; CHECK-8M-NEXT: mov r1, r0 1060; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 1061; CHECK-8M-NEXT: mov r2, r0 1062; CHECK-8M-NEXT: mov r3, r0 1063; CHECK-8M-NEXT: mov r4, r0 1064; CHECK-8M-NEXT: mov r5, r0 1065; CHECK-8M-NEXT: mov r6, r0 1066; CHECK-8M-NEXT: mov r7, r0 1067; CHECK-8M-NEXT: mov r8, r0 1068; CHECK-8M-NEXT: mov r9, r0 1069; CHECK-8M-NEXT: mov r10, r0 1070; CHECK-8M-NEXT: mov r11, r0 1071; CHECK-8M-NEXT: mov r12, r0 1072; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 1073; CHECK-8M-NEXT: blxns r0 1074; CHECK-8M-NEXT: vmov r12, s0 1075; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 1076; CHECK-8M-NEXT: vmov s0, r12 1077; CHECK-8M-NEXT: add sp, #136 1078; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1079; CHECK-8M-NEXT: pop {r7, pc} 1080; 1081; CHECK-81M-LABEL: h4: 1082; CHECK-81M: @ %bb.0: @ %entry 1083; CHECK-81M-NEXT: push {r7, lr} 1084; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1085; CHECK-81M-NEXT: bic r0, r0, #1 1086; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1087; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, 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} 1088; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 1089; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 1090; CHECK-81M-NEXT: blxns r0 1091; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 1092; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1093; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1094; CHECK-81M-NEXT: pop {r7, pc} 1095entry: 1096 %call = call half %hptr() "cmse_nonsecure_call" nounwind 1097 ret half %call 1098} 1099 1100define half @h1_minsize(ptr nocapture %hptr) "cmse_nonsecure_entry" minsize nounwind { 1101; CHECK-8M-LABEL: h1_minsize: 1102; CHECK-8M: @ %bb.0: @ %entry 1103; CHECK-8M-NEXT: push {r7, lr} 1104; CHECK-8M-NEXT: vldr s0, .LCPI15_0 1105; CHECK-8M-NEXT: blx r0 1106; CHECK-8M-NEXT: vmov r0, s0 1107; CHECK-8M-NEXT: uxth r0, r0 1108; CHECK-8M-NEXT: vmov s0, r0 1109; CHECK-8M-NEXT: pop.w {r7, lr} 1110; CHECK-8M-NEXT: vmrs r12, fpscr 1111; CHECK-8M-NEXT: vmov s1, lr 1112; CHECK-8M-NEXT: vmov d1, lr, lr 1113; CHECK-8M-NEXT: mov r0, lr 1114; CHECK-8M-NEXT: vmov d2, lr, lr 1115; CHECK-8M-NEXT: mov r1, lr 1116; CHECK-8M-NEXT: vmov d3, lr, lr 1117; CHECK-8M-NEXT: mov r2, lr 1118; CHECK-8M-NEXT: vmov d4, lr, lr 1119; CHECK-8M-NEXT: mov r3, lr 1120; CHECK-8M-NEXT: vmov d5, lr, lr 1121; CHECK-8M-NEXT: vmov d6, lr, lr 1122; CHECK-8M-NEXT: vmov d7, lr, lr 1123; CHECK-8M-NEXT: bic r12, r12, #159 1124; CHECK-8M-NEXT: bic r12, r12, #4026531840 1125; CHECK-8M-NEXT: vmsr fpscr, r12 1126; CHECK-8M-NEXT: mov r12, lr 1127; CHECK-8M-NEXT: msr apsr_nzcvqg, lr 1128; CHECK-8M-NEXT: bxns lr 1129; CHECK-8M-NEXT: .p2align 2 1130; CHECK-8M-NEXT: @ %bb.1: 1131; CHECK-8M-NEXT: .LCPI15_0: 1132; CHECK-8M-NEXT: .long 0x00004900 @ float 2.61874657E-41 1133; 1134; CHECK-NO-MVE-LABEL: h1_minsize: 1135; CHECK-NO-MVE: @ %bb.0: @ %entry 1136; CHECK-NO-MVE-NEXT: vstr fpcxtns, [sp, #-4]! 1137; CHECK-NO-MVE-NEXT: push {r6, r7, lr} 1138; CHECK-NO-MVE-NEXT: vldr s0, .LCPI15_0 1139; CHECK-NO-MVE-NEXT: blx r0 1140; CHECK-NO-MVE-NEXT: vmov r0, s0 1141; CHECK-NO-MVE-NEXT: uxth r0, r0 1142; CHECK-NO-MVE-NEXT: vmov s0, r0 1143; CHECK-NO-MVE-NEXT: pop.w {r3, r7, lr} 1144; CHECK-NO-MVE-NEXT: vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 1145; CHECK-NO-MVE-NEXT: vldr fpcxtns, [sp], #4 1146; CHECK-NO-MVE-NEXT: clrm {r0, r1, r2, r3, r12, apsr} 1147; CHECK-NO-MVE-NEXT: bxns lr 1148; CHECK-NO-MVE-NEXT: .p2align 2 1149; CHECK-NO-MVE-NEXT: @ %bb.1: 1150; CHECK-NO-MVE-NEXT: .LCPI15_0: 1151; CHECK-NO-MVE-NEXT: .long 0x00004900 @ float 2.61874657E-41 1152; 1153; CHECK-MVE-LABEL: h1_minsize: 1154; CHECK-MVE: @ %bb.0: @ %entry 1155; CHECK-MVE-NEXT: vstr fpcxtns, [sp, #-4]! 1156; CHECK-MVE-NEXT: push {r6, r7, lr} 1157; CHECK-MVE-NEXT: vmov.f16 s0, #1.000000e+01 1158; CHECK-MVE-NEXT: blx r0 1159; CHECK-MVE-NEXT: vmov.f16 r0, s0 1160; CHECK-MVE-NEXT: vmov s0, r0 1161; CHECK-MVE-NEXT: pop.w {r3, r7, lr} 1162; CHECK-MVE-NEXT: vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr} 1163; CHECK-MVE-NEXT: vldr fpcxtns, [sp], #4 1164; CHECK-MVE-NEXT: clrm {r0, r1, r2, r3, r12, apsr} 1165; CHECK-MVE-NEXT: bxns lr 1166entry: 1167 %call = call half %hptr(half 10.0) nounwind 1168 ret half %call 1169} 1170 1171define half @h1_arg(ptr nocapture %hptr, half %harg) nounwind { 1172; CHECK-8M-LABEL: h1_arg: 1173; CHECK-8M: @ %bb.0: @ %entry 1174; CHECK-8M-NEXT: push {r7, lr} 1175; CHECK-8M-NEXT: vmov r1, s0 1176; CHECK-8M-NEXT: uxth r1, r1 1177; CHECK-8M-NEXT: vmov s0, r1 1178; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1179; CHECK-8M-NEXT: bic r0, r0, #1 1180; CHECK-8M-NEXT: sub sp, #136 1181; CHECK-8M-NEXT: vmov r12, s0 1182; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 1183; CHECK-8M-NEXT: vmov s0, r12 1184; CHECK-8M-NEXT: ldr r1, [sp, #64] 1185; CHECK-8M-NEXT: bic r1, r1, #159 1186; CHECK-8M-NEXT: bic r1, r1, #4026531840 1187; CHECK-8M-NEXT: vmsr fpscr, r1 1188; CHECK-8M-NEXT: mov r1, r0 1189; CHECK-8M-NEXT: mov r2, r0 1190; CHECK-8M-NEXT: mov r3, r0 1191; CHECK-8M-NEXT: mov r4, r0 1192; CHECK-8M-NEXT: mov r5, r0 1193; CHECK-8M-NEXT: mov r6, r0 1194; CHECK-8M-NEXT: mov r7, r0 1195; CHECK-8M-NEXT: mov r8, r0 1196; CHECK-8M-NEXT: mov r9, r0 1197; CHECK-8M-NEXT: mov r10, r0 1198; CHECK-8M-NEXT: mov r11, r0 1199; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 1200; CHECK-8M-NEXT: blxns r0 1201; CHECK-8M-NEXT: vmov r12, s0 1202; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 1203; CHECK-8M-NEXT: vmov s0, r12 1204; CHECK-8M-NEXT: add sp, #136 1205; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1206; CHECK-8M-NEXT: pop {r7, pc} 1207; 1208; CHECK-NO-MVE-LABEL: h1_arg: 1209; CHECK-NO-MVE: @ %bb.0: @ %entry 1210; CHECK-NO-MVE-NEXT: push {r7, lr} 1211; CHECK-NO-MVE-NEXT: vmov r1, s0 1212; CHECK-NO-MVE-NEXT: uxth r1, r1 1213; CHECK-NO-MVE-NEXT: vmov s0, r1 1214; CHECK-NO-MVE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1215; CHECK-NO-MVE-NEXT: bic r0, r0, #1 1216; CHECK-NO-MVE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1217; CHECK-NO-MVE-NEXT: vscclrm {s1, s2, s3, 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} 1218; CHECK-NO-MVE-NEXT: vstr fpcxts, [sp, #-8]! 1219; CHECK-NO-MVE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 1220; CHECK-NO-MVE-NEXT: blxns r0 1221; CHECK-NO-MVE-NEXT: vldr fpcxts, [sp], #8 1222; CHECK-NO-MVE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1223; CHECK-NO-MVE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1224; CHECK-NO-MVE-NEXT: pop {r7, pc} 1225; 1226; CHECK-MVE-LABEL: h1_arg: 1227; CHECK-MVE: @ %bb.0: @ %entry 1228; CHECK-MVE-NEXT: push {r7, lr} 1229; CHECK-MVE-NEXT: vmov.f16 r1, s0 1230; CHECK-MVE-NEXT: vmov s0, r1 1231; CHECK-MVE-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1232; CHECK-MVE-NEXT: bic r0, r0, #1 1233; CHECK-MVE-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1234; CHECK-MVE-NEXT: vscclrm {s1, s2, s3, 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} 1235; CHECK-MVE-NEXT: vstr fpcxts, [sp, #-8]! 1236; CHECK-MVE-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 1237; CHECK-MVE-NEXT: blxns r0 1238; CHECK-MVE-NEXT: vldr fpcxts, [sp], #8 1239; CHECK-MVE-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1240; CHECK-MVE-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1241; CHECK-MVE-NEXT: pop {r7, pc} 1242entry: 1243 %call = call half %hptr(half %harg) "cmse_nonsecure_call" nounwind 1244 ret half %call 1245} 1246 1247define float @float_return_undef_arg(ptr nocapture %fptr) #6 { 1248; CHECK-8M-LABEL: float_return_undef_arg: 1249; CHECK-8M: @ %bb.0: @ %entry 1250; CHECK-8M-NEXT: push {r7, lr} 1251; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1252; CHECK-8M-NEXT: bic r0, r0, #1 1253; CHECK-8M-NEXT: sub sp, #136 1254; CHECK-8M-NEXT: vmov.f32 s0, s0 1255; CHECK-8M-NEXT: mov r1, r0 1256; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 1257; CHECK-8M-NEXT: mov r2, r0 1258; CHECK-8M-NEXT: mov r3, r0 1259; CHECK-8M-NEXT: mov r4, r0 1260; CHECK-8M-NEXT: mov r5, r0 1261; CHECK-8M-NEXT: mov r6, r0 1262; CHECK-8M-NEXT: mov r7, r0 1263; CHECK-8M-NEXT: mov r8, r0 1264; CHECK-8M-NEXT: mov r9, r0 1265; CHECK-8M-NEXT: mov r10, r0 1266; CHECK-8M-NEXT: mov r11, r0 1267; CHECK-8M-NEXT: mov r12, r0 1268; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 1269; CHECK-8M-NEXT: blxns r0 1270; CHECK-8M-NEXT: vmov r12, s0 1271; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 1272; CHECK-8M-NEXT: vmov s0, r12 1273; CHECK-8M-NEXT: add sp, #136 1274; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1275; CHECK-8M-NEXT: pop {r7, pc} 1276; 1277; CHECK-81M-LABEL: float_return_undef_arg: 1278; CHECK-81M: @ %bb.0: @ %entry 1279; CHECK-81M-NEXT: push {r7, lr} 1280; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1281; CHECK-81M-NEXT: bic r0, r0, #1 1282; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1283; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, 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} 1284; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 1285; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 1286; CHECK-81M-NEXT: blxns r0 1287; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 1288; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1289; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1290; CHECK-81M-NEXT: pop {r7, pc} 1291entry: 1292 %call = call float %fptr(i32 undef) #7 1293 ret float %call 1294} 1295 1296define float @float_return_poison_arg(ptr nocapture %fptr) #6 { 1297; CHECK-8M-LABEL: float_return_poison_arg: 1298; CHECK-8M: @ %bb.0: @ %entry 1299; CHECK-8M-NEXT: push {r7, lr} 1300; CHECK-8M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1301; CHECK-8M-NEXT: bic r0, r0, #1 1302; CHECK-8M-NEXT: sub sp, #136 1303; CHECK-8M-NEXT: vmov.f32 s0, s0 1304; CHECK-8M-NEXT: mov r1, r0 1305; CHECK-8M-NEXT: vlstm sp, {d0 - d15} 1306; CHECK-8M-NEXT: mov r2, r0 1307; CHECK-8M-NEXT: mov r3, r0 1308; CHECK-8M-NEXT: mov r4, r0 1309; CHECK-8M-NEXT: mov r5, r0 1310; CHECK-8M-NEXT: mov r6, r0 1311; CHECK-8M-NEXT: mov r7, r0 1312; CHECK-8M-NEXT: mov r8, r0 1313; CHECK-8M-NEXT: mov r9, r0 1314; CHECK-8M-NEXT: mov r10, r0 1315; CHECK-8M-NEXT: mov r11, r0 1316; CHECK-8M-NEXT: mov r12, r0 1317; CHECK-8M-NEXT: msr apsr_nzcvqg, r0 1318; CHECK-8M-NEXT: blxns r0 1319; CHECK-8M-NEXT: vmov r12, s0 1320; CHECK-8M-NEXT: vlldm sp, {d0 - d15} 1321; CHECK-8M-NEXT: vmov s0, r12 1322; CHECK-8M-NEXT: add sp, #136 1323; CHECK-8M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1324; CHECK-8M-NEXT: pop {r7, pc} 1325; 1326; CHECK-81M-LABEL: float_return_poison_arg: 1327; CHECK-81M: @ %bb.0: @ %entry 1328; CHECK-81M-NEXT: push {r7, lr} 1329; CHECK-81M-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, r11} 1330; CHECK-81M-NEXT: bic r0, r0, #1 1331; CHECK-81M-NEXT: vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1332; CHECK-81M-NEXT: vscclrm {s0, s1, s2, s3, 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} 1333; CHECK-81M-NEXT: vstr fpcxts, [sp, #-8]! 1334; CHECK-81M-NEXT: clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr} 1335; CHECK-81M-NEXT: blxns r0 1336; CHECK-81M-NEXT: vldr fpcxts, [sp], #8 1337; CHECK-81M-NEXT: vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31} 1338; CHECK-81M-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, r11} 1339; CHECK-81M-NEXT: pop {r7, pc} 1340entry: 1341 %call = call float %fptr(i32 poison) #7 1342 ret float %call 1343} 1344