# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --print-fixed-stack --version 5 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 --print-fixed-stack # RUN: llc -mattr=+sve -mtriple=aarch64-windows-msvc -run-pass=prologepilog %s -o - | FileCheck %s --- | define void @test_allocate_sve() uwtable { entry: unreachable } define void @test_allocate_sve_gpr_callee_saves() uwtable { entry: unreachable } define void @test_allocate_sve_gpr_realigned() uwtable { entry: unreachable } define void @test_address_sve() uwtable { entry: unreachable } define void @test_address_sve_fp() uwtable { entry: unreachable } define void @test_stack_arg_sve() uwtable { entry: unreachable } define void @test_address_sve_out_of_range() uwtable { entry: unreachable } define void @test_address_gpr_vla() uwtable { entry: unreachable } define aarch64_sve_vector_pcs void @save_restore_pregs_sve() uwtable { entry: unreachable } define aarch64_sve_vector_pcs void @save_restore_zregs_sve() uwtable { entry: unreachable } define aarch64_sve_vector_pcs void @save_restore_sve() uwtable { entry: unreachable } define aarch64_sve_vector_pcs void @save_restore_sve_realign() uwtable { entry: unreachable } define aarch64_sve_vector_pcs void @frame_layout() uwtable { entry: unreachable } ... --- name: test_allocate_sve stack: - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 } - { id: 1, stack-id: default, size: 16, alignment: 8 } body: | bb.0.entry: ; CHECK-LABEL: name: test_allocate_sve ; CHECK: fixedStack: ; CHECK: liveins: $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.2) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16 ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: frame-setup SEH_StackAlloc 16 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 2 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 2 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2) ; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR RET_ReallyLR ... --- name: test_allocate_sve_gpr_callee_saves stack: - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 } - { id: 1, stack-id: default, size: 16, alignment: 8 } body: | bb.0.entry: ; CHECK-LABEL: name: test_allocate_sve_gpr_callee_saves ; CHECK: fixedStack: ; CHECK: liveins: $x21, $x20, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $x20, killed $x21, $sp, -4 :: (store (s64) into %stack.3), (store (s64) into %stack.4) ; CHECK-NEXT: frame-setup SEH_SaveRegP_X 20, 21, -32 ; CHECK-NEXT: frame-setup STRXui killed $lr, $sp, 2 :: (store (s64) into %stack.2) ; CHECK-NEXT: frame-setup SEH_SaveReg 30, 16 ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: frame-setup SEH_StackAlloc 16 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 2 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $x20 = IMPLICIT_DEF ; CHECK-NEXT: $x21 = IMPLICIT_DEF ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 2 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 2 :: (load (s64) from %stack.2) ; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 16 ; CHECK-NEXT: early-clobber $sp, $x20, $x21 = frame-destroy LDPXpost $sp, 4 :: (load (s64) from %stack.3), (load (s64) from %stack.4) ; CHECK-NEXT: frame-destroy SEH_SaveRegP_X 20, 21, -32 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR $x20 = IMPLICIT_DEF $x21 = IMPLICIT_DEF RET_ReallyLR ... --- name: test_allocate_sve_gpr_realigned stack: - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 } - { id: 1, stack-id: default, size: 16, alignment: 32 } body: | bb.0.entry: ; CHECK-LABEL: name: test_allocate_sve_gpr_realigned ; CHECK: fixedStack: ; CHECK: liveins: $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.2), (store (s64) into %stack.3) ; CHECK-NEXT: frame-setup SEH_SaveFPLR_X -16 ; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0 ; CHECK-NEXT: frame-setup SEH_SetFP ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $x9 = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: $x9 = frame-setup ADDVL_XXI $x9, -2, implicit $vg ; CHECK-NEXT: $sp = frame-setup ANDXri killed $x9, 7930 ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0 ; CHECK-NEXT: frame-destroy SEH_SetFP ; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.3) ; CHECK-NEXT: frame-destroy SEH_SaveFPLR_X -16 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR RET_ReallyLR ... --- name: test_address_sve frameInfo: maxAlignment: 16 stack: - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 } - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 } - { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 } - { id: 3, stack-id: default, size: 16, alignment: 8 } body: | bb.0.entry: liveins: $z0, $z1, $p0 ; CHECK-LABEL: name: test_address_sve ; CHECK: fixedStack: ; CHECK: liveins: $z0, $z1, $p0, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.4) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16 ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: frame-setup SEH_StackAlloc 16 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 3 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $x8 = ADDXri $sp, 16, 0 ; CHECK-NEXT: STR_ZXI $z0, killed $x8, 2 ; CHECK-NEXT: $x8 = ADDXri $sp, 16, 0 ; CHECK-NEXT: STR_ZXI $z1, killed $x8, 1 ; CHECK-NEXT: $x8 = ADDXri $sp, 16, 0 ; CHECK-NEXT: STR_PXI $p0, killed $x8, 7 ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 3 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4) ; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR STR_ZXI $z0, %stack.0, 0 STR_ZXI $z1, %stack.1, 0 STR_PXI $p0, %stack.2, 0 RET_ReallyLR ... --- name: test_address_sve_fp frameInfo: maxAlignment: 16 isFrameAddressTaken: true stack: - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 } - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 } - { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 } - { id: 3, stack-id: default, size: 16, alignment: 8 } body: | bb.0.entry: liveins: $z0, $z1, $p0 ; CHECK-LABEL: name: test_address_sve_fp ; CHECK: fixedStack: ; CHECK: liveins: $z0, $z1, $p0, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.4), (store (s64) into %stack.5) ; CHECK-NEXT: frame-setup SEH_SaveFPLR_X -16 ; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0 ; CHECK-NEXT: frame-setup SEH_SetFP ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg ; CHECK-NEXT: STR_ZXI $z0, $fp, -1 ; CHECK-NEXT: STR_ZXI $z1, $fp, -2 ; CHECK-NEXT: STR_PXI $p0, $fp, -17 ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 3 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.4), (load (s64) from %stack.5) ; CHECK-NEXT: frame-destroy SEH_SaveFPLR_X -16 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR STR_ZXI $z0, %stack.0, 0 STR_ZXI $z1, %stack.1, 0 STR_PXI $p0, %stack.2, 0 RET_ReallyLR ... --- name: test_stack_arg_sve fixedStack: - { id: 0, stack-id: default, size: 16, alignment: 16, offset: 0 } stack: - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 } - { id: 1, stack-id: default, size: 16, alignment: 16 } body: | bb.0.entry: liveins: $x0 ; CHECK-LABEL: name: test_stack_arg_sve ; CHECK: fixedStack: ; CHECK-NEXT: - { id: 0, type: default, offset: 0, size: 16, alignment: 16, stack-id: default, ; CHECK-NEXT: isImmutable: false, isAliased: false, callee-saved-register: '', ; CHECK-NEXT: callee-saved-restored: true, debug-info-variable: '', debug-info-expression: '', ; CHECK-NEXT: debug-info-location: '' } ; CHECK: liveins: $x0, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.2) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16 ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: frame-setup SEH_StackAlloc 16 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 1 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg ; CHECK-NEXT: $x0 = LDRXui killed $x8, 4 ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 1 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2) ; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR $x0 = LDRXui %fixed-stack.0, 0 RET_ReallyLR ... --- name: test_address_sve_out_of_range frameInfo: maxAlignment: 16 stack: - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 } - { id: 1, stack-id: scalable-vector, size: 3584, alignment: 16 } - { id: 2, stack-id: scalable-vector, size: 512, alignment: 16 } body: | bb.0.entry: liveins: $z0, $p0 ; CHECK-LABEL: name: test_address_sve_out_of_range ; CHECK: fixedStack: ; CHECK: liveins: $z0, $p0, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.3) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 1 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg ; CHECK-NEXT: STR_ZXI $z0, killed $x8, 255 ; CHECK-NEXT: $x8 = ADDPL_XXI $sp, 1, implicit $vg ; CHECK-NEXT: STR_PXI $p0, killed $x8, 255 ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 31 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 9, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 9 ; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.3) ; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR STR_ZXI $z0, %stack.0, 0 STR_PXI $p0, %stack.1, 0 RET_ReallyLR ... --- name: test_address_gpr_vla frameInfo: maxAlignment: 16 stack: - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 } - { id: 1, stack-id: default, size: 16, alignment: 8 } - { id: 2, stack-id: default, type: variable-sized } body: | bb.0.entry: liveins: $xzr ; CHECK-LABEL: name: test_address_gpr_vla ; CHECK: fixedStack: ; CHECK: liveins: $xzr, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $x19, $sp, -32 :: (store (s64) into %stack.5) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 19, -32 ; CHECK-NEXT: frame-setup STPXi killed $fp, killed $lr, $sp, 1 :: (store (s64) into %stack.3), (store (s64) into %stack.4) ; CHECK-NEXT: frame-setup SEH_SaveFPLR 8 ; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 8, 0 ; CHECK-NEXT: frame-setup SEH_AddFP 8 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg ; CHECK-NEXT: $x19 = ADDXri $sp, 0, 0 ; CHECK-NEXT: STRXui $xzr, $x19, 0 ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy SUBXri $fp, 8, 0 ; CHECK-NEXT: frame-destroy SEH_AddFP 8 ; CHECK-NEXT: $fp, $lr = frame-destroy LDPXi $sp, 1 :: (load (s64) from %stack.3), (load (s64) from %stack.4) ; CHECK-NEXT: frame-destroy SEH_SaveFPLR 8 ; CHECK-NEXT: early-clobber $sp, $x19 = frame-destroy LDRXpost $sp, 32 :: (load (s64) from %stack.5) ; CHECK-NEXT: frame-destroy SEH_SaveReg_X 19, -32 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR STRXui $xzr, %stack.1, 0 RET_ReallyLR ... --- name: save_restore_pregs_sve stack: - { id: 0, stack-id: default, size: 32, alignment: 16 } body: | bb.0.entry: ; CHECK-LABEL: name: save_restore_pregs_sve ; CHECK: fixedStack: ; CHECK: liveins: $p4, $p5, $p6, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 1 ; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.4) ; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0 ; CHECK-NEXT: frame-setup STR_PXI killed $p5, $sp, 1 :: (store (s16) into %stack.3) ; CHECK-NEXT: frame-setup SEH_SavePReg 5, 1 ; CHECK-NEXT: frame-setup STR_PXI killed $p6, $sp, 2 :: (store (s16) into %stack.2) ; CHECK-NEXT: frame-setup SEH_SavePReg 6, 2 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.1) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16 ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0 ; CHECK-NEXT: frame-setup SEH_StackAlloc 32 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $p4 = IMPLICIT_DEF ; CHECK-NEXT: $p5 = IMPLICIT_DEF ; CHECK-NEXT: $p6 = IMPLICIT_DEF ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 32 ; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 0 :: (load (s64) from %stack.1) ; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.4) ; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0 ; CHECK-NEXT: $p5 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.3) ; CHECK-NEXT: frame-destroy SEH_SavePReg 5, 1 ; CHECK-NEXT: $p6 = frame-destroy LDR_PXI $sp, 2 :: (load (s16) from %stack.2) ; CHECK-NEXT: frame-destroy SEH_SavePReg 6, 2 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 1 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR $p4 = IMPLICIT_DEF $p5 = IMPLICIT_DEF $p6 = IMPLICIT_DEF RET_ReallyLR ... --- name: save_restore_zregs_sve stack: - { id: 0, stack-id: default, size: 32, alignment: 16 } body: | bb.0.entry: ; CHECK-LABEL: name: save_restore_zregs_sve ; CHECK: fixedStack: ; CHECK: liveins: $z8, $z9, $z10, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 3 ; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 0 :: (store (s128) into %stack.4) ; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 0 ; CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 1 :: (store (s128) into %stack.3) ; CHECK-NEXT: frame-setup SEH_SaveZReg 9, 1 ; CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 2 :: (store (s128) into %stack.2) ; CHECK-NEXT: frame-setup SEH_SaveZReg 10, 2 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.1) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16 ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0 ; CHECK-NEXT: frame-setup SEH_StackAlloc 32 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $z8 = IMPLICIT_DEF ; CHECK-NEXT: $z9 = IMPLICIT_DEF ; CHECK-NEXT: $z10 = IMPLICIT_DEF ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 32 ; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 0 :: (load (s64) from %stack.1) ; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 0 :: (load (s128) from %stack.4) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 0 ; CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 1 :: (load (s128) from %stack.3) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 9, 1 ; CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.2) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 10, 2 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 3 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR $z8 = IMPLICIT_DEF $z9 = IMPLICIT_DEF $z10 = IMPLICIT_DEF RET_ReallyLR ... --- name: save_restore_sve stack: - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 } - { id: 1, stack-id: default, size: 32, alignment: 16 } body: | bb.0.entry: ; CHECK-LABEL: name: save_restore_sve ; CHECK: fixedStack: ; CHECK: liveins: $p4, $p5, $p6, $p7, $p8, $p9, $p10, $p11, $p12, $p13, $p14, $p15, $z8, $z9, $z10, $z11, $z12, $z13, $z14, $z15, $z16, $z17, $z18, $z19, $z20, $z21, $z22, $z23, $x20, $x19, $lr, $x21 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -18, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 18 ; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.33) ; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0 ; CHECK-NEXT: frame-setup STR_PXI killed $p5, $sp, 1 :: (store (s16) into %stack.32) ; CHECK-NEXT: frame-setup SEH_SavePReg 5, 1 ; CHECK-NEXT: frame-setup STR_PXI killed $p6, $sp, 2 :: (store (s16) into %stack.31) ; CHECK-NEXT: frame-setup SEH_SavePReg 6, 2 ; CHECK-NEXT: frame-setup STR_PXI killed $p7, $sp, 3 :: (store (s16) into %stack.30) ; CHECK-NEXT: frame-setup SEH_SavePReg 7, 3 ; CHECK-NEXT: frame-setup STR_PXI killed $p8, $sp, 4 :: (store (s16) into %stack.29) ; CHECK-NEXT: frame-setup SEH_SavePReg 8, 4 ; CHECK-NEXT: frame-setup STR_PXI killed $p9, $sp, 5 :: (store (s16) into %stack.28) ; CHECK-NEXT: frame-setup SEH_SavePReg 9, 5 ; CHECK-NEXT: frame-setup STR_PXI killed $p10, $sp, 6 :: (store (s16) into %stack.27) ; CHECK-NEXT: frame-setup SEH_SavePReg 10, 6 ; CHECK-NEXT: frame-setup STR_PXI killed $p11, $sp, 7 :: (store (s16) into %stack.26) ; CHECK-NEXT: frame-setup SEH_SavePReg 11, 7 ; CHECK-NEXT: frame-setup STR_PXI killed $p12, $sp, 8 :: (store (s16) into %stack.25) ; CHECK-NEXT: frame-setup SEH_SavePReg 12, 8 ; CHECK-NEXT: frame-setup STR_PXI killed $p13, $sp, 9 :: (store (s16) into %stack.24) ; CHECK-NEXT: frame-setup SEH_SavePReg 13, 9 ; CHECK-NEXT: frame-setup STR_PXI killed $p14, $sp, 10 :: (store (s16) into %stack.23) ; CHECK-NEXT: frame-setup SEH_SavePReg 14, 10 ; CHECK-NEXT: frame-setup STR_PXI killed $p15, $sp, 11 :: (store (s16) into %stack.22) ; CHECK-NEXT: frame-setup SEH_SavePReg 15, 11 ; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 2 :: (store (s128) into %stack.21) ; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 2 ; CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 3 :: (store (s128) into %stack.20) ; CHECK-NEXT: frame-setup SEH_SaveZReg 9, 3 ; CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 4 :: (store (s128) into %stack.19) ; CHECK-NEXT: frame-setup SEH_SaveZReg 10, 4 ; CHECK-NEXT: frame-setup STR_ZXI killed $z11, $sp, 5 :: (store (s128) into %stack.18) ; CHECK-NEXT: frame-setup SEH_SaveZReg 11, 5 ; CHECK-NEXT: frame-setup STR_ZXI killed $z12, $sp, 6 :: (store (s128) into %stack.17) ; CHECK-NEXT: frame-setup SEH_SaveZReg 12, 6 ; CHECK-NEXT: frame-setup STR_ZXI killed $z13, $sp, 7 :: (store (s128) into %stack.16) ; CHECK-NEXT: frame-setup SEH_SaveZReg 13, 7 ; CHECK-NEXT: frame-setup STR_ZXI killed $z14, $sp, 8 :: (store (s128) into %stack.15) ; CHECK-NEXT: frame-setup SEH_SaveZReg 14, 8 ; CHECK-NEXT: frame-setup STR_ZXI killed $z15, $sp, 9 :: (store (s128) into %stack.14) ; CHECK-NEXT: frame-setup SEH_SaveZReg 15, 9 ; CHECK-NEXT: frame-setup STR_ZXI killed $z16, $sp, 10 :: (store (s128) into %stack.13) ; CHECK-NEXT: frame-setup SEH_SaveZReg 16, 10 ; CHECK-NEXT: frame-setup STR_ZXI killed $z17, $sp, 11 :: (store (s128) into %stack.12) ; CHECK-NEXT: frame-setup SEH_SaveZReg 17, 11 ; CHECK-NEXT: frame-setup STR_ZXI killed $z18, $sp, 12 :: (store (s128) into %stack.11) ; CHECK-NEXT: frame-setup SEH_SaveZReg 18, 12 ; CHECK-NEXT: frame-setup STR_ZXI killed $z19, $sp, 13 :: (store (s128) into %stack.10) ; CHECK-NEXT: frame-setup SEH_SaveZReg 19, 13 ; CHECK-NEXT: frame-setup STR_ZXI killed $z20, $sp, 14 :: (store (s128) into %stack.9) ; CHECK-NEXT: frame-setup SEH_SaveZReg 20, 14 ; CHECK-NEXT: frame-setup STR_ZXI killed $z21, $sp, 15 :: (store (s128) into %stack.8) ; CHECK-NEXT: frame-setup SEH_SaveZReg 21, 15 ; CHECK-NEXT: frame-setup STR_ZXI killed $z22, $sp, 16 :: (store (s128) into %stack.7) ; CHECK-NEXT: frame-setup SEH_SaveZReg 22, 16 ; CHECK-NEXT: frame-setup STR_ZXI killed $z23, $sp, 17 :: (store (s128) into %stack.6) ; CHECK-NEXT: frame-setup SEH_SaveZReg 23, 17 ; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $x19, killed $x20, $sp, -4 :: (store (s64) into %stack.4), (store (s64) into %stack.5) ; CHECK-NEXT: frame-setup SEH_SaveRegP_X 19, 20, -32 ; CHECK-NEXT: frame-setup STPXi killed $x21, killed $lr, $sp, 2 :: (store (s64) into %stack.2), (store (s64) into %stack.3) ; CHECK-NEXT: frame-setup SEH_SaveRegP 21, 30, 16 ; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0 ; CHECK-NEXT: frame-setup SEH_StackAlloc 32 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 1 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $z8_z9_z10_z11 = IMPLICIT_DEF ; CHECK-NEXT: $z12_z13_z14_z15 = IMPLICIT_DEF ; CHECK-NEXT: $z16_z17_z18_z19 = IMPLICIT_DEF ; CHECK-NEXT: $z20_z21_z22_z23 = IMPLICIT_DEF ; CHECK-NEXT: $z24_z25_z26_z27 = IMPLICIT_DEF ; CHECK-NEXT: $z28_z29_z30_z31 = IMPLICIT_DEF ; CHECK-NEXT: $p4 = IMPLICIT_DEF ; CHECK-NEXT: $p5 = IMPLICIT_DEF ; CHECK-NEXT: $p6 = IMPLICIT_DEF ; CHECK-NEXT: $p7 = IMPLICIT_DEF ; CHECK-NEXT: $p8 = IMPLICIT_DEF ; CHECK-NEXT: $p9 = IMPLICIT_DEF ; CHECK-NEXT: $p10 = IMPLICIT_DEF ; CHECK-NEXT: $p11 = IMPLICIT_DEF ; CHECK-NEXT: $p12 = IMPLICIT_DEF ; CHECK-NEXT: $p13 = IMPLICIT_DEF ; CHECK-NEXT: $p14 = IMPLICIT_DEF ; CHECK-NEXT: $p15 = IMPLICIT_DEF ; CHECK-NEXT: $x19 = IMPLICIT_DEF ; CHECK-NEXT: $x20 = IMPLICIT_DEF ; CHECK-NEXT: $x21 = IMPLICIT_DEF ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 1 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 32 ; CHECK-NEXT: $x21, $lr = frame-destroy LDPXi $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.3) ; CHECK-NEXT: frame-destroy SEH_SaveRegP 21, 30, 16 ; CHECK-NEXT: $x19, $x20 = frame-destroy LDPXi $sp, 0 :: (load (s64) from %stack.4), (load (s64) from %stack.5) ; CHECK-NEXT: frame-destroy SEH_SaveRegP 19, 20, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 32 ; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.21) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 2 ; CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 3 :: (load (s128) from %stack.20) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 9, 3 ; CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 4 :: (load (s128) from %stack.19) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 10, 4 ; CHECK-NEXT: $z11 = frame-destroy LDR_ZXI $sp, 5 :: (load (s128) from %stack.18) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 11, 5 ; CHECK-NEXT: $z12 = frame-destroy LDR_ZXI $sp, 6 :: (load (s128) from %stack.17) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 12, 6 ; CHECK-NEXT: $z13 = frame-destroy LDR_ZXI $sp, 7 :: (load (s128) from %stack.16) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 13, 7 ; CHECK-NEXT: $z14 = frame-destroy LDR_ZXI $sp, 8 :: (load (s128) from %stack.15) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 14, 8 ; CHECK-NEXT: $z15 = frame-destroy LDR_ZXI $sp, 9 :: (load (s128) from %stack.14) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 15, 9 ; CHECK-NEXT: $z16 = frame-destroy LDR_ZXI $sp, 10 :: (load (s128) from %stack.13) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 16, 10 ; CHECK-NEXT: $z17 = frame-destroy LDR_ZXI $sp, 11 :: (load (s128) from %stack.12) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 17, 11 ; CHECK-NEXT: $z18 = frame-destroy LDR_ZXI $sp, 12 :: (load (s128) from %stack.11) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 18, 12 ; CHECK-NEXT: $z19 = frame-destroy LDR_ZXI $sp, 13 :: (load (s128) from %stack.10) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 19, 13 ; CHECK-NEXT: $z20 = frame-destroy LDR_ZXI $sp, 14 :: (load (s128) from %stack.9) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 20, 14 ; CHECK-NEXT: $z21 = frame-destroy LDR_ZXI $sp, 15 :: (load (s128) from %stack.8) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 21, 15 ; CHECK-NEXT: $z22 = frame-destroy LDR_ZXI $sp, 16 :: (load (s128) from %stack.7) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 22, 16 ; CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 17 :: (load (s128) from %stack.6) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 23, 17 ; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.33) ; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0 ; CHECK-NEXT: $p5 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.32) ; CHECK-NEXT: frame-destroy SEH_SavePReg 5, 1 ; CHECK-NEXT: $p6 = frame-destroy LDR_PXI $sp, 2 :: (load (s16) from %stack.31) ; CHECK-NEXT: frame-destroy SEH_SavePReg 6, 2 ; CHECK-NEXT: $p7 = frame-destroy LDR_PXI $sp, 3 :: (load (s16) from %stack.30) ; CHECK-NEXT: frame-destroy SEH_SavePReg 7, 3 ; CHECK-NEXT: $p8 = frame-destroy LDR_PXI $sp, 4 :: (load (s16) from %stack.29) ; CHECK-NEXT: frame-destroy SEH_SavePReg 8, 4 ; CHECK-NEXT: $p9 = frame-destroy LDR_PXI $sp, 5 :: (load (s16) from %stack.28) ; CHECK-NEXT: frame-destroy SEH_SavePReg 9, 5 ; CHECK-NEXT: $p10 = frame-destroy LDR_PXI $sp, 6 :: (load (s16) from %stack.27) ; CHECK-NEXT: frame-destroy SEH_SavePReg 10, 6 ; CHECK-NEXT: $p11 = frame-destroy LDR_PXI $sp, 7 :: (load (s16) from %stack.26) ; CHECK-NEXT: frame-destroy SEH_SavePReg 11, 7 ; CHECK-NEXT: $p12 = frame-destroy LDR_PXI $sp, 8 :: (load (s16) from %stack.25) ; CHECK-NEXT: frame-destroy SEH_SavePReg 12, 8 ; CHECK-NEXT: $p13 = frame-destroy LDR_PXI $sp, 9 :: (load (s16) from %stack.24) ; CHECK-NEXT: frame-destroy SEH_SavePReg 13, 9 ; CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 10 :: (load (s16) from %stack.23) ; CHECK-NEXT: frame-destroy SEH_SavePReg 14, 10 ; CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 11 :: (load (s16) from %stack.22) ; CHECK-NEXT: frame-destroy SEH_SavePReg 15, 11 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 18, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 18 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR $z8_z9_z10_z11 = IMPLICIT_DEF $z12_z13_z14_z15 = IMPLICIT_DEF $z16_z17_z18_z19 = IMPLICIT_DEF $z20_z21_z22_z23 = IMPLICIT_DEF $z24_z25_z26_z27 = IMPLICIT_DEF $z28_z29_z30_z31 = IMPLICIT_DEF $p4 = IMPLICIT_DEF $p5 = IMPLICIT_DEF $p6 = IMPLICIT_DEF $p7 = IMPLICIT_DEF $p8 = IMPLICIT_DEF $p9 = IMPLICIT_DEF $p10 = IMPLICIT_DEF $p11 = IMPLICIT_DEF $p12 = IMPLICIT_DEF $p13 = IMPLICIT_DEF $p14 = IMPLICIT_DEF $p15 = IMPLICIT_DEF $x19 = IMPLICIT_DEF $x20 = IMPLICIT_DEF $x21 = IMPLICIT_DEF RET_ReallyLR ... --- name: save_restore_sve_realign stack: - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 } - { id: 1, stack-id: default, size: 16, alignment: 32 } body: | bb.0.entry: ; CHECK-LABEL: name: save_restore_sve_realign ; CHECK: fixedStack: ; CHECK: liveins: $p4, $p5, $p6, $p7, $p8, $p9, $p10, $p11, $p12, $p13, $p14, $p15, $z8, $z9, $z10, $z11, $z12, $z13, $z14, $z15, $z16, $z17, $z18, $z19, $z20, $z21, $z22, $z23, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -18, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 18 ; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.31) ; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0 ; CHECK-NEXT: frame-setup STR_PXI killed $p5, $sp, 1 :: (store (s16) into %stack.30) ; CHECK-NEXT: frame-setup SEH_SavePReg 5, 1 ; CHECK-NEXT: frame-setup STR_PXI killed $p6, $sp, 2 :: (store (s16) into %stack.29) ; CHECK-NEXT: frame-setup SEH_SavePReg 6, 2 ; CHECK-NEXT: frame-setup STR_PXI killed $p7, $sp, 3 :: (store (s16) into %stack.28) ; CHECK-NEXT: frame-setup SEH_SavePReg 7, 3 ; CHECK-NEXT: frame-setup STR_PXI killed $p8, $sp, 4 :: (store (s16) into %stack.27) ; CHECK-NEXT: frame-setup SEH_SavePReg 8, 4 ; CHECK-NEXT: frame-setup STR_PXI killed $p9, $sp, 5 :: (store (s16) into %stack.26) ; CHECK-NEXT: frame-setup SEH_SavePReg 9, 5 ; CHECK-NEXT: frame-setup STR_PXI killed $p10, $sp, 6 :: (store (s16) into %stack.25) ; CHECK-NEXT: frame-setup SEH_SavePReg 10, 6 ; CHECK-NEXT: frame-setup STR_PXI killed $p11, $sp, 7 :: (store (s16) into %stack.24) ; CHECK-NEXT: frame-setup SEH_SavePReg 11, 7 ; CHECK-NEXT: frame-setup STR_PXI killed $p12, $sp, 8 :: (store (s16) into %stack.23) ; CHECK-NEXT: frame-setup SEH_SavePReg 12, 8 ; CHECK-NEXT: frame-setup STR_PXI killed $p13, $sp, 9 :: (store (s16) into %stack.22) ; CHECK-NEXT: frame-setup SEH_SavePReg 13, 9 ; CHECK-NEXT: frame-setup STR_PXI killed $p14, $sp, 10 :: (store (s16) into %stack.21) ; CHECK-NEXT: frame-setup SEH_SavePReg 14, 10 ; CHECK-NEXT: frame-setup STR_PXI killed $p15, $sp, 11 :: (store (s16) into %stack.20) ; CHECK-NEXT: frame-setup SEH_SavePReg 15, 11 ; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 2 :: (store (s128) into %stack.19) ; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 2 ; CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 3 :: (store (s128) into %stack.18) ; CHECK-NEXT: frame-setup SEH_SaveZReg 9, 3 ; CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 4 :: (store (s128) into %stack.17) ; CHECK-NEXT: frame-setup SEH_SaveZReg 10, 4 ; CHECK-NEXT: frame-setup STR_ZXI killed $z11, $sp, 5 :: (store (s128) into %stack.16) ; CHECK-NEXT: frame-setup SEH_SaveZReg 11, 5 ; CHECK-NEXT: frame-setup STR_ZXI killed $z12, $sp, 6 :: (store (s128) into %stack.15) ; CHECK-NEXT: frame-setup SEH_SaveZReg 12, 6 ; CHECK-NEXT: frame-setup STR_ZXI killed $z13, $sp, 7 :: (store (s128) into %stack.14) ; CHECK-NEXT: frame-setup SEH_SaveZReg 13, 7 ; CHECK-NEXT: frame-setup STR_ZXI killed $z14, $sp, 8 :: (store (s128) into %stack.13) ; CHECK-NEXT: frame-setup SEH_SaveZReg 14, 8 ; CHECK-NEXT: frame-setup STR_ZXI killed $z15, $sp, 9 :: (store (s128) into %stack.12) ; CHECK-NEXT: frame-setup SEH_SaveZReg 15, 9 ; CHECK-NEXT: frame-setup STR_ZXI killed $z16, $sp, 10 :: (store (s128) into %stack.11) ; CHECK-NEXT: frame-setup SEH_SaveZReg 16, 10 ; CHECK-NEXT: frame-setup STR_ZXI killed $z17, $sp, 11 :: (store (s128) into %stack.10) ; CHECK-NEXT: frame-setup SEH_SaveZReg 17, 11 ; CHECK-NEXT: frame-setup STR_ZXI killed $z18, $sp, 12 :: (store (s128) into %stack.9) ; CHECK-NEXT: frame-setup SEH_SaveZReg 18, 12 ; CHECK-NEXT: frame-setup STR_ZXI killed $z19, $sp, 13 :: (store (s128) into %stack.8) ; CHECK-NEXT: frame-setup SEH_SaveZReg 19, 13 ; CHECK-NEXT: frame-setup STR_ZXI killed $z20, $sp, 14 :: (store (s128) into %stack.7) ; CHECK-NEXT: frame-setup SEH_SaveZReg 20, 14 ; CHECK-NEXT: frame-setup STR_ZXI killed $z21, $sp, 15 :: (store (s128) into %stack.6) ; CHECK-NEXT: frame-setup SEH_SaveZReg 21, 15 ; CHECK-NEXT: frame-setup STR_ZXI killed $z22, $sp, 16 :: (store (s128) into %stack.5) ; CHECK-NEXT: frame-setup SEH_SaveZReg 22, 16 ; CHECK-NEXT: frame-setup STR_ZXI killed $z23, $sp, 17 :: (store (s128) into %stack.4) ; CHECK-NEXT: frame-setup SEH_SaveZReg 23, 17 ; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.2), (store (s64) into %stack.3) ; CHECK-NEXT: frame-setup SEH_SaveFPLR_X -16 ; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0 ; CHECK-NEXT: frame-setup SEH_SetFP ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $x9 = frame-setup SUBXri $sp, 16, 0 ; CHECK-NEXT: $x9 = frame-setup ADDVL_XXI $x9, -1, implicit $vg ; CHECK-NEXT: $sp = frame-setup ANDXri killed $x9, 7930 ; CHECK-NEXT: $z8_z9_z10_z11 = IMPLICIT_DEF ; CHECK-NEXT: $z12_z13_z14_z15 = IMPLICIT_DEF ; CHECK-NEXT: $z16_z17_z18_z19 = IMPLICIT_DEF ; CHECK-NEXT: $z20_z21_z22_z23 = IMPLICIT_DEF ; CHECK-NEXT: $z24_z25_z26_z27 = IMPLICIT_DEF ; CHECK-NEXT: $z28_z29_z30_z31 = IMPLICIT_DEF ; CHECK-NEXT: $p4 = IMPLICIT_DEF ; CHECK-NEXT: $p5 = IMPLICIT_DEF ; CHECK-NEXT: $p6 = IMPLICIT_DEF ; CHECK-NEXT: $p7 = IMPLICIT_DEF ; CHECK-NEXT: $p8 = IMPLICIT_DEF ; CHECK-NEXT: $p9 = IMPLICIT_DEF ; CHECK-NEXT: $p10 = IMPLICIT_DEF ; CHECK-NEXT: $p11 = IMPLICIT_DEF ; CHECK-NEXT: $p12 = IMPLICIT_DEF ; CHECK-NEXT: $p13 = IMPLICIT_DEF ; CHECK-NEXT: $p14 = IMPLICIT_DEF ; CHECK-NEXT: $p15 = IMPLICIT_DEF ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0 ; CHECK-NEXT: frame-destroy SEH_SetFP ; CHECK-NEXT: $fp, $lr = frame-destroy LDPXi $sp, 0 :: (load (s64) from %stack.2), (load (s64) from %stack.3) ; CHECK-NEXT: frame-destroy SEH_SaveFPLR 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.19) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 2 ; CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 3 :: (load (s128) from %stack.18) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 9, 3 ; CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 4 :: (load (s128) from %stack.17) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 10, 4 ; CHECK-NEXT: $z11 = frame-destroy LDR_ZXI $sp, 5 :: (load (s128) from %stack.16) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 11, 5 ; CHECK-NEXT: $z12 = frame-destroy LDR_ZXI $sp, 6 :: (load (s128) from %stack.15) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 12, 6 ; CHECK-NEXT: $z13 = frame-destroy LDR_ZXI $sp, 7 :: (load (s128) from %stack.14) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 13, 7 ; CHECK-NEXT: $z14 = frame-destroy LDR_ZXI $sp, 8 :: (load (s128) from %stack.13) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 14, 8 ; CHECK-NEXT: $z15 = frame-destroy LDR_ZXI $sp, 9 :: (load (s128) from %stack.12) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 15, 9 ; CHECK-NEXT: $z16 = frame-destroy LDR_ZXI $sp, 10 :: (load (s128) from %stack.11) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 16, 10 ; CHECK-NEXT: $z17 = frame-destroy LDR_ZXI $sp, 11 :: (load (s128) from %stack.10) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 17, 11 ; CHECK-NEXT: $z18 = frame-destroy LDR_ZXI $sp, 12 :: (load (s128) from %stack.9) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 18, 12 ; CHECK-NEXT: $z19 = frame-destroy LDR_ZXI $sp, 13 :: (load (s128) from %stack.8) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 19, 13 ; CHECK-NEXT: $z20 = frame-destroy LDR_ZXI $sp, 14 :: (load (s128) from %stack.7) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 20, 14 ; CHECK-NEXT: $z21 = frame-destroy LDR_ZXI $sp, 15 :: (load (s128) from %stack.6) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 21, 15 ; CHECK-NEXT: $z22 = frame-destroy LDR_ZXI $sp, 16 :: (load (s128) from %stack.5) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 22, 16 ; CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 17 :: (load (s128) from %stack.4) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 23, 17 ; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.31) ; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0 ; CHECK-NEXT: $p5 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.30) ; CHECK-NEXT: frame-destroy SEH_SavePReg 5, 1 ; CHECK-NEXT: $p6 = frame-destroy LDR_PXI $sp, 2 :: (load (s16) from %stack.29) ; CHECK-NEXT: frame-destroy SEH_SavePReg 6, 2 ; CHECK-NEXT: $p7 = frame-destroy LDR_PXI $sp, 3 :: (load (s16) from %stack.28) ; CHECK-NEXT: frame-destroy SEH_SavePReg 7, 3 ; CHECK-NEXT: $p8 = frame-destroy LDR_PXI $sp, 4 :: (load (s16) from %stack.27) ; CHECK-NEXT: frame-destroy SEH_SavePReg 8, 4 ; CHECK-NEXT: $p9 = frame-destroy LDR_PXI $sp, 5 :: (load (s16) from %stack.26) ; CHECK-NEXT: frame-destroy SEH_SavePReg 9, 5 ; CHECK-NEXT: $p10 = frame-destroy LDR_PXI $sp, 6 :: (load (s16) from %stack.25) ; CHECK-NEXT: frame-destroy SEH_SavePReg 10, 6 ; CHECK-NEXT: $p11 = frame-destroy LDR_PXI $sp, 7 :: (load (s16) from %stack.24) ; CHECK-NEXT: frame-destroy SEH_SavePReg 11, 7 ; CHECK-NEXT: $p12 = frame-destroy LDR_PXI $sp, 8 :: (load (s16) from %stack.23) ; CHECK-NEXT: frame-destroy SEH_SavePReg 12, 8 ; CHECK-NEXT: $p13 = frame-destroy LDR_PXI $sp, 9 :: (load (s16) from %stack.22) ; CHECK-NEXT: frame-destroy SEH_SavePReg 13, 9 ; CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 10 :: (load (s16) from %stack.21) ; CHECK-NEXT: frame-destroy SEH_SavePReg 14, 10 ; CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 11 :: (load (s16) from %stack.20) ; CHECK-NEXT: frame-destroy SEH_SavePReg 15, 11 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 18, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 18 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR $z8_z9_z10_z11 = IMPLICIT_DEF $z12_z13_z14_z15 = IMPLICIT_DEF $z16_z17_z18_z19 = IMPLICIT_DEF $z20_z21_z22_z23 = IMPLICIT_DEF $z24_z25_z26_z27 = IMPLICIT_DEF $z28_z29_z30_z31 = IMPLICIT_DEF $p4 = IMPLICIT_DEF $p5 = IMPLICIT_DEF $p6 = IMPLICIT_DEF $p7 = IMPLICIT_DEF $p8 = IMPLICIT_DEF $p9 = IMPLICIT_DEF $p10 = IMPLICIT_DEF $p11 = IMPLICIT_DEF $p12 = IMPLICIT_DEF $p13 = IMPLICIT_DEF $p14 = IMPLICIT_DEF $p15 = IMPLICIT_DEF RET_ReallyLR ... --- name: frame_layout stack: - { id: 0, type: default, size: 32, alignment: 16, stack-id: scalable-vector } - { id: 1, type: default, size: 4, alignment: 2, stack-id: scalable-vector } - { id: 2, type: default, size: 16, alignment: 16, stack-id: scalable-vector } - { id: 3, type: default, size: 2, alignment: 2, stack-id: scalable-vector } - { id: 4, type: spill-slot, size: 16, alignment: 16, stack-id: scalable-vector } - { id: 5, type: spill-slot, size: 2, alignment: 2, stack-id: scalable-vector } body: | bb.0.entry: ; Trigger some callee saves ; CHECK-LABEL: name: frame_layout ; CHECK: fixedStack: ; CHECK: liveins: $p4, $p15, $z8, $z23, $lr ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 3 ; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.10) ; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0 ; CHECK-NEXT: frame-setup STR_PXI killed $p15, $sp, 1 :: (store (s16) into %stack.9) ; CHECK-NEXT: frame-setup SEH_SavePReg 15, 1 ; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 1 :: (store (s128) into %stack.8) ; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 1 ; CHECK-NEXT: frame-setup STR_ZXI killed $z23, $sp, 2 :: (store (s128) into %stack.7) ; CHECK-NEXT: frame-setup SEH_SaveZReg 23, 2 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.6) ; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -7, implicit $vg ; CHECK-NEXT: frame-setup SEH_AllocZ 7 ; CHECK-NEXT: frame-setup SEH_PrologEnd ; CHECK-NEXT: $z8 = IMPLICIT_DEF ; CHECK-NEXT: $z23 = IMPLICIT_DEF ; CHECK-NEXT: $p4 = IMPLICIT_DEF ; CHECK-NEXT: $p15 = IMPLICIT_DEF ; CHECK-NEXT: frame-destroy SEH_EpilogStart ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 7, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 7 ; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 0 :: (load (s64) from %stack.6) ; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 0 ; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0 ; CHECK-NEXT: frame-destroy SEH_StackAlloc 16 ; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 1 :: (load (s128) from %stack.8) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 1 ; CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.7) ; CHECK-NEXT: frame-destroy SEH_SaveZReg 23, 2 ; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.10) ; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0 ; CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.9) ; CHECK-NEXT: frame-destroy SEH_SavePReg 15, 1 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg ; CHECK-NEXT: frame-destroy SEH_AllocZ 3 ; CHECK-NEXT: frame-destroy SEH_EpilogEnd ; CHECK-NEXT: RET_ReallyLR $z8 = IMPLICIT_DEF $z23 = IMPLICIT_DEF $p4 = IMPLICIT_DEF $p15 = IMPLICIT_DEF RET_ReallyLR ...