blob: 8c0df4c2cbf9498a888ebb9a5453e4c7190ca455 [file] [log] [blame]
Jim Grosbachbb1af942014-04-03 23:43:22 +00001//===-- ARMFeatures.h - Checks for ARM instruction features -----*- C++ -*-===//
Amara Emerson52cfb6a2013-10-03 09:31:51 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the code shared between ARM CodeGen and ARM MC
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_ARM_ARMFEATURES_H
15#define LLVM_LIB_TARGET_ARM_ARMFEATURES_H
Amara Emerson52cfb6a2013-10-03 09:31:51 +000016
Craig Toppera9253262014-03-22 23:51:00 +000017#include "MCTargetDesc/ARMMCTargetDesc.h"
Amara Emerson52cfb6a2013-10-03 09:31:51 +000018
Benjamin Kramer30120c02014-04-12 18:39:57 +000019namespace llvm {
20
Artyom Skrobov1a6cd1d2014-02-26 11:27:28 +000021template<typename InstrType> // could be MachineInstr or MCInst
Krzysztof Parzyszekcc318712017-03-03 18:30:54 +000022bool IsCPSRDead(const InstrType *Instr);
Artyom Skrobov1a6cd1d2014-02-26 11:27:28 +000023
Amara Emerson52cfb6a2013-10-03 09:31:51 +000024template<typename InstrType> // could be MachineInstr or MCInst
Krzysztof Parzyszekcc318712017-03-03 18:30:54 +000025inline bool isV8EligibleForIT(const InstrType *Instr) {
Amara Emerson52cfb6a2013-10-03 09:31:51 +000026 switch (Instr->getOpcode()) {
27 default:
28 return false;
29 case ARM::tADC:
30 case ARM::tADDi3:
31 case ARM::tADDi8:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000032 case ARM::tADDrr:
33 case ARM::tAND:
34 case ARM::tASRri:
35 case ARM::tASRrr:
36 case ARM::tBIC:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000037 case ARM::tEOR:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000038 case ARM::tLSLri:
39 case ARM::tLSLrr:
40 case ARM::tLSRri:
41 case ARM::tLSRrr:
42 case ARM::tMOVi8:
43 case ARM::tMUL:
44 case ARM::tMVN:
45 case ARM::tORR:
46 case ARM::tROR:
47 case ARM::tRSB:
48 case ARM::tSBC:
Artyom Skrobov1a6cd1d2014-02-26 11:27:28 +000049 case ARM::tSUBi3:
50 case ARM::tSUBi8:
51 case ARM::tSUBrr:
52 // Outside of an IT block, these set CPSR.
53 return IsCPSRDead(Instr);
54 case ARM::tADDrSPi:
55 case ARM::tCMNz:
56 case ARM::tCMPi8:
57 case ARM::tCMPr:
58 case ARM::tLDRBi:
59 case ARM::tLDRBr:
60 case ARM::tLDRHi:
61 case ARM::tLDRHr:
62 case ARM::tLDRSB:
63 case ARM::tLDRSH:
64 case ARM::tLDRi:
65 case ARM::tLDRr:
66 case ARM::tLDRspi:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000067 case ARM::tSTRBi:
68 case ARM::tSTRBr:
69 case ARM::tSTRHi:
70 case ARM::tSTRHr:
71 case ARM::tSTRi:
72 case ARM::tSTRr:
73 case ARM::tSTRspi:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000074 case ARM::tTST:
75 return true;
76// there are some "conditionally deprecated" opcodes
77 case ARM::tADDspr:
Weiming Zhao5930ae62014-01-23 19:55:33 +000078 case ARM::tBLXr:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000079 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;
Amara Emerson52cfb6a2013-10-03 09:31:51 +000085 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
Alexander Kornienkof00654e2015-06-23 09:49:53 +000095}
Benjamin Kramerb3b79a42013-10-10 14:35:45 +000096
Amara Emerson52cfb6a2013-10-03 09:31:51 +000097#endif