1480093f4SDimitry Andric //===-- VE.h - Top-level interface for VE representation --------*- C++ -*-===// 2480093f4SDimitry Andric // 3480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6480093f4SDimitry Andric // 7480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8480093f4SDimitry Andric // 9480093f4SDimitry Andric // This file contains the entry points for global functions defined in the LLVM 10480093f4SDimitry Andric // VE back-end. 11480093f4SDimitry Andric // 12480093f4SDimitry Andric //===----------------------------------------------------------------------===// 13480093f4SDimitry Andric 14480093f4SDimitry Andric #ifndef LLVM_LIB_TARGET_VE_VE_H 15480093f4SDimitry Andric #define LLVM_LIB_TARGET_VE_VE_H 16480093f4SDimitry Andric 17480093f4SDimitry Andric #include "MCTargetDesc/VEMCTargetDesc.h" 185ffd83dbSDimitry Andric #include "llvm/ADT/StringSwitch.h" 19480093f4SDimitry Andric #include "llvm/Support/ErrorHandling.h" 20480093f4SDimitry Andric #include "llvm/Target/TargetMachine.h" 21480093f4SDimitry Andric 22480093f4SDimitry Andric namespace llvm { 23480093f4SDimitry Andric class AsmPrinter; 24bdd1243dSDimitry Andric class FunctionPass; 25480093f4SDimitry Andric class MCInst; 26480093f4SDimitry Andric class MachineInstr; 27bdd1243dSDimitry Andric class PassRegistry; 28bdd1243dSDimitry Andric class VETargetMachine; 29480093f4SDimitry Andric 30480093f4SDimitry Andric FunctionPass *createVEISelDag(VETargetMachine &TM); 31e8d8bef9SDimitry Andric FunctionPass *createLVLGenPass(); 32*0fca6ea1SDimitry Andric void initializeVEDAGToDAGISelLegacyPass(PassRegistry &); 33480093f4SDimitry Andric 34480093f4SDimitry Andric void LowerVEMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, 35480093f4SDimitry Andric AsmPrinter &AP); 36480093f4SDimitry Andric } // namespace llvm 37480093f4SDimitry Andric 38480093f4SDimitry Andric namespace llvm { 39480093f4SDimitry Andric // Enums corresponding to VE condition codes, both icc's and fcc's. These 40480093f4SDimitry Andric // values must be kept in sync with the ones in the .td file. 41480093f4SDimitry Andric namespace VECC { 425ffd83dbSDimitry Andric enum CondCode { 43480093f4SDimitry Andric // Integer comparison 44480093f4SDimitry Andric CC_IG = 0, // Greater 45480093f4SDimitry Andric CC_IL = 1, // Less 46480093f4SDimitry Andric CC_INE = 2, // Not Equal 47480093f4SDimitry Andric CC_IEQ = 3, // Equal 48480093f4SDimitry Andric CC_IGE = 4, // Greater or Equal 49480093f4SDimitry Andric CC_ILE = 5, // Less or Equal 50480093f4SDimitry Andric 51480093f4SDimitry Andric // Floating point comparison 52480093f4SDimitry Andric CC_AF = 0 + 6, // Never 53480093f4SDimitry Andric CC_G = 1 + 6, // Greater 54480093f4SDimitry Andric CC_L = 2 + 6, // Less 55480093f4SDimitry Andric CC_NE = 3 + 6, // Not Equal 56480093f4SDimitry Andric CC_EQ = 4 + 6, // Equal 57480093f4SDimitry Andric CC_GE = 5 + 6, // Greater or Equal 58480093f4SDimitry Andric CC_LE = 6 + 6, // Less or Equal 59480093f4SDimitry Andric CC_NUM = 7 + 6, // Number 60480093f4SDimitry Andric CC_NAN = 8 + 6, // NaN 61480093f4SDimitry Andric CC_GNAN = 9 + 6, // Greater or NaN 62480093f4SDimitry Andric CC_LNAN = 10 + 6, // Less or NaN 63480093f4SDimitry Andric CC_NENAN = 11 + 6, // Not Equal or NaN 64480093f4SDimitry Andric CC_EQNAN = 12 + 6, // Equal or NaN 65480093f4SDimitry Andric CC_GENAN = 13 + 6, // Greater or Equal or NaN 66480093f4SDimitry Andric CC_LENAN = 14 + 6, // Less or Equal or NaN 67480093f4SDimitry Andric CC_AT = 15 + 6, // Always 685ffd83dbSDimitry Andric UNKNOWN 695ffd83dbSDimitry Andric }; 705ffd83dbSDimitry Andric } 715ffd83dbSDimitry Andric // Enums corresponding to VE Rounding Mode. These values must be kept in 725ffd83dbSDimitry Andric // sync with the ones in the .td file. 735ffd83dbSDimitry Andric namespace VERD { 745ffd83dbSDimitry Andric enum RoundingMode { 755ffd83dbSDimitry Andric RD_NONE = 0, // According to PSW 765ffd83dbSDimitry Andric RD_RZ = 8, // Round toward Zero 775ffd83dbSDimitry Andric RD_RP = 9, // Round toward Plus infinity 785ffd83dbSDimitry Andric RD_RM = 10, // Round toward Minus infinity 795ffd83dbSDimitry Andric RD_RN = 11, // Round to Nearest (ties to Even) 805ffd83dbSDimitry Andric RD_RA = 12, // Round to Nearest (ties to Away) 815ffd83dbSDimitry Andric UNKNOWN 82480093f4SDimitry Andric }; 83480093f4SDimitry Andric } 84480093f4SDimitry Andric 855ffd83dbSDimitry Andric inline static const char *VECondCodeToString(VECC::CondCode CC) { 86480093f4SDimitry Andric switch (CC) { 87480093f4SDimitry Andric case VECC::CC_IG: return "gt"; 88480093f4SDimitry Andric case VECC::CC_IL: return "lt"; 89480093f4SDimitry Andric case VECC::CC_INE: return "ne"; 90480093f4SDimitry Andric case VECC::CC_IEQ: return "eq"; 91480093f4SDimitry Andric case VECC::CC_IGE: return "ge"; 92480093f4SDimitry Andric case VECC::CC_ILE: return "le"; 93480093f4SDimitry Andric case VECC::CC_AF: return "af"; 94480093f4SDimitry Andric case VECC::CC_G: return "gt"; 95480093f4SDimitry Andric case VECC::CC_L: return "lt"; 96480093f4SDimitry Andric case VECC::CC_NE: return "ne"; 97480093f4SDimitry Andric case VECC::CC_EQ: return "eq"; 98480093f4SDimitry Andric case VECC::CC_GE: return "ge"; 99480093f4SDimitry Andric case VECC::CC_LE: return "le"; 100480093f4SDimitry Andric case VECC::CC_NUM: return "num"; 101480093f4SDimitry Andric case VECC::CC_NAN: return "nan"; 102480093f4SDimitry Andric case VECC::CC_GNAN: return "gtnan"; 103480093f4SDimitry Andric case VECC::CC_LNAN: return "ltnan"; 104480093f4SDimitry Andric case VECC::CC_NENAN: return "nenan"; 105480093f4SDimitry Andric case VECC::CC_EQNAN: return "eqnan"; 106480093f4SDimitry Andric case VECC::CC_GENAN: return "genan"; 107480093f4SDimitry Andric case VECC::CC_LENAN: return "lenan"; 108480093f4SDimitry Andric case VECC::CC_AT: return "at"; 1095ffd83dbSDimitry Andric default: 1105ffd83dbSDimitry Andric llvm_unreachable("Invalid cond code"); 1115ffd83dbSDimitry Andric } 1125ffd83dbSDimitry Andric } 1135ffd83dbSDimitry Andric 1145ffd83dbSDimitry Andric inline static VECC::CondCode stringToVEICondCode(StringRef S) { 1155ffd83dbSDimitry Andric return StringSwitch<VECC::CondCode>(S) 1165ffd83dbSDimitry Andric .Case("gt", VECC::CC_IG) 1175ffd83dbSDimitry Andric .Case("lt", VECC::CC_IL) 1185ffd83dbSDimitry Andric .Case("ne", VECC::CC_INE) 1195ffd83dbSDimitry Andric .Case("eq", VECC::CC_IEQ) 1205ffd83dbSDimitry Andric .Case("ge", VECC::CC_IGE) 1215ffd83dbSDimitry Andric .Case("le", VECC::CC_ILE) 1225ffd83dbSDimitry Andric .Case("af", VECC::CC_AF) 1235ffd83dbSDimitry Andric .Case("at", VECC::CC_AT) 1245ffd83dbSDimitry Andric .Case("", VECC::CC_AT) 1255ffd83dbSDimitry Andric .Default(VECC::UNKNOWN); 1265ffd83dbSDimitry Andric } 1275ffd83dbSDimitry Andric 1285ffd83dbSDimitry Andric inline static VECC::CondCode stringToVEFCondCode(StringRef S) { 1295ffd83dbSDimitry Andric return StringSwitch<VECC::CondCode>(S) 1305ffd83dbSDimitry Andric .Case("gt", VECC::CC_G) 1315ffd83dbSDimitry Andric .Case("lt", VECC::CC_L) 1325ffd83dbSDimitry Andric .Case("ne", VECC::CC_NE) 1335ffd83dbSDimitry Andric .Case("eq", VECC::CC_EQ) 1345ffd83dbSDimitry Andric .Case("ge", VECC::CC_GE) 1355ffd83dbSDimitry Andric .Case("le", VECC::CC_LE) 1365ffd83dbSDimitry Andric .Case("num", VECC::CC_NUM) 1375ffd83dbSDimitry Andric .Case("nan", VECC::CC_NAN) 1385ffd83dbSDimitry Andric .Case("gtnan", VECC::CC_GNAN) 1395ffd83dbSDimitry Andric .Case("ltnan", VECC::CC_LNAN) 1405ffd83dbSDimitry Andric .Case("nenan", VECC::CC_NENAN) 1415ffd83dbSDimitry Andric .Case("eqnan", VECC::CC_EQNAN) 1425ffd83dbSDimitry Andric .Case("genan", VECC::CC_GENAN) 1435ffd83dbSDimitry Andric .Case("lenan", VECC::CC_LENAN) 1445ffd83dbSDimitry Andric .Case("af", VECC::CC_AF) 1455ffd83dbSDimitry Andric .Case("at", VECC::CC_AT) 1465ffd83dbSDimitry Andric .Case("", VECC::CC_AT) 1475ffd83dbSDimitry Andric .Default(VECC::UNKNOWN); 1485ffd83dbSDimitry Andric } 1495ffd83dbSDimitry Andric 150bdd1243dSDimitry Andric inline static bool isIntVECondCode(VECC::CondCode CC) { 151bdd1243dSDimitry Andric return CC < VECC::CC_AF; 152bdd1243dSDimitry Andric } 153bdd1243dSDimitry Andric 1545ffd83dbSDimitry Andric inline static unsigned VECondCodeToVal(VECC::CondCode CC) { 1555ffd83dbSDimitry Andric switch (CC) { 1565ffd83dbSDimitry Andric case VECC::CC_IG: 1575ffd83dbSDimitry Andric return 1; 1585ffd83dbSDimitry Andric case VECC::CC_IL: 1595ffd83dbSDimitry Andric return 2; 1605ffd83dbSDimitry Andric case VECC::CC_INE: 1615ffd83dbSDimitry Andric return 3; 1625ffd83dbSDimitry Andric case VECC::CC_IEQ: 1635ffd83dbSDimitry Andric return 4; 1645ffd83dbSDimitry Andric case VECC::CC_IGE: 1655ffd83dbSDimitry Andric return 5; 1665ffd83dbSDimitry Andric case VECC::CC_ILE: 1675ffd83dbSDimitry Andric return 6; 1685ffd83dbSDimitry Andric case VECC::CC_AF: 1695ffd83dbSDimitry Andric return 0; 1705ffd83dbSDimitry Andric case VECC::CC_G: 1715ffd83dbSDimitry Andric return 1; 1725ffd83dbSDimitry Andric case VECC::CC_L: 1735ffd83dbSDimitry Andric return 2; 1745ffd83dbSDimitry Andric case VECC::CC_NE: 1755ffd83dbSDimitry Andric return 3; 1765ffd83dbSDimitry Andric case VECC::CC_EQ: 1775ffd83dbSDimitry Andric return 4; 1785ffd83dbSDimitry Andric case VECC::CC_GE: 1795ffd83dbSDimitry Andric return 5; 1805ffd83dbSDimitry Andric case VECC::CC_LE: 1815ffd83dbSDimitry Andric return 6; 1825ffd83dbSDimitry Andric case VECC::CC_NUM: 1835ffd83dbSDimitry Andric return 7; 1845ffd83dbSDimitry Andric case VECC::CC_NAN: 1855ffd83dbSDimitry Andric return 8; 1865ffd83dbSDimitry Andric case VECC::CC_GNAN: 1875ffd83dbSDimitry Andric return 9; 1885ffd83dbSDimitry Andric case VECC::CC_LNAN: 1895ffd83dbSDimitry Andric return 10; 1905ffd83dbSDimitry Andric case VECC::CC_NENAN: 1915ffd83dbSDimitry Andric return 11; 1925ffd83dbSDimitry Andric case VECC::CC_EQNAN: 1935ffd83dbSDimitry Andric return 12; 1945ffd83dbSDimitry Andric case VECC::CC_GENAN: 1955ffd83dbSDimitry Andric return 13; 1965ffd83dbSDimitry Andric case VECC::CC_LENAN: 1975ffd83dbSDimitry Andric return 14; 1985ffd83dbSDimitry Andric case VECC::CC_AT: 1995ffd83dbSDimitry Andric return 15; 2005ffd83dbSDimitry Andric default: 2015ffd83dbSDimitry Andric llvm_unreachable("Invalid cond code"); 2025ffd83dbSDimitry Andric } 2035ffd83dbSDimitry Andric } 2045ffd83dbSDimitry Andric 2055ffd83dbSDimitry Andric inline static VECC::CondCode VEValToCondCode(unsigned Val, bool IsInteger) { 2065ffd83dbSDimitry Andric if (IsInteger) { 2075ffd83dbSDimitry Andric switch (Val) { 2085ffd83dbSDimitry Andric case 0: 2095ffd83dbSDimitry Andric return VECC::CC_AF; 2105ffd83dbSDimitry Andric case 1: 2115ffd83dbSDimitry Andric return VECC::CC_IG; 2125ffd83dbSDimitry Andric case 2: 2135ffd83dbSDimitry Andric return VECC::CC_IL; 2145ffd83dbSDimitry Andric case 3: 2155ffd83dbSDimitry Andric return VECC::CC_INE; 2165ffd83dbSDimitry Andric case 4: 2175ffd83dbSDimitry Andric return VECC::CC_IEQ; 2185ffd83dbSDimitry Andric case 5: 2195ffd83dbSDimitry Andric return VECC::CC_IGE; 2205ffd83dbSDimitry Andric case 6: 2215ffd83dbSDimitry Andric return VECC::CC_ILE; 2225ffd83dbSDimitry Andric case 15: 2235ffd83dbSDimitry Andric return VECC::CC_AT; 2245ffd83dbSDimitry Andric } 2255ffd83dbSDimitry Andric } else { 2265ffd83dbSDimitry Andric switch (Val) { 2275ffd83dbSDimitry Andric case 0: 2285ffd83dbSDimitry Andric return VECC::CC_AF; 2295ffd83dbSDimitry Andric case 1: 2305ffd83dbSDimitry Andric return VECC::CC_G; 2315ffd83dbSDimitry Andric case 2: 2325ffd83dbSDimitry Andric return VECC::CC_L; 2335ffd83dbSDimitry Andric case 3: 2345ffd83dbSDimitry Andric return VECC::CC_NE; 2355ffd83dbSDimitry Andric case 4: 2365ffd83dbSDimitry Andric return VECC::CC_EQ; 2375ffd83dbSDimitry Andric case 5: 2385ffd83dbSDimitry Andric return VECC::CC_GE; 2395ffd83dbSDimitry Andric case 6: 2405ffd83dbSDimitry Andric return VECC::CC_LE; 2415ffd83dbSDimitry Andric case 7: 2425ffd83dbSDimitry Andric return VECC::CC_NUM; 2435ffd83dbSDimitry Andric case 8: 2445ffd83dbSDimitry Andric return VECC::CC_NAN; 2455ffd83dbSDimitry Andric case 9: 2465ffd83dbSDimitry Andric return VECC::CC_GNAN; 2475ffd83dbSDimitry Andric case 10: 2485ffd83dbSDimitry Andric return VECC::CC_LNAN; 2495ffd83dbSDimitry Andric case 11: 2505ffd83dbSDimitry Andric return VECC::CC_NENAN; 2515ffd83dbSDimitry Andric case 12: 2525ffd83dbSDimitry Andric return VECC::CC_EQNAN; 2535ffd83dbSDimitry Andric case 13: 2545ffd83dbSDimitry Andric return VECC::CC_GENAN; 2555ffd83dbSDimitry Andric case 14: 2565ffd83dbSDimitry Andric return VECC::CC_LENAN; 2575ffd83dbSDimitry Andric case 15: 2585ffd83dbSDimitry Andric return VECC::CC_AT; 2595ffd83dbSDimitry Andric } 260480093f4SDimitry Andric } 261480093f4SDimitry Andric llvm_unreachable("Invalid cond code"); 262480093f4SDimitry Andric } 263480093f4SDimitry Andric 2645ffd83dbSDimitry Andric inline static const char *VERDToString(VERD::RoundingMode R) { 2655ffd83dbSDimitry Andric switch (R) { 2665ffd83dbSDimitry Andric case VERD::RD_NONE: 2675ffd83dbSDimitry Andric return ""; 2685ffd83dbSDimitry Andric case VERD::RD_RZ: 2695ffd83dbSDimitry Andric return ".rz"; 2705ffd83dbSDimitry Andric case VERD::RD_RP: 2715ffd83dbSDimitry Andric return ".rp"; 2725ffd83dbSDimitry Andric case VERD::RD_RM: 2735ffd83dbSDimitry Andric return ".rm"; 2745ffd83dbSDimitry Andric case VERD::RD_RN: 2755ffd83dbSDimitry Andric return ".rn"; 2765ffd83dbSDimitry Andric case VERD::RD_RA: 2775ffd83dbSDimitry Andric return ".ra"; 2785ffd83dbSDimitry Andric default: 2795ffd83dbSDimitry Andric llvm_unreachable("Invalid branch predicate"); 2805ffd83dbSDimitry Andric } 281480093f4SDimitry Andric } 282480093f4SDimitry Andric 2835ffd83dbSDimitry Andric inline static VERD::RoundingMode stringToVERD(StringRef S) { 2845ffd83dbSDimitry Andric return StringSwitch<VERD::RoundingMode>(S) 2855ffd83dbSDimitry Andric .Case("", VERD::RD_NONE) 2865ffd83dbSDimitry Andric .Case(".rz", VERD::RD_RZ) 2875ffd83dbSDimitry Andric .Case(".rp", VERD::RD_RP) 2885ffd83dbSDimitry Andric .Case(".rm", VERD::RD_RM) 2895ffd83dbSDimitry Andric .Case(".rn", VERD::RD_RN) 2905ffd83dbSDimitry Andric .Case(".ra", VERD::RD_RA) 2915ffd83dbSDimitry Andric .Default(VERD::UNKNOWN); 292480093f4SDimitry Andric } 293480093f4SDimitry Andric 2945ffd83dbSDimitry Andric inline static unsigned VERDToVal(VERD::RoundingMode R) { 2955ffd83dbSDimitry Andric switch (R) { 2965ffd83dbSDimitry Andric case VERD::RD_NONE: 2975ffd83dbSDimitry Andric case VERD::RD_RZ: 2985ffd83dbSDimitry Andric case VERD::RD_RP: 2995ffd83dbSDimitry Andric case VERD::RD_RM: 3005ffd83dbSDimitry Andric case VERD::RD_RN: 3015ffd83dbSDimitry Andric case VERD::RD_RA: 3025ffd83dbSDimitry Andric return static_cast<unsigned>(R); 3035ffd83dbSDimitry Andric default: 3045ffd83dbSDimitry Andric break; 3055ffd83dbSDimitry Andric } 3065ffd83dbSDimitry Andric llvm_unreachable("Invalid branch predicates"); 3075ffd83dbSDimitry Andric } 3085ffd83dbSDimitry Andric 3095ffd83dbSDimitry Andric inline static VERD::RoundingMode VEValToRD(unsigned Val) { 3105ffd83dbSDimitry Andric switch (Val) { 3115ffd83dbSDimitry Andric case static_cast<unsigned>(VERD::RD_NONE): 3125ffd83dbSDimitry Andric return VERD::RD_NONE; 3135ffd83dbSDimitry Andric case static_cast<unsigned>(VERD::RD_RZ): 3145ffd83dbSDimitry Andric return VERD::RD_RZ; 3155ffd83dbSDimitry Andric case static_cast<unsigned>(VERD::RD_RP): 3165ffd83dbSDimitry Andric return VERD::RD_RP; 3175ffd83dbSDimitry Andric case static_cast<unsigned>(VERD::RD_RM): 3185ffd83dbSDimitry Andric return VERD::RD_RM; 3195ffd83dbSDimitry Andric case static_cast<unsigned>(VERD::RD_RN): 3205ffd83dbSDimitry Andric return VERD::RD_RN; 3215ffd83dbSDimitry Andric case static_cast<unsigned>(VERD::RD_RA): 3225ffd83dbSDimitry Andric return VERD::RD_RA; 3235ffd83dbSDimitry Andric default: 3245ffd83dbSDimitry Andric break; 3255ffd83dbSDimitry Andric } 3265ffd83dbSDimitry Andric llvm_unreachable("Invalid branch predicates"); 3275ffd83dbSDimitry Andric } 3285ffd83dbSDimitry Andric 3295ffd83dbSDimitry Andric // MImm - Special immediate value of sequential bit stream of 0 or 1. 3305ffd83dbSDimitry Andric // See VEInstrInfo.td for details. 3315ffd83dbSDimitry Andric inline static bool isMImmVal(uint64_t Val) { 3325ffd83dbSDimitry Andric if (Val == 0) { 3335ffd83dbSDimitry Andric // (0)1 is 0 3345ffd83dbSDimitry Andric return true; 3355ffd83dbSDimitry Andric } 3365ffd83dbSDimitry Andric if (isMask_64(Val)) { 3375ffd83dbSDimitry Andric // (m)0 patterns 3385ffd83dbSDimitry Andric return true; 3395ffd83dbSDimitry Andric } 3405ffd83dbSDimitry Andric // (m)1 patterns 341d409305fSDimitry Andric return (Val & (UINT64_C(1) << 63)) && isShiftedMask_64(Val); 3425ffd83dbSDimitry Andric } 3435ffd83dbSDimitry Andric 3445ffd83dbSDimitry Andric inline static bool isMImm32Val(uint32_t Val) { 3455ffd83dbSDimitry Andric if (Val == 0) { 3465ffd83dbSDimitry Andric // (0)1 is 0 3475ffd83dbSDimitry Andric return true; 3485ffd83dbSDimitry Andric } 3495ffd83dbSDimitry Andric if (isMask_32(Val)) { 3505ffd83dbSDimitry Andric // (m)0 patterns 3515ffd83dbSDimitry Andric return true; 3525ffd83dbSDimitry Andric } 3535ffd83dbSDimitry Andric // (m)1 patterns 354d409305fSDimitry Andric return (Val & (UINT32_C(1) << 31)) && isShiftedMask_32(Val); 3555ffd83dbSDimitry Andric } 3565ffd83dbSDimitry Andric 357e8d8bef9SDimitry Andric /// val2MImm - Convert an integer immediate value to target MImm immediate. 358e8d8bef9SDimitry Andric inline static uint64_t val2MImm(uint64_t Val) { 359e8d8bef9SDimitry Andric if (Val == 0) 360e8d8bef9SDimitry Andric return 0; // (0)1 361d409305fSDimitry Andric if (Val & (UINT64_C(1) << 63)) 36206c3fb27SDimitry Andric return llvm::countl_one(Val); // (m)1 36306c3fb27SDimitry Andric return llvm::countl_zero(Val) | 0x40; // (m)0 364e8d8bef9SDimitry Andric } 365e8d8bef9SDimitry Andric 366e8d8bef9SDimitry Andric /// mimm2Val - Convert a target MImm immediate to an integer immediate value. 367e8d8bef9SDimitry Andric inline static uint64_t mimm2Val(uint64_t Val) { 368e8d8bef9SDimitry Andric if (Val == 0) 369e8d8bef9SDimitry Andric return 0; // (0)1 370e8d8bef9SDimitry Andric if ((Val & 0x40) == 0) 371d409305fSDimitry Andric return (uint64_t)((INT64_C(1) << 63) >> (Val & 0x3f)); // (m)1 372d409305fSDimitry Andric return ((uint64_t)INT64_C(-1) >> (Val & 0x3f)); // (m)0 373e8d8bef9SDimitry Andric } 374e8d8bef9SDimitry Andric 3755ffd83dbSDimitry Andric inline unsigned M0(unsigned Val) { return Val + 64; } 3765ffd83dbSDimitry Andric inline unsigned M1(unsigned Val) { return Val; } 3775ffd83dbSDimitry Andric 37881ad6265SDimitry Andric static const unsigned StandardVectorWidth = 256; 37981ad6265SDimitry Andric static const unsigned PackedVectorWidth = 512; 38081ad6265SDimitry Andric 381480093f4SDimitry Andric } // namespace llvm 382480093f4SDimitry Andric #endif 383