| //===-- 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 |