515 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -fast-isel=true -aarch64-streaming-hazard-size=0 -global-isel=false -fast-isel-abort=0 -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 < %s \3; RUN: | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-FISEL4; RUN: llc -fast-isel=false -aarch64-streaming-hazard-size=0 -global-isel=true -global-isel-abort=0 -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 < %s \5; RUN: | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-GISEL6 7 8declare double @streaming_callee(double) "aarch64_pstate_sm_enabled"9declare double @normal_callee(double)10 11define double @nonstreaming_caller_streaming_callee(double %x) nounwind noinline optnone {12; CHECK-FISEL-LABEL: nonstreaming_caller_streaming_callee:13; CHECK-FISEL: // %bb.0: // %entry14; CHECK-FISEL-NEXT: sub sp, sp, #9615; CHECK-FISEL-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill16; CHECK-FISEL-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill17; CHECK-FISEL-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill18; CHECK-FISEL-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill19; CHECK-FISEL-NEXT: str x30, [sp, #80] // 8-byte Spill20; CHECK-FISEL-NEXT: str d0, [sp] // 8-byte Spill21; CHECK-FISEL-NEXT: smstart sm22; CHECK-FISEL-NEXT: ldr d0, [sp] // 8-byte Reload23; CHECK-FISEL-NEXT: bl streaming_callee24; CHECK-FISEL-NEXT: str d0, [sp, #8] // 8-byte Spill25; CHECK-FISEL-NEXT: smstop sm26; CHECK-FISEL-NEXT: ldr d1, [sp, #8] // 8-byte Reload27; CHECK-FISEL-NEXT: adrp x8, .LCPI0_028; CHECK-FISEL-NEXT: ldr d0, [x8, :lo12:.LCPI0_0]29; CHECK-FISEL-NEXT: fadd d0, d1, d030; CHECK-FISEL-NEXT: ldr x30, [sp, #80] // 8-byte Reload31; CHECK-FISEL-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload32; CHECK-FISEL-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload33; CHECK-FISEL-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload34; CHECK-FISEL-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload35; CHECK-FISEL-NEXT: add sp, sp, #9636; CHECK-FISEL-NEXT: ret37;38; CHECK-GISEL-LABEL: nonstreaming_caller_streaming_callee:39; CHECK-GISEL: // %bb.0: // %entry40; CHECK-GISEL-NEXT: sub sp, sp, #9641; CHECK-GISEL-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill42; CHECK-GISEL-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill43; CHECK-GISEL-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill44; CHECK-GISEL-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill45; CHECK-GISEL-NEXT: str x30, [sp, #80] // 8-byte Spill46; CHECK-GISEL-NEXT: str d0, [sp] // 8-byte Spill47; CHECK-GISEL-NEXT: smstart sm48; CHECK-GISEL-NEXT: ldr d0, [sp] // 8-byte Reload49; CHECK-GISEL-NEXT: bl streaming_callee50; CHECK-GISEL-NEXT: str d0, [sp, #8] // 8-byte Spill51; CHECK-GISEL-NEXT: smstop sm52; CHECK-GISEL-NEXT: ldr d1, [sp, #8] // 8-byte Reload53; CHECK-GISEL-NEXT: mov x8, #4631107791820423168 // =0x404500000000000054; CHECK-GISEL-NEXT: fmov d0, x855; CHECK-GISEL-NEXT: fadd d0, d1, d056; CHECK-GISEL-NEXT: ldr x30, [sp, #80] // 8-byte Reload57; CHECK-GISEL-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload58; CHECK-GISEL-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload59; CHECK-GISEL-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload60; CHECK-GISEL-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload61; CHECK-GISEL-NEXT: add sp, sp, #9662; CHECK-GISEL-NEXT: ret63entry:64 %call = call double @streaming_callee(double %x) "aarch64_pstate_sm_enabled"65 %add = fadd double %call, 4.200000e+0166 ret double %add67}68 69 70define double @streaming_caller_nonstreaming_callee(double %x) nounwind noinline optnone "aarch64_pstate_sm_enabled" {71; CHECK-COMMON-LABEL: streaming_caller_nonstreaming_callee:72; CHECK-COMMON: // %bb.0: // %entry73; CHECK-COMMON-NEXT: sub sp, sp, #9674; CHECK-COMMON-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill75; CHECK-COMMON-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill76; CHECK-COMMON-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill77; CHECK-COMMON-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill78; CHECK-COMMON-NEXT: str x30, [sp, #80] // 8-byte Spill79; CHECK-COMMON-NEXT: str d0, [sp] // 8-byte Spill80; CHECK-COMMON-NEXT: smstop sm81; CHECK-COMMON-NEXT: ldr d0, [sp] // 8-byte Reload82; CHECK-COMMON-NEXT: bl normal_callee83; CHECK-COMMON-NEXT: str d0, [sp, #8] // 8-byte Spill84; CHECK-COMMON-NEXT: smstart sm85; CHECK-COMMON-NEXT: ldr d1, [sp, #8] // 8-byte Reload86; CHECK-COMMON-NEXT: mov x8, #4631107791820423168 // =0x404500000000000087; CHECK-COMMON-NEXT: fmov d0, x888; CHECK-COMMON-NEXT: fadd d0, d1, d089; CHECK-COMMON-NEXT: ldr x30, [sp, #80] // 8-byte Reload90; CHECK-COMMON-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload91; CHECK-COMMON-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload92; CHECK-COMMON-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload93; CHECK-COMMON-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload94; CHECK-COMMON-NEXT: add sp, sp, #9695; CHECK-COMMON-NEXT: ret96entry:97 %call = call double @normal_callee(double %x)98 %add = fadd double %call, 4.200000e+0199 ret double %add100}101 102define double @locally_streaming_caller_normal_callee(double %x) nounwind noinline optnone "aarch64_pstate_sm_body" {103; CHECK-COMMON-LABEL: locally_streaming_caller_normal_callee:104; CHECK-COMMON: // %bb.0:105; CHECK-COMMON-NEXT: sub sp, sp, #112106; CHECK-COMMON-NEXT: stp d15, d14, [sp, #32] // 16-byte Folded Spill107; CHECK-COMMON-NEXT: stp d13, d12, [sp, #48] // 16-byte Folded Spill108; CHECK-COMMON-NEXT: stp d11, d10, [sp, #64] // 16-byte Folded Spill109; CHECK-COMMON-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill110; CHECK-COMMON-NEXT: str x30, [sp, #96] // 8-byte Spill111; CHECK-COMMON-NEXT: str d0, [sp, #24] // 8-byte Spill112; CHECK-COMMON-NEXT: smstart sm113; CHECK-COMMON-NEXT: ldr d0, [sp, #24] // 8-byte Reload114; CHECK-COMMON-NEXT: str d0, [sp, #24] // 8-byte Spill115; CHECK-COMMON-NEXT: smstop sm116; CHECK-COMMON-NEXT: ldr d0, [sp, #24] // 8-byte Reload117; CHECK-COMMON-NEXT: bl normal_callee118; CHECK-COMMON-NEXT: str d0, [sp, #16] // 8-byte Spill119; CHECK-COMMON-NEXT: smstart sm120; CHECK-COMMON-NEXT: ldr d1, [sp, #16] // 8-byte Reload121; CHECK-COMMON-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000122; CHECK-COMMON-NEXT: fmov d0, x8123; CHECK-COMMON-NEXT: fadd d0, d1, d0124; CHECK-COMMON-NEXT: str d0, [sp, #8] // 8-byte Spill125; CHECK-COMMON-NEXT: smstop sm126; CHECK-COMMON-NEXT: ldr d0, [sp, #8] // 8-byte Reload127; CHECK-COMMON-NEXT: ldr x30, [sp, #96] // 8-byte Reload128; CHECK-COMMON-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload129; CHECK-COMMON-NEXT: ldp d11, d10, [sp, #64] // 16-byte Folded Reload130; CHECK-COMMON-NEXT: ldp d13, d12, [sp, #48] // 16-byte Folded Reload131; CHECK-COMMON-NEXT: ldp d15, d14, [sp, #32] // 16-byte Folded Reload132; CHECK-COMMON-NEXT: add sp, sp, #112133; CHECK-COMMON-NEXT: ret134 %call = call double @normal_callee(double %x);135 %add = fadd double %call, 4.200000e+01136 ret double %add;137}138 139define double @normal_caller_to_locally_streaming_callee(double %x) nounwind noinline optnone {140; CHECK-FISEL-LABEL: normal_caller_to_locally_streaming_callee:141; CHECK-FISEL: // %bb.0:142; CHECK-FISEL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill143; CHECK-FISEL-NEXT: bl locally_streaming_caller_normal_callee144; CHECK-FISEL-NEXT: adrp x8, .LCPI3_0145; CHECK-FISEL-NEXT: ldr d1, [x8, :lo12:.LCPI3_0]146; CHECK-FISEL-NEXT: fadd d0, d0, d1147; CHECK-FISEL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload148; CHECK-FISEL-NEXT: ret149;150; CHECK-GISEL-LABEL: normal_caller_to_locally_streaming_callee:151; CHECK-GISEL: // %bb.0:152; CHECK-GISEL-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill153; CHECK-GISEL-NEXT: bl locally_streaming_caller_normal_callee154; CHECK-GISEL-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000155; CHECK-GISEL-NEXT: fmov d1, x8156; CHECK-GISEL-NEXT: fadd d0, d0, d1157; CHECK-GISEL-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload158; CHECK-GISEL-NEXT: ret159 %call = call double @locally_streaming_caller_normal_callee(double %x) "aarch64_pstate_sm_body";160 %add = fadd double %call, 4.200000e+01161 ret double %add;162}163 164; Check attribute in the call itself165 166define void @locally_streaming_caller_streaming_callee_ptr(ptr %p) nounwind noinline optnone "aarch64_pstate_sm_body" {167; CHECK-COMMON-LABEL: locally_streaming_caller_streaming_callee_ptr:168; CHECK-COMMON: // %bb.0:169; CHECK-COMMON-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill170; CHECK-COMMON-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill171; CHECK-COMMON-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill172; CHECK-COMMON-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill173; CHECK-COMMON-NEXT: str x30, [sp, #64] // 8-byte Spill174; CHECK-COMMON-NEXT: smstart sm175; CHECK-COMMON-NEXT: blr x0176; CHECK-COMMON-NEXT: smstop sm177; CHECK-COMMON-NEXT: ldr x30, [sp, #64] // 8-byte Reload178; CHECK-COMMON-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload179; CHECK-COMMON-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload180; CHECK-COMMON-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload181; CHECK-COMMON-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload182; CHECK-COMMON-NEXT: ret183 call void %p() "aarch64_pstate_sm_enabled"184 ret void185}186 187define void @normal_call_to_streaming_callee_ptr(ptr %p) nounwind noinline optnone {188; CHECK-COMMON-LABEL: normal_call_to_streaming_callee_ptr:189; CHECK-COMMON: // %bb.0:190; CHECK-COMMON-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill191; CHECK-COMMON-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill192; CHECK-COMMON-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill193; CHECK-COMMON-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill194; CHECK-COMMON-NEXT: str x30, [sp, #64] // 8-byte Spill195; CHECK-COMMON-NEXT: smstart sm196; CHECK-COMMON-NEXT: blr x0197; CHECK-COMMON-NEXT: smstop sm198; CHECK-COMMON-NEXT: ldr x30, [sp, #64] // 8-byte Reload199; CHECK-COMMON-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload200; CHECK-COMMON-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload201; CHECK-COMMON-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload202; CHECK-COMMON-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload203; CHECK-COMMON-NEXT: ret204 call void %p() "aarch64_pstate_sm_enabled"205 ret void206}207 208;209; Check ZA state210;211 212declare double @za_shared_callee(double) "aarch64_inout_za"213 214define double @za_new_caller_to_za_shared_callee(double %x) nounwind noinline optnone "aarch64_new_za"{215; CHECK-COMMON-LABEL: za_new_caller_to_za_shared_callee:216; CHECK-COMMON: // %bb.0: // %prelude217; CHECK-COMMON-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill218; CHECK-COMMON-NEXT: rdsvl x8, #1219; CHECK-COMMON-NEXT: mrs x8, TPIDR2_EL0220; CHECK-COMMON-NEXT: cbz x8, .LBB6_2221; CHECK-COMMON-NEXT: b .LBB6_1222; CHECK-COMMON-NEXT: .LBB6_1: // %save.za223; CHECK-COMMON-NEXT: bl __arm_tpidr2_save224; CHECK-COMMON-NEXT: msr TPIDR2_EL0, xzr225; CHECK-COMMON-NEXT: b .LBB6_2226; CHECK-COMMON-NEXT: .LBB6_2: // %entry227; CHECK-COMMON-NEXT: smstart za228; CHECK-COMMON-NEXT: zero {za}229; CHECK-COMMON-NEXT: bl za_shared_callee230; CHECK-COMMON-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000231; CHECK-COMMON-NEXT: fmov d1, x8232; CHECK-COMMON-NEXT: fadd d0, d0, d1233; CHECK-COMMON-NEXT: smstop za234; CHECK-COMMON-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload235; CHECK-COMMON-NEXT: ret236entry:237 %call = call double @za_shared_callee(double %x)238 %add = fadd double %call, 4.200000e+01239 ret double %add;240}241 242define double @za_shared_caller_to_za_none_callee(double %x) nounwind noinline optnone "aarch64_inout_za"{243; CHECK-COMMON-LABEL: za_shared_caller_to_za_none_callee:244; CHECK-COMMON: // %bb.0: // %entry245; CHECK-COMMON-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill246; CHECK-COMMON-NEXT: str x19, [sp, #16] // 8-byte Spill247; CHECK-COMMON-NEXT: mov x29, sp248; CHECK-COMMON-NEXT: sub sp, sp, #16249; CHECK-COMMON-NEXT: rdsvl x8, #1250; CHECK-COMMON-NEXT: mov x9, sp251; CHECK-COMMON-NEXT: msub x9, x8, x8, x9252; CHECK-COMMON-NEXT: mov sp, x9253; CHECK-COMMON-NEXT: stp x9, x8, [x29, #-16]254; CHECK-COMMON-NEXT: sub x8, x29, #16255; CHECK-COMMON-NEXT: msr TPIDR2_EL0, x8256; CHECK-COMMON-NEXT: bl normal_callee257; CHECK-COMMON-NEXT: smstart za258; CHECK-COMMON-NEXT: mrs x8, TPIDR2_EL0259; CHECK-COMMON-NEXT: sub x0, x29, #16260; CHECK-COMMON-NEXT: cbz x8, .LBB7_1261; CHECK-COMMON-NEXT: b .LBB7_2262; CHECK-COMMON-NEXT: .LBB7_1: // %entry263; CHECK-COMMON-NEXT: bl __arm_tpidr2_restore264; CHECK-COMMON-NEXT: b .LBB7_2265; CHECK-COMMON-NEXT: .LBB7_2: // %entry266; CHECK-COMMON-NEXT: msr TPIDR2_EL0, xzr267; CHECK-COMMON-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000268; CHECK-COMMON-NEXT: fmov d1, x8269; CHECK-COMMON-NEXT: fadd d0, d0, d1270; CHECK-COMMON-NEXT: mov sp, x29271; CHECK-COMMON-NEXT: ldr x19, [sp, #16] // 8-byte Reload272; CHECK-COMMON-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload273; CHECK-COMMON-NEXT: ret274entry:275 %call = call double @normal_callee(double %x)276 %add = fadd double %call, 4.200000e+01277 ret double %add;278}279 280; Ensure we set up and restore the lazy save correctly for instructions which are lowered to lib calls.281define fp128 @f128_call_za(fp128 %a, fp128 %b) "aarch64_inout_za" nounwind {282; CHECK-COMMON-LABEL: f128_call_za:283; CHECK-COMMON: // %bb.0:284; CHECK-COMMON-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill285; CHECK-COMMON-NEXT: str x19, [sp, #16] // 8-byte Spill286; CHECK-COMMON-NEXT: mov x29, sp287; CHECK-COMMON-NEXT: sub sp, sp, #16288; CHECK-COMMON-NEXT: rdsvl x8, #1289; CHECK-COMMON-NEXT: mov x9, sp290; CHECK-COMMON-NEXT: msub x9, x8, x8, x9291; CHECK-COMMON-NEXT: mov sp, x9292; CHECK-COMMON-NEXT: sub x10, x29, #16293; CHECK-COMMON-NEXT: stp x9, x8, [x29, #-16]294; CHECK-COMMON-NEXT: msr TPIDR2_EL0, x10295; CHECK-COMMON-NEXT: bl __addtf3296; CHECK-COMMON-NEXT: smstart za297; CHECK-COMMON-NEXT: mrs x8, TPIDR2_EL0298; CHECK-COMMON-NEXT: sub x0, x29, #16299; CHECK-COMMON-NEXT: cbnz x8, .LBB8_2300; CHECK-COMMON-NEXT: // %bb.1:301; CHECK-COMMON-NEXT: bl __arm_tpidr2_restore302; CHECK-COMMON-NEXT: .LBB8_2:303; CHECK-COMMON-NEXT: msr TPIDR2_EL0, xzr304; CHECK-COMMON-NEXT: mov sp, x29305; CHECK-COMMON-NEXT: ldr x19, [sp, #16] // 8-byte Reload306; CHECK-COMMON-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload307; CHECK-COMMON-NEXT: ret308 %res = fadd fp128 %a, %b309 ret fp128 %res310}311 312 313; Ensure we fall back to SelectionDAG isel here so that we temporarily disable streaming mode to lower the fadd (with function calls).314define fp128 @f128_call_sm(fp128 %a, fp128 %b) "aarch64_pstate_sm_enabled" nounwind {315; CHECK-COMMON-LABEL: f128_call_sm:316; CHECK-COMMON: // %bb.0:317; CHECK-COMMON-NEXT: sub sp, sp, #112318; CHECK-COMMON-NEXT: stp d15, d14, [sp, #32] // 16-byte Folded Spill319; CHECK-COMMON-NEXT: stp d13, d12, [sp, #48] // 16-byte Folded Spill320; CHECK-COMMON-NEXT: stp d11, d10, [sp, #64] // 16-byte Folded Spill321; CHECK-COMMON-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill322; CHECK-COMMON-NEXT: str x30, [sp, #96] // 8-byte Spill323; CHECK-COMMON-NEXT: stp q0, q1, [sp] // 32-byte Folded Spill324; CHECK-COMMON-NEXT: smstop sm325; CHECK-COMMON-NEXT: ldp q0, q1, [sp] // 32-byte Folded Reload326; CHECK-COMMON-NEXT: bl __addtf3327; CHECK-COMMON-NEXT: str q0, [sp, #16] // 16-byte Spill328; CHECK-COMMON-NEXT: smstart sm329; CHECK-COMMON-NEXT: ldp d9, d8, [sp, #80] // 16-byte Folded Reload330; CHECK-COMMON-NEXT: ldr q0, [sp, #16] // 16-byte Reload331; CHECK-COMMON-NEXT: ldp d11, d10, [sp, #64] // 16-byte Folded Reload332; CHECK-COMMON-NEXT: ldr x30, [sp, #96] // 8-byte Reload333; CHECK-COMMON-NEXT: ldp d13, d12, [sp, #48] // 16-byte Folded Reload334; CHECK-COMMON-NEXT: ldp d15, d14, [sp, #32] // 16-byte Folded Reload335; CHECK-COMMON-NEXT: add sp, sp, #112336; CHECK-COMMON-NEXT: ret337 %res = fadd fp128 %a, %b338 ret fp128 %res339}340 341; As above this should use Selection DAG to make sure the libcall call is lowered correctly.342define double @frem_call_za(double %a, double %b) "aarch64_inout_za" nounwind {343; CHECK-COMMON-LABEL: frem_call_za:344; CHECK-COMMON: // %bb.0:345; CHECK-COMMON-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill346; CHECK-COMMON-NEXT: str x19, [sp, #16] // 8-byte Spill347; CHECK-COMMON-NEXT: mov x29, sp348; CHECK-COMMON-NEXT: sub sp, sp, #16349; CHECK-COMMON-NEXT: rdsvl x8, #1350; CHECK-COMMON-NEXT: mov x9, sp351; CHECK-COMMON-NEXT: msub x9, x8, x8, x9352; CHECK-COMMON-NEXT: mov sp, x9353; CHECK-COMMON-NEXT: sub x10, x29, #16354; CHECK-COMMON-NEXT: stp x9, x8, [x29, #-16]355; CHECK-COMMON-NEXT: msr TPIDR2_EL0, x10356; CHECK-COMMON-NEXT: bl fmod357; CHECK-COMMON-NEXT: smstart za358; CHECK-COMMON-NEXT: mrs x8, TPIDR2_EL0359; CHECK-COMMON-NEXT: sub x0, x29, #16360; CHECK-COMMON-NEXT: cbnz x8, .LBB10_2361; CHECK-COMMON-NEXT: // %bb.1:362; CHECK-COMMON-NEXT: bl __arm_tpidr2_restore363; CHECK-COMMON-NEXT: .LBB10_2:364; CHECK-COMMON-NEXT: msr TPIDR2_EL0, xzr365; CHECK-COMMON-NEXT: mov sp, x29366; CHECK-COMMON-NEXT: ldr x19, [sp, #16] // 8-byte Reload367; CHECK-COMMON-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload368; CHECK-COMMON-NEXT: ret369 %res = frem double %a, %b370 ret double %res371}372 373; As above this should use Selection DAG to make sure the libcall is lowered correctly.374define float @frem_call_sm(float %a, float %b) "aarch64_pstate_sm_enabled" nounwind {375; CHECK-COMMON-LABEL: frem_call_sm:376; CHECK-COMMON: // %bb.0:377; CHECK-COMMON-NEXT: sub sp, sp, #96378; CHECK-COMMON-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill379; CHECK-COMMON-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill380; CHECK-COMMON-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill381; CHECK-COMMON-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill382; CHECK-COMMON-NEXT: str x30, [sp, #80] // 8-byte Spill383; CHECK-COMMON-NEXT: stp s0, s1, [sp, #8] // 8-byte Folded Spill384; CHECK-COMMON-NEXT: smstop sm385; CHECK-COMMON-NEXT: ldp s0, s1, [sp, #8] // 8-byte Folded Reload386; CHECK-COMMON-NEXT: bl fmodf387; CHECK-COMMON-NEXT: str s0, [sp, #12] // 4-byte Spill388; CHECK-COMMON-NEXT: smstart sm389; CHECK-COMMON-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload390; CHECK-COMMON-NEXT: ldr s0, [sp, #12] // 4-byte Reload391; CHECK-COMMON-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload392; CHECK-COMMON-NEXT: ldr x30, [sp, #80] // 8-byte Reload393; CHECK-COMMON-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload394; CHECK-COMMON-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload395; CHECK-COMMON-NEXT: add sp, sp, #96396; CHECK-COMMON-NEXT: ret397 %res = frem float %a, %b398 ret float %res399}400 401; As above this should use Selection DAG to make sure the libcall is lowered correctly.402define float @frem_call_sm_compat(float %a, float %b) "aarch64_pstate_sm_compatible" nounwind {403; CHECK-COMMON-LABEL: frem_call_sm_compat:404; CHECK-COMMON: // %bb.0:405; CHECK-COMMON-NEXT: sub sp, sp, #96406; CHECK-COMMON-NEXT: stp d15, d14, [sp, #16] // 16-byte Folded Spill407; CHECK-COMMON-NEXT: stp d13, d12, [sp, #32] // 16-byte Folded Spill408; CHECK-COMMON-NEXT: stp d11, d10, [sp, #48] // 16-byte Folded Spill409; CHECK-COMMON-NEXT: stp d9, d8, [sp, #64] // 16-byte Folded Spill410; CHECK-COMMON-NEXT: stp x30, x19, [sp, #80] // 16-byte Folded Spill411; CHECK-COMMON-NEXT: stp s0, s1, [sp, #8] // 8-byte Folded Spill412; CHECK-COMMON-NEXT: mrs x19, SVCR413; CHECK-COMMON-NEXT: tbz w19, #0, .LBB12_2414; CHECK-COMMON-NEXT: // %bb.1:415; CHECK-COMMON-NEXT: smstop sm416; CHECK-COMMON-NEXT: .LBB12_2:417; CHECK-COMMON-NEXT: ldp s0, s1, [sp, #8] // 8-byte Folded Reload418; CHECK-COMMON-NEXT: bl fmodf419; CHECK-COMMON-NEXT: str s0, [sp, #12] // 4-byte Spill420; CHECK-COMMON-NEXT: tbz w19, #0, .LBB12_4421; CHECK-COMMON-NEXT: // %bb.3:422; CHECK-COMMON-NEXT: smstart sm423; CHECK-COMMON-NEXT: .LBB12_4:424; CHECK-COMMON-NEXT: ldp x30, x19, [sp, #80] // 16-byte Folded Reload425; CHECK-COMMON-NEXT: ldr s0, [sp, #12] // 4-byte Reload426; CHECK-COMMON-NEXT: ldp d9, d8, [sp, #64] // 16-byte Folded Reload427; CHECK-COMMON-NEXT: ldp d11, d10, [sp, #48] // 16-byte Folded Reload428; CHECK-COMMON-NEXT: ldp d13, d12, [sp, #32] // 16-byte Folded Reload429; CHECK-COMMON-NEXT: ldp d15, d14, [sp, #16] // 16-byte Folded Reload430; CHECK-COMMON-NEXT: add sp, sp, #96431; CHECK-COMMON-NEXT: ret432 %res = frem float %a, %b433 ret float %res434}435 436;437; Check ZT0 State438;439 440declare double @zt0_shared_callee(double) "aarch64_inout_zt0"441 442define double @zt0_new_caller_to_zt0_shared_callee(double %x) nounwind noinline optnone "aarch64_new_zt0" {443; CHECK-COMMON-LABEL: zt0_new_caller_to_zt0_shared_callee:444; CHECK-COMMON: // %bb.0: // %prelude445; CHECK-COMMON-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill446; CHECK-COMMON-NEXT: mrs x8, TPIDR2_EL0447; CHECK-COMMON-NEXT: cbz x8, .LBB13_2448; CHECK-COMMON-NEXT: b .LBB13_1449; CHECK-COMMON-NEXT: .LBB13_1: // %save.za450; CHECK-COMMON-NEXT: bl __arm_tpidr2_save451; CHECK-COMMON-NEXT: msr TPIDR2_EL0, xzr452; CHECK-COMMON-NEXT: b .LBB13_2453; CHECK-COMMON-NEXT: .LBB13_2: // %entry454; CHECK-COMMON-NEXT: smstart za455; CHECK-COMMON-NEXT: zero { zt0 }456; CHECK-COMMON-NEXT: bl zt0_shared_callee457; CHECK-COMMON-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000458; CHECK-COMMON-NEXT: fmov d1, x8459; CHECK-COMMON-NEXT: fadd d0, d0, d1460; CHECK-COMMON-NEXT: smstop za461; CHECK-COMMON-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload462; CHECK-COMMON-NEXT: ret463entry:464 %call = call double @zt0_shared_callee(double %x)465 %add = fadd double %call, 4.200000e+01466 ret double %add;467}468 469define double @zt0_shared_caller_to_normal_callee(double %x) nounwind noinline optnone "aarch64_inout_zt0" {470; CHECK-COMMON-LABEL: zt0_shared_caller_to_normal_callee:471; CHECK-COMMON: // %bb.0: // %entry472; CHECK-COMMON-NEXT: sub sp, sp, #80473; CHECK-COMMON-NEXT: stp x30, x19, [sp, #64] // 16-byte Folded Spill474; CHECK-COMMON-NEXT: mov x19, sp475; CHECK-COMMON-NEXT: str zt0, [x19]476; CHECK-COMMON-NEXT: smstop za477; CHECK-COMMON-NEXT: bl normal_callee478; CHECK-COMMON-NEXT: smstart za479; CHECK-COMMON-NEXT: ldr zt0, [x19]480; CHECK-COMMON-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000481; CHECK-COMMON-NEXT: fmov d1, x8482; CHECK-COMMON-NEXT: fadd d0, d0, d1483; CHECK-COMMON-NEXT: ldp x30, x19, [sp, #64] // 16-byte Folded Reload484; CHECK-COMMON-NEXT: add sp, sp, #80485; CHECK-COMMON-NEXT: ret486entry:487 %call = call double @normal_callee(double %x)488 %add = fadd double %call, 4.200000e+01489 ret double %add;490}491 492define void @agnostic_za_function(ptr %ptr) nounwind "aarch64_za_state_agnostic" {493; CHECK-COMMON-LABEL: agnostic_za_function:494; CHECK-COMMON: // %bb.0:495; CHECK-COMMON-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill496; CHECK-COMMON-NEXT: stp x20, x19, [sp, #16] // 16-byte Folded Spill497; CHECK-COMMON-NEXT: mov x29, sp498; CHECK-COMMON-NEXT: mov x8, x0499; CHECK-COMMON-NEXT: bl __arm_sme_state_size500; CHECK-COMMON-NEXT: sub sp, sp, x0501; CHECK-COMMON-NEXT: mov x20, sp502; CHECK-COMMON-NEXT: mov x0, x20503; CHECK-COMMON-NEXT: bl __arm_sme_save504; CHECK-COMMON-NEXT: blr x8505; CHECK-COMMON-NEXT: mov x0, x20506; CHECK-COMMON-NEXT: bl __arm_sme_restore507; CHECK-COMMON-NEXT: mov sp, x29508; CHECK-COMMON-NEXT: ldp x20, x19, [sp, #16] // 16-byte Folded Reload509; CHECK-COMMON-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload510; CHECK-COMMON-NEXT: ret511 call void %ptr()512 ret void513}514 515