xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VE.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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