1 //===-- ARMFeatures.h - Checks for ARM instruction features -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains the code shared between ARM CodeGen and ARM MC 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_ARM_ARMFEATURES_H 14 #define LLVM_LIB_TARGET_ARM_ARMFEATURES_H 15 16 #include "MCTargetDesc/ARMMCTargetDesc.h" 17 18 namespace llvm { 19 20 template<typename InstrType> // could be MachineInstr or MCInst 21 bool IsCPSRDead(const InstrType *Instr); 22 23 template<typename InstrType> // could be MachineInstr or MCInst 24 inline bool isV8EligibleForIT(const InstrType *Instr) { 25 switch (Instr->getOpcode()) { 26 default: 27 return false; 28 case ARM::tADC: 29 case ARM::tADDi3: 30 case ARM::tADDi8: 31 case ARM::tADDrr: 32 case ARM::tAND: 33 case ARM::tASRri: 34 case ARM::tASRrr: 35 case ARM::tBIC: 36 case ARM::tEOR: 37 case ARM::tLSLri: 38 case ARM::tLSLrr: 39 case ARM::tLSRri: 40 case ARM::tLSRrr: 41 case ARM::tMOVi8: 42 case ARM::tMUL: 43 case ARM::tMVN: 44 case ARM::tORR: 45 case ARM::tROR: 46 case ARM::tRSB: 47 case ARM::tSBC: 48 case ARM::tSUBi3: 49 case ARM::tSUBi8: 50 case ARM::tSUBrr: 51 // Outside of an IT block, these set CPSR. 52 return IsCPSRDead(Instr); 53 case ARM::tADDrSPi: 54 case ARM::tCMNz: 55 case ARM::tCMPi8: 56 case ARM::tCMPr: 57 case ARM::tLDRBi: 58 case ARM::tLDRBr: 59 case ARM::tLDRHi: 60 case ARM::tLDRHr: 61 case ARM::tLDRSB: 62 case ARM::tLDRSH: 63 case ARM::tLDRi: 64 case ARM::tLDRr: 65 case ARM::tLDRspi: 66 case ARM::tSTRBi: 67 case ARM::tSTRBr: 68 case ARM::tSTRHi: 69 case ARM::tSTRHr: 70 case ARM::tSTRi: 71 case ARM::tSTRr: 72 case ARM::tSTRspi: 73 case ARM::tTST: 74 return true; 75 // there are some "conditionally deprecated" opcodes 76 case ARM::tADDspr: 77 case ARM::tBLXr: 78 case ARM::tBLXr_noip: 79 return Instr->getOperand(2).getReg() != ARM::PC; 80 // ADD PC, SP and BLX PC were always unpredictable, 81 // now on top of it they're deprecated 82 case ARM::tADDrSP: 83 case ARM::tBX: 84 return Instr->getOperand(0).getReg() != ARM::PC; 85 case ARM::tADDhirr: 86 return Instr->getOperand(0).getReg() != ARM::PC && 87 Instr->getOperand(2).getReg() != ARM::PC; 88 case ARM::tCMPhir: 89 case ARM::tMOVr: 90 return Instr->getOperand(0).getReg() != ARM::PC && 91 Instr->getOperand(1).getReg() != ARM::PC; 92 } 93 } 94 95 } 96 97 #endif 98