blob: 5cd7006c22fc36cbb1dae8ef981eb7d2d02a625e [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//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Amara Emerson52cfb6a2013-10-03 09:31:51 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the code shared between ARM CodeGen and ARM MC
10//
11//===----------------------------------------------------------------------===//
12
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000013#ifndef LLVM_LIB_TARGET_ARM_ARMFEATURES_H
14#define LLVM_LIB_TARGET_ARM_ARMFEATURES_H
Amara Emerson52cfb6a2013-10-03 09:31:51 +000015
Craig Toppera9253262014-03-22 23:51:00 +000016#include "MCTargetDesc/ARMMCTargetDesc.h"
Amara Emerson52cfb6a2013-10-03 09:31:51 +000017
Benjamin Kramer30120c02014-04-12 18:39:57 +000018namespace llvm {
19
Artyom Skrobov1a6cd1d2014-02-26 11:27:28 +000020template<typename InstrType> // could be MachineInstr or MCInst
Krzysztof Parzyszekcc318712017-03-03 18:30:54 +000021bool IsCPSRDead(const InstrType *Instr);
Artyom Skrobov1a6cd1d2014-02-26 11:27:28 +000022
Amara Emerson52cfb6a2013-10-03 09:31:51 +000023template<typename InstrType> // could be MachineInstr or MCInst
Krzysztof Parzyszekcc318712017-03-03 18:30:54 +000024inline bool isV8EligibleForIT(const InstrType *Instr) {
Amara Emerson52cfb6a2013-10-03 09:31:51 +000025 switch (Instr->getOpcode()) {
26 default:
27 return false;
28 case ARM::tADC:
29 case ARM::tADDi3:
30 case ARM::tADDi8:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000031 case ARM::tADDrr:
32 case ARM::tAND:
33 case ARM::tASRri:
34 case ARM::tASRrr:
35 case ARM::tBIC:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000036 case ARM::tEOR:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000037 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:
Artyom Skrobov1a6cd1d2014-02-26 11:27:28 +000048 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:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000066 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:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000073 case ARM::tTST:
74 return true;
75// there are some "conditionally deprecated" opcodes
76 case ARM::tADDspr:
Weiming Zhao5930ae62014-01-23 19:55:33 +000077 case ARM::tBLXr:
Amara Emerson52cfb6a2013-10-03 09:31:51 +000078 return Instr->getOperand(2).getReg() != ARM::PC;
79 // ADD PC, SP and BLX PC were always unpredictable,
80 // now on top of it they're deprecated
81 case ARM::tADDrSP:
82 case ARM::tBX:
83 return Instr->getOperand(0).getReg() != ARM::PC;
Amara Emerson52cfb6a2013-10-03 09:31:51 +000084 case ARM::tADDhirr:
85 return Instr->getOperand(0).getReg() != ARM::PC &&
86 Instr->getOperand(2).getReg() != ARM::PC;
87 case ARM::tCMPhir:
88 case ARM::tMOVr:
89 return Instr->getOperand(0).getReg() != ARM::PC &&
90 Instr->getOperand(1).getReg() != ARM::PC;
91 }
92}
93
Alexander Kornienkof00654e2015-06-23 09:49:53 +000094}
Benjamin Kramerb3b79a42013-10-10 14:35:45 +000095
Amara Emerson52cfb6a2013-10-03 09:31:51 +000096#endif