| //===-- LanaiAluCode.h - ALU operator encoding ----------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // The encoding for ALU operators used in RM and RRM operands | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H | |
| #define LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H | |
| #include "llvm/ADT/StringSwitch.h" | |
| #include "llvm/CodeGen/ISDOpcodes.h" | |
| #include "llvm/Support/ErrorHandling.h" | |
| namespace llvm { | |
| namespace LPAC { | |
| enum AluCode { | |
| ADD = 0x00, | |
| ADDC = 0x01, | |
| SUB = 0x02, | |
| SUBB = 0x03, | |
| AND = 0x04, | |
| OR = 0x05, | |
| XOR = 0x06, | |
| SPECIAL = 0x07, | |
| // Shift instructions are treated as SPECIAL when encoding the machine | |
| // instruction, but kept distinct until lowering. The constant values are | |
| // chosen to ease lowering. | |
| SHL = 0x17, | |
| SRL = 0x27, | |
| SRA = 0x37, | |
| // Indicates an unknown/unsupported operator | |
| UNKNOWN = 0xFF, | |
| }; | |
| // Bits indicating post- and pre-operators should be tested and set using Is* | |
| // and Make* utility functions | |
| const int Lanai_PRE_OP = 0x40; | |
| const int Lanai_POST_OP = 0x80; | |
| inline static unsigned encodeLanaiAluCode(unsigned AluOp) { | |
| unsigned const OP_ENCODING_MASK = 0x07; | |
| return AluOp & OP_ENCODING_MASK; | |
| } | |
| inline static unsigned getAluOp(unsigned AluOp) { | |
| unsigned const ALU_MASK = 0x3F; | |
| return AluOp & ALU_MASK; | |
| } | |
| inline static bool isPreOp(unsigned AluOp) { return AluOp & Lanai_PRE_OP; } | |
| inline static bool isPostOp(unsigned AluOp) { return AluOp & Lanai_POST_OP; } | |
| inline static unsigned makePreOp(unsigned AluOp) { | |
| assert(!isPostOp(AluOp) && "Operator can't be a post- and pre-op"); | |
| return AluOp | Lanai_PRE_OP; | |
| } | |
| inline static unsigned makePostOp(unsigned AluOp) { | |
| assert(!isPreOp(AluOp) && "Operator can't be a post- and pre-op"); | |
| return AluOp | Lanai_POST_OP; | |
| } | |
| inline static bool modifiesOp(unsigned AluOp) { | |
| return isPreOp(AluOp) | isPostOp(AluOp); | |
| } | |
| inline static const char *lanaiAluCodeToString(unsigned AluOp) { | |
| switch (getAluOp(AluOp)) { | |
| case ADD: | |
| return "add"; | |
| case ADDC: | |
| return "addc"; | |
| case SUB: | |
| return "sub"; | |
| case SUBB: | |
| return "subb"; | |
| case AND: | |
| return "and"; | |
| case OR: | |
| return "or"; | |
| case XOR: | |
| return "xor"; | |
| case SHL: | |
| return "sh"; | |
| case SRL: | |
| return "sh"; | |
| case SRA: | |
| return "sha"; | |
| default: | |
| llvm_unreachable("Invalid ALU code."); | |
| } | |
| } | |
| inline static AluCode stringToLanaiAluCode(StringRef S) { | |
| return StringSwitch<AluCode>(S) | |
| .Case("add", ADD) | |
| .Case("addc", ADDC) | |
| .Case("sub", SUB) | |
| .Case("subb", SUBB) | |
| .Case("and", AND) | |
| .Case("or", OR) | |
| .Case("xor", XOR) | |
| .Case("sh", SHL) | |
| .Case("srl", SRL) | |
| .Case("sha", SRA) | |
| .Default(UNKNOWN); | |
| } | |
| inline static AluCode isdToLanaiAluCode(ISD::NodeType Node_type) { | |
| switch (Node_type) { | |
| case ISD::ADD: | |
| return AluCode::ADD; | |
| case ISD::ADDE: | |
| return AluCode::ADDC; | |
| case ISD::SUB: | |
| return AluCode::SUB; | |
| case ISD::SUBE: | |
| return AluCode::SUBB; | |
| case ISD::AND: | |
| return AluCode::AND; | |
| case ISD::OR: | |
| return AluCode::OR; | |
| case ISD::XOR: | |
| return AluCode::XOR; | |
| case ISD::SHL: | |
| return AluCode::SHL; | |
| case ISD::SRL: | |
| return AluCode::SRL; | |
| case ISD::SRA: | |
| return AluCode::SRA; | |
| default: | |
| return AluCode::UNKNOWN; | |
| } | |
| } | |
| } // namespace LPAC | |
| } // namespace llvm | |
| #endif // LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H |