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
21namespace llvm {
22class FunctionPass;
23class VETargetMachine;
24class formatted_raw_ostream;
25class AsmPrinter;
26class MCInst;
27class MachineInstr;
28
29FunctionPass *createVEISelDag(VETargetMachine &TM);
30FunctionPass *createVEPromoteToI1Pass();
31
32void LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
33                                 AsmPrinter &AP);
34} // namespace llvm
35
36namespace 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.
39namespace VECC {
40enum 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
69inline 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).
100inline static int64_t HI32(int64_t imm) {
101  return (int32_t)(imm >> 32);
102}
103
104inline static int64_t LO32(int64_t imm) {
105  return (int32_t)(imm);
106}
107
108} // namespace llvm
109#endif
110