1 //===-- LanaiAluCode.h - ALU operator encoding ----------------------------===//
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-exception
7 //===----------------------------------------------------------------------===//
9 // The encoding for ALU operators used in RM and RRM operands
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H
14 #define LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H
16 #include "llvm/ADT/StringSwitch.h"
17 #include "llvm/Support/ErrorHandling.h"
31 // Shift instructions are treated as SPECIAL when encoding the machine
32 // instruction, but kept distinct until lowering. The constant values are
33 // chosen to ease lowering.
38 // Indicates an unknown/unsupported operator
42 // Bits indicating post- and pre-operators should be tested and set using Is*
43 // and Make* utility functions
44 const int Lanai_PRE_OP
= 0x40;
45 const int Lanai_POST_OP
= 0x80;
47 inline static unsigned encodeLanaiAluCode(unsigned AluOp
) {
48 unsigned const OP_ENCODING_MASK
= 0x07;
49 return AluOp
& OP_ENCODING_MASK
;
52 inline static unsigned getAluOp(unsigned AluOp
) {
53 unsigned const ALU_MASK
= 0x3F;
54 return AluOp
& ALU_MASK
;
57 inline static bool isPreOp(unsigned AluOp
) { return AluOp
& Lanai_PRE_OP
; }
59 inline static bool isPostOp(unsigned AluOp
) { return AluOp
& Lanai_POST_OP
; }
61 inline static unsigned makePreOp(unsigned AluOp
) {
62 assert(!isPostOp(AluOp
) && "Operator can't be a post- and pre-op");
63 return AluOp
| Lanai_PRE_OP
;
66 inline static unsigned makePostOp(unsigned AluOp
) {
67 assert(!isPreOp(AluOp
) && "Operator can't be a post- and pre-op");
68 return AluOp
| Lanai_POST_OP
;
71 inline static bool modifiesOp(unsigned AluOp
) {
72 return isPreOp(AluOp
) || isPostOp(AluOp
);
75 inline static const char *lanaiAluCodeToString(unsigned AluOp
) {
76 switch (getAluOp(AluOp
)) {
98 llvm_unreachable("Invalid ALU code.");
102 inline static AluCode
stringToLanaiAluCode(StringRef S
) {
103 return StringSwitch
<AluCode
>(S
)
119 #endif // LLVM_LIB_TARGET_LANAI_LANAIALUCODE_H