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