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