diff options
Diffstat (limited to 'llvm/lib/Target/VE/VE.h')
-rw-r--r-- | llvm/lib/Target/VE/VE.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/llvm/lib/Target/VE/VE.h b/llvm/lib/Target/VE/VE.h new file mode 100644 index 000000000000..9b61f2b63f36 --- /dev/null +++ b/llvm/lib/Target/VE/VE.h @@ -0,0 +1,109 @@ +//===-- VE.h - Top-level interface for VE representation --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains the entry points for global functions defined in the LLVM +// VE back-end. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_VE_VE_H +#define LLVM_LIB_TARGET_VE_VE_H + +#include "MCTargetDesc/VEMCTargetDesc.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Target/TargetMachine.h" + +namespace llvm { +class FunctionPass; +class VETargetMachine; +class formatted_raw_ostream; +class AsmPrinter; +class MCInst; +class MachineInstr; + +FunctionPass *createVEISelDag(VETargetMachine &TM); +FunctionPass *createVEPromoteToI1Pass(); + +void LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, + AsmPrinter &AP); +} // namespace llvm + +namespace llvm { +// Enums corresponding to VE condition codes, both icc's and fcc's. These +// values must be kept in sync with the ones in the .td file. +namespace VECC { +enum CondCodes { + // Integer comparison + CC_IG = 0, // Greater + CC_IL = 1, // Less + CC_INE = 2, // Not Equal + CC_IEQ = 3, // Equal + CC_IGE = 4, // Greater or Equal + CC_ILE = 5, // Less or Equal + + // Floating point comparison + CC_AF = 0 + 6, // Never + CC_G = 1 + 6, // Greater + CC_L = 2 + 6, // Less + CC_NE = 3 + 6, // Not Equal + CC_EQ = 4 + 6, // Equal + CC_GE = 5 + 6, // Greater or Equal + CC_LE = 6 + 6, // Less or Equal + CC_NUM = 7 + 6, // Number + CC_NAN = 8 + 6, // NaN + CC_GNAN = 9 + 6, // Greater or NaN + CC_LNAN = 10 + 6, // Less or NaN + CC_NENAN = 11 + 6, // Not Equal or NaN + CC_EQNAN = 12 + 6, // Equal or NaN + CC_GENAN = 13 + 6, // Greater or Equal or NaN + CC_LENAN = 14 + 6, // Less or Equal or NaN + CC_AT = 15 + 6, // Always +}; +} + +inline static const char *VECondCodeToString(VECC::CondCodes CC) { + switch (CC) { + case VECC::CC_IG: return "gt"; + case VECC::CC_IL: return "lt"; + case VECC::CC_INE: return "ne"; + case VECC::CC_IEQ: return "eq"; + case VECC::CC_IGE: return "ge"; + case VECC::CC_ILE: return "le"; + case VECC::CC_AF: return "af"; + case VECC::CC_G: return "gt"; + case VECC::CC_L: return "lt"; + case VECC::CC_NE: return "ne"; + case VECC::CC_EQ: return "eq"; + case VECC::CC_GE: return "ge"; + case VECC::CC_LE: return "le"; + case VECC::CC_NUM: return "num"; + case VECC::CC_NAN: return "nan"; + case VECC::CC_GNAN: return "gtnan"; + case VECC::CC_LNAN: return "ltnan"; + case VECC::CC_NENAN: return "nenan"; + case VECC::CC_EQNAN: return "eqnan"; + case VECC::CC_GENAN: return "genan"; + case VECC::CC_LENAN: return "lenan"; + case VECC::CC_AT: return "at"; + } + llvm_unreachable("Invalid cond code"); +} + +// Different to Hi_32/Lo_32 the HI32 and LO32 functions +// preserve the correct numerical value +// on the LLVM data type for MC immediates (int64_t). +inline static int64_t HI32(int64_t imm) { + return (int32_t)(imm >> 32); +} + +inline static int64_t LO32(int64_t imm) { + return (int32_t)(imm); +} + +} // namespace llvm +#endif |