| //===- AArch64SchedPredNeoverse.td - AArch64 Sched Preds -----*- tablegen -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines scheduling predicate definitions that are used by the |
| // AArch64 Neoverse processors. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // Auxiliary predicates. |
| |
| // Check for LSL shift == 0 |
| def NeoverseNoLSL : MCSchedPredicate< |
| CheckAll<[CheckShiftLSL, |
| CheckShiftBy0]>>; |
| |
| // Identify LDR/STR H/Q-form scaled (and potentially extended) FP instructions |
| def NeoverseHQForm : MCSchedPredicate< |
| CheckAll<[ |
| CheckAny<[CheckHForm, CheckQForm]>, |
| CheckImmOperand<4, 1>]>>; |
| |
| // Check if <Pd> == <Pg> |
| def NeoversePdIsPgFn : TIIPredicate< |
| "isNeoversePdSameAsPg", |
| MCOpcodeSwitchStatement< |
| [MCOpcodeSwitchCase<[BRKA_PPmP, BRKB_PPmP], |
| MCReturnStatement<CheckSameRegOperand<1, 2>>>], |
| MCReturnStatement<CheckSameRegOperand<0, 1>>>>; |
| def NeoversePdIsPg : MCSchedPredicate<NeoversePdIsPgFn>; |
| |
| // Check if SVE INC/DEC (scalar), ALL, {1, 2, 4} |
| def NeoverseCheapIncDec : MCSchedPredicate< |
| CheckAll<[CheckOpcode<[ |
| INCB_XPiI, INCH_XPiI, |
| INCW_XPiI, INCD_XPiI, |
| DECB_XPiI, DECH_XPiI, |
| DECW_XPiI, DECD_XPiI]>, |
| CheckImmOperand<2, 31>, |
| CheckAny<[ |
| CheckImmOperand<3, 1>, |
| CheckImmOperand<3, 2>, |
| CheckImmOperand<3, 4>]>]>>; |
| |
| // Identify "[SU]?(MADD|MSUB)L?" as the alias for "[SU]?(MUL|MNEG)L?". |
| def NeoverseMULIdiomPred : MCSchedPredicate< // <op> Rd, Rs, Rv, ZR |
| CheckAll<[CheckOpcode< |
| [MADDWrrr, MADDXrrr, |
| MSUBWrrr, MSUBXrrr, |
| SMADDLrrr, UMADDLrrr, |
| SMSUBLrrr, UMSUBLrrr]>, |
| CheckIsReg3Zero]>>; |
| |
| def NeoverseZeroMove : MCSchedPredicate< |
| CheckAny<[ |
| // MOV Wd, #0 |
| // MOV Xd, #0 |
| CheckAll<[CheckOpcode<[MOVZWi, MOVZXi]>, |
| CheckAll<[CheckImmOperand<1, 0>, |
| CheckImmOperand<2, 0>]>]>, |
| // MOV Wd, WZR |
| // MOV Xd, XZR |
| // MOV Wd, Wn |
| // MOV Xd, Xn |
| CheckAll<[CheckOpcode<[ORRWrs, ORRXrs]>, |
| CheckAll<[CheckIsReg1Zero, |
| CheckImmOperand<3, 0>]>]>, |
| // FMOV Hd, WZR |
| // FMOV Hd, XZR |
| // FMOV Sd, WZR |
| // FMOV Dd, XZR |
| CheckAll<[CheckOpcode<[FMOVWHr, FMOVXHr, |
| FMOVWSr, FMOVXDr]>, |
| CheckIsReg1Zero]>, |
| // MOVI Dd, #0 |
| // MOVI Vd.2D, #0 |
| CheckAll<[CheckOpcode<[MOVID, MOVIv2d_ns]>, |
| CheckImmOperand<1, 0>]> |
| ]>>; |