1356843Sdim//===-- VE.h - Top-level interface for VE representation --------*- C++ -*-===//
2356843Sdim//
3356843Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4356843Sdim// See https://llvm.org/LICENSE.txt for license information.
5356843Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6356843Sdim//
7356843Sdim//===----------------------------------------------------------------------===//
8356843Sdim//
9356843Sdim// This file contains the entry points for global functions defined in the LLVM
10356843Sdim// VE back-end.
11356843Sdim//
12356843Sdim//===----------------------------------------------------------------------===//
13356843Sdim
14356843Sdim#ifndef LLVM_LIB_TARGET_VE_VE_H
15356843Sdim#define LLVM_LIB_TARGET_VE_VE_H
16356843Sdim
17356843Sdim#include "MCTargetDesc/VEMCTargetDesc.h"
18356843Sdim#include "llvm/Support/ErrorHandling.h"
19356843Sdim#include "llvm/Target/TargetMachine.h"
20356843Sdim
21356843Sdimnamespace llvm {
22356843Sdimclass FunctionPass;
23356843Sdimclass VETargetMachine;
24356843Sdimclass formatted_raw_ostream;
25356843Sdimclass AsmPrinter;
26356843Sdimclass MCInst;
27356843Sdimclass MachineInstr;
28356843Sdim
29356843SdimFunctionPass *createVEISelDag(VETargetMachine &TM);
30356843SdimFunctionPass *createVEPromoteToI1Pass();
31356843Sdim
32356843Sdimvoid LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
33356843Sdim                                 AsmPrinter &AP);
34356843Sdim} // namespace llvm
35356843Sdim
36356843Sdimnamespace llvm {
37356843Sdim// Enums corresponding to VE condition codes, both icc's and fcc's.  These
38356843Sdim// values must be kept in sync with the ones in the .td file.
39356843Sdimnamespace VECC {
40356843Sdimenum CondCodes {
41356843Sdim  // Integer comparison
42356843Sdim  CC_IG =  0,  // Greater
43356843Sdim  CC_IL =  1,  // Less
44356843Sdim  CC_INE = 2, // Not Equal
45356843Sdim  CC_IEQ = 3, // Equal
46356843Sdim  CC_IGE = 4, // Greater or Equal
47356843Sdim  CC_ILE = 5, // Less or Equal
48356843Sdim
49356843Sdim  // Floating point comparison
50356843Sdim  CC_AF =     0 + 6, // Never
51356843Sdim  CC_G =      1 + 6, // Greater
52356843Sdim  CC_L =      2 + 6, // Less
53356843Sdim  CC_NE =     3 + 6, // Not Equal
54356843Sdim  CC_EQ =     4 + 6, // Equal
55356843Sdim  CC_GE =     5 + 6, // Greater or Equal
56356843Sdim  CC_LE =     6 + 6, // Less or Equal
57356843Sdim  CC_NUM =    7 + 6, // Number
58356843Sdim  CC_NAN =    8 + 6, // NaN
59356843Sdim  CC_GNAN =   9 + 6, // Greater or NaN
60356843Sdim  CC_LNAN =  10 + 6, // Less or NaN
61356843Sdim  CC_NENAN = 11 + 6, // Not Equal or NaN
62356843Sdim  CC_EQNAN = 12 + 6, // Equal or NaN
63356843Sdim  CC_GENAN = 13 + 6, // Greater or Equal or NaN
64356843Sdim  CC_LENAN = 14 + 6, // Less or Equal or NaN
65356843Sdim  CC_AT =    15 + 6, // Always
66356843Sdim};
67356843Sdim}
68356843Sdim
69356843Sdiminline static const char *VECondCodeToString(VECC::CondCodes CC) {
70356843Sdim  switch (CC) {
71356843Sdim  case VECC::CC_IG:    return "gt";
72356843Sdim  case VECC::CC_IL:    return "lt";
73356843Sdim  case VECC::CC_INE:   return "ne";
74356843Sdim  case VECC::CC_IEQ:   return "eq";
75356843Sdim  case VECC::CC_IGE:   return "ge";
76356843Sdim  case VECC::CC_ILE:   return "le";
77356843Sdim  case VECC::CC_AF:    return "af";
78356843Sdim  case VECC::CC_G:     return "gt";
79356843Sdim  case VECC::CC_L:     return "lt";
80356843Sdim  case VECC::CC_NE:    return "ne";
81356843Sdim  case VECC::CC_EQ:    return "eq";
82356843Sdim  case VECC::CC_GE:    return "ge";
83356843Sdim  case VECC::CC_LE:    return "le";
84356843Sdim  case VECC::CC_NUM:   return "num";
85356843Sdim  case VECC::CC_NAN:   return "nan";
86356843Sdim  case VECC::CC_GNAN:  return "gtnan";
87356843Sdim  case VECC::CC_LNAN:  return "ltnan";
88356843Sdim  case VECC::CC_NENAN: return "nenan";
89356843Sdim  case VECC::CC_EQNAN: return "eqnan";
90356843Sdim  case VECC::CC_GENAN: return "genan";
91356843Sdim  case VECC::CC_LENAN: return "lenan";
92356843Sdim  case VECC::CC_AT:    return "at";
93356843Sdim  }
94356843Sdim  llvm_unreachable("Invalid cond code");
95356843Sdim}
96356843Sdim
97356843Sdim// Different to Hi_32/Lo_32 the HI32 and LO32 functions
98356843Sdim// preserve the correct numerical value
99356843Sdim// on the LLVM data type for MC immediates (int64_t).
100356843Sdiminline static int64_t HI32(int64_t imm) {
101356843Sdim  return (int32_t)(imm >> 32);
102356843Sdim}
103356843Sdim
104356843Sdiminline static int64_t LO32(int64_t imm) {
105356843Sdim  return (int32_t)(imm);
106356843Sdim}
107356843Sdim
108356843Sdim} // namespace llvm
109356843Sdim#endif
110