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