xref: /aosp_15_r20/external/llvm/lib/Target/ARM/ARMFeatures.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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 Worker inline 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