1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
//===- 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]>,
CheckIsImmOperand<1>,
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>]>
]>>;
|