Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/ARM/ARMFeatures.h
35294 views
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
99