brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 0494dda Raw
120 lines · c
1//===-- LanaiAluCode.h - ALU operator encoding ----------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// The encoding for ALU operators used in RM and RRM operands10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H14#define LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H15 16#include "llvm/ADT/StringSwitch.h"17#include "llvm/Support/ErrorHandling.h"18 19namespace llvm {20namespace LPAC {21enum AluCode {22  ADD = 0x00,23  ADDC = 0x01,24  SUB = 0x02,25  SUBB = 0x03,26  AND = 0x04,27  OR = 0x05,28  XOR = 0x06,29  SPECIAL = 0x07,30 31  // Shift instructions are treated as SPECIAL when encoding the machine32  // instruction, but kept distinct until lowering. The constant values are33  // chosen to ease lowering.34  SHL = 0x17,35  SRL = 0x27,36  SRA = 0x37,37 38  // Indicates an unknown/unsupported operator39  UNKNOWN = 0xFF,40};41 42// Bits indicating post- and pre-operators should be tested and set using Is*43// and Make* utility functions44const int Lanai_PRE_OP = 0x40;45const int Lanai_POST_OP = 0x80;46 47inline static unsigned encodeLanaiAluCode(unsigned AluOp) {48  unsigned const OP_ENCODING_MASK = 0x07;49  return AluOp & OP_ENCODING_MASK;50}51 52inline static unsigned getAluOp(unsigned AluOp) {53  unsigned const ALU_MASK = 0x3F;54  return AluOp & ALU_MASK;55}56 57inline static bool isPreOp(unsigned AluOp) { return AluOp & Lanai_PRE_OP; }58 59inline static bool isPostOp(unsigned AluOp) { return AluOp & Lanai_POST_OP; }60 61inline static unsigned makePreOp(unsigned AluOp) {62  assert(!isPostOp(AluOp) && "Operator can't be a post- and pre-op");63  return AluOp | Lanai_PRE_OP;64}65 66inline static unsigned makePostOp(unsigned AluOp) {67  assert(!isPreOp(AluOp) && "Operator can't be a post- and pre-op");68  return AluOp | Lanai_POST_OP;69}70 71inline static bool modifiesOp(unsigned AluOp) {72  return isPreOp(AluOp) || isPostOp(AluOp);73}74 75inline static const char *lanaiAluCodeToString(unsigned AluOp) {76  switch (getAluOp(AluOp)) {77  case ADD:78    return "add";79  case ADDC:80    return "addc";81  case SUB:82    return "sub";83  case SUBB:84    return "subb";85  case AND:86    return "and";87  case OR:88    return "or";89  case XOR:90    return "xor";91  case SHL:92    return "sh";93  case SRL:94    return "sh";95  case SRA:96    return "sha";97  default:98    llvm_unreachable("Invalid ALU code.");99  }100}101 102inline static AluCode stringToLanaiAluCode(StringRef S) {103  return StringSwitch<AluCode>(S)104      .Case("add", ADD)105      .Case("addc", ADDC)106      .Case("sub", SUB)107      .Case("subb", SUBB)108      .Case("and", AND)109      .Case("or", OR)110      .Case("xor", XOR)111      .Case("sh", SHL)112      .Case("srl", SRL)113      .Case("sha", SRA)114      .Default(UNKNOWN);115}116} // namespace LPAC117} // namespace llvm118 119#endif // LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H120