129 lines · plain
1# RUN: llc -mtriple=aarch64 -mattr=+sve -mattr=+sme -run-pass=aarch64-machine-sme-abi -verify-machineinstrs %s -o - | FileCheck %s2# RUN: llc -mtriple=aarch64 -mattr=+sve -mattr=+sme -aarch64-new-sme-abi %s -o - | FileCheck %s --check-prefix=CHECK-ASM3 4# This tests the unfortunate case the status flags ($nzcv) are live at the point5# we want to restore ZA. Currently, this is handled by saving them to a scratch6# register.7 8--- |9 define void @cmp_branch(i32 %0) "aarch64_inout_za" {10 tail call void @clobber()11 %2 = icmp sgt i32 %0, 10012 br i1 %2, label %3, label %413 14 3: ; preds = %115 tail call void @inout_call() #316 br label %417 18 4: ; preds = %3, %119 tail call void @inout_call() #320 ret void21 }22 23 declare void @clobber()24 declare void @inout_call() "aarch64_inout_za"25...26---27name: cmp_branch28alignment: 429tracksRegLiveness: true30noPhis: false31isSSA: true32noVRegs: false33hasFakeUses: false34registers:35 - { id: 0, class: gpr32common }36 - { id: 1, class: gpr32 }37liveins:38 - { reg: '$w0' }39frameInfo:40 maxAlignment: 141 adjustsStack: true42 hasCalls: true43 maxCallFrameSize: 044 hasTailCall: true45machineFunctionInfo: {}46body: |47 ; CHECK-LABEL: name: cmp_branch48 ; CHECK: bb.0 (%ir-block.1):49 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)50 ; CHECK-NEXT: liveins: $w051 ; CHECK-NEXT: {{ $}}52 ; CHECK-NEXT: [[RDSVLI_XI:%[0-9]+]]:gpr64 = RDSVLI_XI 1, implicit $vg53 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $sp54 ; CHECK-NEXT: [[MSUBXrrr:%[0-9]+]]:gpr64 = MSUBXrrr [[RDSVLI_XI]], [[RDSVLI_XI]], [[COPY]]55 ; CHECK-NEXT: $sp = COPY [[MSUBXrrr]]56 ; CHECK-NEXT: STPXi [[MSUBXrrr]], [[RDSVLI_XI]], %stack.0, 057 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32common = COPY $w058 ; CHECK-NEXT: [[ADDXri:%[0-9]+]]:gpr64sp = ADDXri %stack.0, 0, 059 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr64 = COPY [[ADDXri]]60 ; CHECK-NEXT: MSR 56965, [[COPY2]]61 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp62 ; CHECK-NEXT: RequiresZASavePseudo63 ; CHECK-NEXT: BL @clobber, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp64 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp65 ; CHECK-NEXT: MSRpstatesvcrImm1 2, 1, implicit-def $nzcv66 ; CHECK-NEXT: [[MRS1:%[0-9]+]]:gpr64 = MRS 56965, implicit-def $nzcv67 ; CHECK-NEXT: $x0 = ADDXri %stack.0, 0, 068 ; CHECK-NEXT: RestoreZAPseudo [[MRS1]], $x0, &__arm_tpidr2_restore, csr_aarch64_sme_abi_support_routines_preservemost_from_x069 ; CHECK-NEXT: MSR 56965, $xzr70 ; CHECK-NEXT: [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[COPY1]], 101, 0, implicit-def $nzcv71 ; CHECK-NEXT: Bcc 11, %bb.2, implicit $nzcv72 ; CHECK-NEXT: B %bb.173 ; CHECK-NEXT: {{ $}}74 ; CHECK-NEXT: bb.1 (%ir-block.3):75 ; CHECK-NEXT: successors: %bb.2(0x80000000)76 ; CHECK-NEXT: {{ $}}77 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp78 ; CHECK-NEXT: InOutZAUsePseudo79 ; CHECK-NEXT: BL @inout_call, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp80 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp81 ; CHECK-NEXT: {{ $}}82 ; CHECK-NEXT: bb.2 (%ir-block.4):83 ; CHECK-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp84 ; CHECK-NEXT: InOutZAUsePseudo85 ; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp86 ; CHECK-NEXT: TCRETURNdi @inout_call, 0, csr_aarch64_aapcs, implicit $sp87 88 bb.0 (%ir-block.1):89 successors: %bb.1, %bb.290 liveins: $w091 92 %0:gpr32common = COPY $w093 ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp94 RequiresZASavePseudo95 BL @clobber, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp96 ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp97 %1:gpr32 = SUBSWri %0, 101, 0, implicit-def $nzcv98 Bcc 11, %bb.2, implicit $nzcv99 B %bb.1100 101 bb.1 (%ir-block.3):102 ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp103 InOutZAUsePseudo104 BL @inout_call, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp105 ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp106 107 bb.2 (%ir-block.4):108 ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp109 InOutZAUsePseudo110 ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp111 TCRETURNdi @inout_call, 0, csr_aarch64_aapcs, implicit $sp112...113 114# CHECK-ASM-LABEL: cmp_branch115# CHECK-ASM: msr TPIDR2_EL0, x10116# CHECK-ASM-NEXT: bl clobber117# CHECK-ASM-NEXT: smstart za118# CHECK-ASM-NEXT: mrs x8, TPIDR2_EL0119# CHECK-ASM-NEXT: sub x0, x29, #16120# CHECK-ASM-NEXT: cbnz x8, .LBB0_2121# CHECK-ASM: bl __arm_tpidr2_restore122# CHECK-ASM-NEXT: .LBB0_2:123# CHECK-ASM-NEXT: cmp w20, #101124# CHECK-ASM-NEXT: msr TPIDR2_EL0, xzr125# CHECK-ASM-NEXT: b.lt .LBB0_4126# CHECK-ASM: bl inout_call127# CHECK-ASM-NEXT: .LBB0_4:128# CHECK-ASM: b inout_call129