| //===- AArch64SchedPredExynos.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 Exynos processors. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // Auxiliary predicates. |
| |
| // Check the shift in arithmetic and logic instructions. |
| def ExynosCheckShift : CheckAny<[CheckShiftBy0, |
| CheckAll< |
| [CheckShiftLSL, |
| CheckAny< |
| [CheckShiftBy1, |
| CheckShiftBy2, |
| CheckShiftBy3]>]>]>; |
| |
| // Exynos predicates. |
| |
| // Identify BLR specifying the LR register as the indirect target register. |
| def ExynosBranchLinkLRPred : MCSchedPredicate< |
| CheckAll<[CheckOpcode<[BLR]>, |
| CheckRegOperand<0, LR>]>>; |
| |
| // Identify arithmetic instructions without or with limited extension or shift. |
| def ExynosArithFn : TIIPredicate< |
| "isExynosArithFast", |
| MCOpcodeSwitchStatement< |
| [MCOpcodeSwitchCase< |
| IsArithExtOp.ValidOpcodes, |
| MCReturnStatement< |
| CheckAny<[CheckExtBy0, |
| CheckAll< |
| [CheckAny< |
| [CheckExtUXTW, |
| CheckExtUXTX]>, |
| CheckAny< |
| [CheckExtBy1, |
| CheckExtBy2, |
| CheckExtBy3]>]>]>>>, |
| MCOpcodeSwitchCase< |
| IsArithShiftOp.ValidOpcodes, |
| MCReturnStatement<ExynosCheckShift>>, |
| MCOpcodeSwitchCase< |
| IsArithUnshiftOp.ValidOpcodes, |
| MCReturnStatement<TruePred>>, |
| MCOpcodeSwitchCase< |
| IsArithImmOp.ValidOpcodes, |
| MCReturnStatement<TruePred>>], |
| MCReturnStatement<FalsePred>>>; |
| def ExynosArithPred : MCSchedPredicate<ExynosArithFn>; |
| |
| // Identify logic instructions with limited shift. |
| def ExynosLogicFn : TIIPredicate< |
| "isExynosLogicFast", |
| MCOpcodeSwitchStatement< |
| [MCOpcodeSwitchCase< |
| IsLogicShiftOp.ValidOpcodes, |
| MCReturnStatement<ExynosCheckShift>>, |
| MCOpcodeSwitchCase< |
| IsLogicUnshiftOp.ValidOpcodes, |
| MCReturnStatement<TruePred>>, |
| MCOpcodeSwitchCase< |
| IsLogicImmOp.ValidOpcodes, |
| MCReturnStatement<TruePred>>], |
| MCReturnStatement<FalsePred>>>; |
| def ExynosLogicPred : MCSchedPredicate<ExynosLogicFn>; |
| |
| // Identify more logic instructions with limited shift. |
| def ExynosLogicExFn : TIIPredicate< |
| "isExynosLogicExFast", |
| MCOpcodeSwitchStatement< |
| [MCOpcodeSwitchCase< |
| IsLogicShiftOp.ValidOpcodes, |
| MCReturnStatement< |
| CheckAny< |
| [ExynosCheckShift, |
| CheckAll< |
| [CheckShiftLSL, |
| CheckShiftBy8]>]>>>, |
| MCOpcodeSwitchCase< |
| IsLogicUnshiftOp.ValidOpcodes, |
| MCReturnStatement<TruePred>>, |
| MCOpcodeSwitchCase< |
| IsLogicImmOp.ValidOpcodes, |
| MCReturnStatement<TruePred>>], |
| MCReturnStatement<FalsePred>>>; |
| def ExynosLogicExPred : MCSchedPredicate<ExynosLogicExFn>; |
| |
| // Identify a load or store using the register offset addressing mode |
| // with a scaled non-extended register. |
| def ExynosScaledIdxFn : TIIPredicate<"isExynosScaledAddr", |
| MCOpcodeSwitchStatement< |
| [MCOpcodeSwitchCase< |
| IsLoadStoreRegOffsetOp.ValidOpcodes, |
| MCReturnStatement< |
| CheckAny< |
| [CheckMemExtSXTW, |
| CheckMemExtUXTW, |
| CheckMemScaled]>>>], |
| MCReturnStatement<FalsePred>>>; |
| def ExynosScaledIdxPred : MCSchedPredicate<ExynosScaledIdxFn>; |
| |
| // Identify FP instructions. |
| def ExynosFPPred : MCSchedPredicate<CheckAny<[CheckHForm, |
| CheckSForm, |
| CheckDForm, |
| CheckQForm]>>; |
| |
| // Identify 128-bit NEON instructions. |
| def ExynosQFormPred : MCSchedPredicate<CheckQForm>; |
| |
| // Identify instructions that reset a register efficiently. |
| def ExynosResetFn : TIIPredicate< |
| "isExynosResetFast", |
| MCOpcodeSwitchStatement< |
| [MCOpcodeSwitchCase< |
| [ADR, ADRP, |
| MOVNWi, MOVNXi, |
| MOVZWi, MOVZXi], |
| MCReturnStatement<TruePred>>, |
| MCOpcodeSwitchCase< |
| [ORRWri, ORRXri], |
| MCReturnStatement< |
| CheckAll< |
| [CheckIsRegOperand<1>, |
| CheckAny< |
| [CheckRegOperand<1, WZR>, |
| CheckRegOperand<1, XZR>]>]>>>], |
| MCReturnStatement< |
| CheckAny< |
| [IsCopyIdiomFn, |
| IsZeroFPIdiomFn]>>>>; |
| def ExynosResetPred : MCSchedPredicate<ExynosResetFn>; |
| |
| // Identify EXTR as the alias for ROR (immediate). |
| def ExynosRotateRightImmPred : MCSchedPredicate< |
| CheckAll<[CheckOpcode<[EXTRWrri, EXTRXrri]>, |
| CheckSameRegOperand<1, 2>]>>; |
| |
| // Identify cheap arithmetic and logic immediate instructions. |
| def ExynosCheapFn : TIIPredicate< |
| "isExynosCheapAsMove", |
| MCOpcodeSwitchStatement< |
| [MCOpcodeSwitchCase< |
| IsArithLogicImmOp.ValidOpcodes, |
| MCReturnStatement<TruePred>>], |
| MCReturnStatement< |
| CheckAny< |
| [ExynosArithFn, ExynosResetFn, ExynosLogicFn]>>>>; |