1 //===-- VE.h - Top-level interface for VE representation --------*- C++ -*-===//
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains the entry points for global functions defined in the LLVM
10 // VE back-end.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_LIB_TARGET_VE_VE_H
15 #define LLVM_LIB_TARGET_VE_VE_H
16
17 #include "MCTargetDesc/VEMCTargetDesc.h"
18 #include "llvm/Support/ErrorHandling.h"
19 #include "llvm/Target/TargetMachine.h"
20
21 namespace llvm {
22 class FunctionPass;
23 class VETargetMachine;
24 class formatted_raw_ostream;
25 class AsmPrinter;
26 class MCInst;
27 class MachineInstr;
28
29 FunctionPass *createVEISelDag(VETargetMachine &TM);
30 FunctionPass *createVEPromoteToI1Pass();
31
32 void LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
33 AsmPrinter &AP);
34 } // namespace llvm
35
36 namespace llvm {
37 // Enums corresponding to VE condition codes, both icc's and fcc's. These
38 // values must be kept in sync with the ones in the .td file.
39 namespace VECC {
40 enum CondCodes {
41 // Integer comparison
42 CC_IG = 0, // Greater
43 CC_IL = 1, // Less
44 CC_INE = 2, // Not Equal
45 CC_IEQ = 3, // Equal
46 CC_IGE = 4, // Greater or Equal
47 CC_ILE = 5, // Less or Equal
48
49 // Floating point comparison
50 CC_AF = 0 + 6, // Never
51 CC_G = 1 + 6, // Greater
52 CC_L = 2 + 6, // Less
53 CC_NE = 3 + 6, // Not Equal
54 CC_EQ = 4 + 6, // Equal
55 CC_GE = 5 + 6, // Greater or Equal
56 CC_LE = 6 + 6, // Less or Equal
57 CC_NUM = 7 + 6, // Number
58 CC_NAN = 8 + 6, // NaN
59 CC_GNAN = 9 + 6, // Greater or NaN
60 CC_LNAN = 10 + 6, // Less or NaN
61 CC_NENAN = 11 + 6, // Not Equal or NaN
62 CC_EQNAN = 12 + 6, // Equal or NaN
63 CC_GENAN = 13 + 6, // Greater or Equal or NaN
64 CC_LENAN = 14 + 6, // Less or Equal or NaN
65 CC_AT = 15 + 6, // Always
66 };
67 }
68
VECondCodeToString(VECC::CondCodes CC)69 inline static const char *VECondCodeToString(VECC::CondCodes CC) {
70 switch (CC) {
71 case VECC::CC_IG: return "gt";
72 case VECC::CC_IL: return "lt";
73 case VECC::CC_INE: return "ne";
74 case VECC::CC_IEQ: return "eq";
75 case VECC::CC_IGE: return "ge";
76 case VECC::CC_ILE: return "le";
77 case VECC::CC_AF: return "af";
78 case VECC::CC_G: return "gt";
79 case VECC::CC_L: return "lt";
80 case VECC::CC_NE: return "ne";
81 case VECC::CC_EQ: return "eq";
82 case VECC::CC_GE: return "ge";
83 case VECC::CC_LE: return "le";
84 case VECC::CC_NUM: return "num";
85 case VECC::CC_NAN: return "nan";
86 case VECC::CC_GNAN: return "gtnan";
87 case VECC::CC_LNAN: return "ltnan";
88 case VECC::CC_NENAN: return "nenan";
89 case VECC::CC_EQNAN: return "eqnan";
90 case VECC::CC_GENAN: return "genan";
91 case VECC::CC_LENAN: return "lenan";
92 case VECC::CC_AT: return "at";
93 }
94 llvm_unreachable("Invalid cond code");
95 }
96
97 // Different to Hi_32/Lo_32 the HI32 and LO32 functions
98 // preserve the correct numerical value
99 // on the LLVM data type for MC immediates (int64_t).
HI32(int64_t imm)100 inline static int64_t HI32(int64_t imm) {
101 return (int32_t)(imm >> 32);
102 }
103
LO32(int64_t imm)104 inline static int64_t LO32(int64_t imm) {
105 return (int32_t)(imm);
106 }
107
108 } // namespace llvm
109 #endif
110