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