xref: /aosp_15_r20/external/llvm/lib/Target/Lanai/LanaiAluCode.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- LanaiAluCode.h - ALU operator encoding ----------------------------===//
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 // The encoding for ALU operators used in RM and RRM operands
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H
15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringSwitch.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/ISDOpcodes.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker namespace llvm {
22*9880d681SAndroid Build Coastguard Worker namespace LPAC {
23*9880d681SAndroid Build Coastguard Worker enum AluCode {
24*9880d681SAndroid Build Coastguard Worker   ADD = 0x00,
25*9880d681SAndroid Build Coastguard Worker   ADDC = 0x01,
26*9880d681SAndroid Build Coastguard Worker   SUB = 0x02,
27*9880d681SAndroid Build Coastguard Worker   SUBB = 0x03,
28*9880d681SAndroid Build Coastguard Worker   AND = 0x04,
29*9880d681SAndroid Build Coastguard Worker   OR = 0x05,
30*9880d681SAndroid Build Coastguard Worker   XOR = 0x06,
31*9880d681SAndroid Build Coastguard Worker   SPECIAL = 0x07,
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker   // Shift instructions are treated as SPECIAL when encoding the machine
34*9880d681SAndroid Build Coastguard Worker   // instruction, but kept distinct until lowering. The constant values are
35*9880d681SAndroid Build Coastguard Worker   // chosen to ease lowering.
36*9880d681SAndroid Build Coastguard Worker   SHL = 0x17,
37*9880d681SAndroid Build Coastguard Worker   SRL = 0x27,
38*9880d681SAndroid Build Coastguard Worker   SRA = 0x37,
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker   // Indicates an unknown/unsupported operator
41*9880d681SAndroid Build Coastguard Worker   UNKNOWN = 0xFF,
42*9880d681SAndroid Build Coastguard Worker };
43*9880d681SAndroid Build Coastguard Worker 
44*9880d681SAndroid Build Coastguard Worker // Bits indicating post- and pre-operators should be tested and set using Is*
45*9880d681SAndroid Build Coastguard Worker // and Make* utility functions
46*9880d681SAndroid Build Coastguard Worker constexpr int Lanai_PRE_OP = 0x40;
47*9880d681SAndroid Build Coastguard Worker constexpr int Lanai_POST_OP = 0x80;
48*9880d681SAndroid Build Coastguard Worker 
encodeLanaiAluCode(unsigned AluOp)49*9880d681SAndroid Build Coastguard Worker inline static unsigned encodeLanaiAluCode(unsigned AluOp) {
50*9880d681SAndroid Build Coastguard Worker   unsigned const OP_ENCODING_MASK = 0x07;
51*9880d681SAndroid Build Coastguard Worker   return AluOp & OP_ENCODING_MASK;
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker 
getAluOp(unsigned AluOp)54*9880d681SAndroid Build Coastguard Worker inline static unsigned getAluOp(unsigned AluOp) {
55*9880d681SAndroid Build Coastguard Worker   unsigned const ALU_MASK = 0x3F;
56*9880d681SAndroid Build Coastguard Worker   return AluOp & ALU_MASK;
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker 
isPreOp(unsigned AluOp)59*9880d681SAndroid Build Coastguard Worker inline static bool isPreOp(unsigned AluOp) { return AluOp & Lanai_PRE_OP; }
60*9880d681SAndroid Build Coastguard Worker 
isPostOp(unsigned AluOp)61*9880d681SAndroid Build Coastguard Worker inline static bool isPostOp(unsigned AluOp) { return AluOp & Lanai_POST_OP; }
62*9880d681SAndroid Build Coastguard Worker 
makePreOp(unsigned AluOp)63*9880d681SAndroid Build Coastguard Worker inline static unsigned makePreOp(unsigned AluOp) {
64*9880d681SAndroid Build Coastguard Worker   assert(!isPostOp(AluOp) && "Operator can't be a post- and pre-op");
65*9880d681SAndroid Build Coastguard Worker   return AluOp | Lanai_PRE_OP;
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker 
makePostOp(unsigned AluOp)68*9880d681SAndroid Build Coastguard Worker inline static unsigned makePostOp(unsigned AluOp) {
69*9880d681SAndroid Build Coastguard Worker   assert(!isPreOp(AluOp) && "Operator can't be a post- and pre-op");
70*9880d681SAndroid Build Coastguard Worker   return AluOp | Lanai_POST_OP;
71*9880d681SAndroid Build Coastguard Worker }
72*9880d681SAndroid Build Coastguard Worker 
modifiesOp(unsigned AluOp)73*9880d681SAndroid Build Coastguard Worker inline static bool modifiesOp(unsigned AluOp) {
74*9880d681SAndroid Build Coastguard Worker   return isPreOp(AluOp) | isPostOp(AluOp);
75*9880d681SAndroid Build Coastguard Worker }
76*9880d681SAndroid Build Coastguard Worker 
lanaiAluCodeToString(unsigned AluOp)77*9880d681SAndroid Build Coastguard Worker inline static const char *lanaiAluCodeToString(unsigned AluOp) {
78*9880d681SAndroid Build Coastguard Worker   switch (getAluOp(AluOp)) {
79*9880d681SAndroid Build Coastguard Worker   case ADD:
80*9880d681SAndroid Build Coastguard Worker     return "add";
81*9880d681SAndroid Build Coastguard Worker   case ADDC:
82*9880d681SAndroid Build Coastguard Worker     return "addc";
83*9880d681SAndroid Build Coastguard Worker   case SUB:
84*9880d681SAndroid Build Coastguard Worker     return "sub";
85*9880d681SAndroid Build Coastguard Worker   case SUBB:
86*9880d681SAndroid Build Coastguard Worker     return "subb";
87*9880d681SAndroid Build Coastguard Worker   case AND:
88*9880d681SAndroid Build Coastguard Worker     return "and";
89*9880d681SAndroid Build Coastguard Worker   case OR:
90*9880d681SAndroid Build Coastguard Worker     return "or";
91*9880d681SAndroid Build Coastguard Worker   case XOR:
92*9880d681SAndroid Build Coastguard Worker     return "xor";
93*9880d681SAndroid Build Coastguard Worker   case SHL:
94*9880d681SAndroid Build Coastguard Worker     return "sh";
95*9880d681SAndroid Build Coastguard Worker   case SRL:
96*9880d681SAndroid Build Coastguard Worker     return "sh";
97*9880d681SAndroid Build Coastguard Worker   case SRA:
98*9880d681SAndroid Build Coastguard Worker     return "sha";
99*9880d681SAndroid Build Coastguard Worker   default:
100*9880d681SAndroid Build Coastguard Worker     llvm_unreachable("Invalid ALU code.");
101*9880d681SAndroid Build Coastguard Worker   }
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker 
stringToLanaiAluCode(StringRef S)104*9880d681SAndroid Build Coastguard Worker inline static AluCode stringToLanaiAluCode(StringRef S) {
105*9880d681SAndroid Build Coastguard Worker   return StringSwitch<AluCode>(S)
106*9880d681SAndroid Build Coastguard Worker       .Case("add", ADD)
107*9880d681SAndroid Build Coastguard Worker       .Case("addc", ADDC)
108*9880d681SAndroid Build Coastguard Worker       .Case("sub", SUB)
109*9880d681SAndroid Build Coastguard Worker       .Case("subb", SUBB)
110*9880d681SAndroid Build Coastguard Worker       .Case("and", AND)
111*9880d681SAndroid Build Coastguard Worker       .Case("or", OR)
112*9880d681SAndroid Build Coastguard Worker       .Case("xor", XOR)
113*9880d681SAndroid Build Coastguard Worker       .Case("sh", SHL)
114*9880d681SAndroid Build Coastguard Worker       .Case("srl", SRL)
115*9880d681SAndroid Build Coastguard Worker       .Case("sha", SRA)
116*9880d681SAndroid Build Coastguard Worker       .Default(UNKNOWN);
117*9880d681SAndroid Build Coastguard Worker }
118*9880d681SAndroid Build Coastguard Worker 
isdToLanaiAluCode(ISD::NodeType Node_type)119*9880d681SAndroid Build Coastguard Worker inline static AluCode isdToLanaiAluCode(ISD::NodeType Node_type) {
120*9880d681SAndroid Build Coastguard Worker   switch (Node_type) {
121*9880d681SAndroid Build Coastguard Worker   case ISD::ADD:
122*9880d681SAndroid Build Coastguard Worker     return AluCode::ADD;
123*9880d681SAndroid Build Coastguard Worker   case ISD::ADDE:
124*9880d681SAndroid Build Coastguard Worker     return AluCode::ADDC;
125*9880d681SAndroid Build Coastguard Worker   case ISD::SUB:
126*9880d681SAndroid Build Coastguard Worker     return AluCode::SUB;
127*9880d681SAndroid Build Coastguard Worker   case ISD::SUBE:
128*9880d681SAndroid Build Coastguard Worker     return AluCode::SUBB;
129*9880d681SAndroid Build Coastguard Worker   case ISD::AND:
130*9880d681SAndroid Build Coastguard Worker     return AluCode::AND;
131*9880d681SAndroid Build Coastguard Worker   case ISD::OR:
132*9880d681SAndroid Build Coastguard Worker     return AluCode::OR;
133*9880d681SAndroid Build Coastguard Worker   case ISD::XOR:
134*9880d681SAndroid Build Coastguard Worker     return AluCode::XOR;
135*9880d681SAndroid Build Coastguard Worker   case ISD::SHL:
136*9880d681SAndroid Build Coastguard Worker     return AluCode::SHL;
137*9880d681SAndroid Build Coastguard Worker   case ISD::SRL:
138*9880d681SAndroid Build Coastguard Worker     return AluCode::SRL;
139*9880d681SAndroid Build Coastguard Worker   case ISD::SRA:
140*9880d681SAndroid Build Coastguard Worker     return AluCode::SRA;
141*9880d681SAndroid Build Coastguard Worker   default:
142*9880d681SAndroid Build Coastguard Worker     return AluCode::UNKNOWN;
143*9880d681SAndroid Build Coastguard Worker   }
144*9880d681SAndroid Build Coastguard Worker }
145*9880d681SAndroid Build Coastguard Worker } // namespace LPAC
146*9880d681SAndroid Build Coastguard Worker } // namespace llvm
147*9880d681SAndroid Build Coastguard Worker 
148*9880d681SAndroid Build Coastguard Worker #endif // LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H
149