xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VE.h (revision d409305fa3838fb39b38c26fc085fb729b8766d5)
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 FunctionPass;
24480093f4SDimitry Andric class VETargetMachine;
25480093f4SDimitry Andric class formatted_raw_ostream;
26480093f4SDimitry Andric class AsmPrinter;
27480093f4SDimitry Andric class MCInst;
28480093f4SDimitry Andric class MachineInstr;
29480093f4SDimitry Andric 
30480093f4SDimitry Andric FunctionPass *createVEISelDag(VETargetMachine &TM);
31480093f4SDimitry Andric FunctionPass *createVEPromoteToI1Pass();
32e8d8bef9SDimitry Andric FunctionPass *createLVLGenPass();
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 
1505ffd83dbSDimitry Andric inline static unsigned VECondCodeToVal(VECC::CondCode CC) {
1515ffd83dbSDimitry Andric   switch (CC) {
1525ffd83dbSDimitry Andric   case VECC::CC_IG:
1535ffd83dbSDimitry Andric     return 1;
1545ffd83dbSDimitry Andric   case VECC::CC_IL:
1555ffd83dbSDimitry Andric     return 2;
1565ffd83dbSDimitry Andric   case VECC::CC_INE:
1575ffd83dbSDimitry Andric     return 3;
1585ffd83dbSDimitry Andric   case VECC::CC_IEQ:
1595ffd83dbSDimitry Andric     return 4;
1605ffd83dbSDimitry Andric   case VECC::CC_IGE:
1615ffd83dbSDimitry Andric     return 5;
1625ffd83dbSDimitry Andric   case VECC::CC_ILE:
1635ffd83dbSDimitry Andric     return 6;
1645ffd83dbSDimitry Andric   case VECC::CC_AF:
1655ffd83dbSDimitry Andric     return 0;
1665ffd83dbSDimitry Andric   case VECC::CC_G:
1675ffd83dbSDimitry Andric     return 1;
1685ffd83dbSDimitry Andric   case VECC::CC_L:
1695ffd83dbSDimitry Andric     return 2;
1705ffd83dbSDimitry Andric   case VECC::CC_NE:
1715ffd83dbSDimitry Andric     return 3;
1725ffd83dbSDimitry Andric   case VECC::CC_EQ:
1735ffd83dbSDimitry Andric     return 4;
1745ffd83dbSDimitry Andric   case VECC::CC_GE:
1755ffd83dbSDimitry Andric     return 5;
1765ffd83dbSDimitry Andric   case VECC::CC_LE:
1775ffd83dbSDimitry Andric     return 6;
1785ffd83dbSDimitry Andric   case VECC::CC_NUM:
1795ffd83dbSDimitry Andric     return 7;
1805ffd83dbSDimitry Andric   case VECC::CC_NAN:
1815ffd83dbSDimitry Andric     return 8;
1825ffd83dbSDimitry Andric   case VECC::CC_GNAN:
1835ffd83dbSDimitry Andric     return 9;
1845ffd83dbSDimitry Andric   case VECC::CC_LNAN:
1855ffd83dbSDimitry Andric     return 10;
1865ffd83dbSDimitry Andric   case VECC::CC_NENAN:
1875ffd83dbSDimitry Andric     return 11;
1885ffd83dbSDimitry Andric   case VECC::CC_EQNAN:
1895ffd83dbSDimitry Andric     return 12;
1905ffd83dbSDimitry Andric   case VECC::CC_GENAN:
1915ffd83dbSDimitry Andric     return 13;
1925ffd83dbSDimitry Andric   case VECC::CC_LENAN:
1935ffd83dbSDimitry Andric     return 14;
1945ffd83dbSDimitry Andric   case VECC::CC_AT:
1955ffd83dbSDimitry Andric     return 15;
1965ffd83dbSDimitry Andric   default:
1975ffd83dbSDimitry Andric     llvm_unreachable("Invalid cond code");
1985ffd83dbSDimitry Andric   }
1995ffd83dbSDimitry Andric }
2005ffd83dbSDimitry Andric 
2015ffd83dbSDimitry Andric inline static VECC::CondCode VEValToCondCode(unsigned Val, bool IsInteger) {
2025ffd83dbSDimitry Andric   if (IsInteger) {
2035ffd83dbSDimitry Andric     switch (Val) {
2045ffd83dbSDimitry Andric     case 0:
2055ffd83dbSDimitry Andric       return VECC::CC_AF;
2065ffd83dbSDimitry Andric     case 1:
2075ffd83dbSDimitry Andric       return VECC::CC_IG;
2085ffd83dbSDimitry Andric     case 2:
2095ffd83dbSDimitry Andric       return VECC::CC_IL;
2105ffd83dbSDimitry Andric     case 3:
2115ffd83dbSDimitry Andric       return VECC::CC_INE;
2125ffd83dbSDimitry Andric     case 4:
2135ffd83dbSDimitry Andric       return VECC::CC_IEQ;
2145ffd83dbSDimitry Andric     case 5:
2155ffd83dbSDimitry Andric       return VECC::CC_IGE;
2165ffd83dbSDimitry Andric     case 6:
2175ffd83dbSDimitry Andric       return VECC::CC_ILE;
2185ffd83dbSDimitry Andric     case 15:
2195ffd83dbSDimitry Andric       return VECC::CC_AT;
2205ffd83dbSDimitry Andric     }
2215ffd83dbSDimitry Andric   } else {
2225ffd83dbSDimitry Andric     switch (Val) {
2235ffd83dbSDimitry Andric     case 0:
2245ffd83dbSDimitry Andric       return VECC::CC_AF;
2255ffd83dbSDimitry Andric     case 1:
2265ffd83dbSDimitry Andric       return VECC::CC_G;
2275ffd83dbSDimitry Andric     case 2:
2285ffd83dbSDimitry Andric       return VECC::CC_L;
2295ffd83dbSDimitry Andric     case 3:
2305ffd83dbSDimitry Andric       return VECC::CC_NE;
2315ffd83dbSDimitry Andric     case 4:
2325ffd83dbSDimitry Andric       return VECC::CC_EQ;
2335ffd83dbSDimitry Andric     case 5:
2345ffd83dbSDimitry Andric       return VECC::CC_GE;
2355ffd83dbSDimitry Andric     case 6:
2365ffd83dbSDimitry Andric       return VECC::CC_LE;
2375ffd83dbSDimitry Andric     case 7:
2385ffd83dbSDimitry Andric       return VECC::CC_NUM;
2395ffd83dbSDimitry Andric     case 8:
2405ffd83dbSDimitry Andric       return VECC::CC_NAN;
2415ffd83dbSDimitry Andric     case 9:
2425ffd83dbSDimitry Andric       return VECC::CC_GNAN;
2435ffd83dbSDimitry Andric     case 10:
2445ffd83dbSDimitry Andric       return VECC::CC_LNAN;
2455ffd83dbSDimitry Andric     case 11:
2465ffd83dbSDimitry Andric       return VECC::CC_NENAN;
2475ffd83dbSDimitry Andric     case 12:
2485ffd83dbSDimitry Andric       return VECC::CC_EQNAN;
2495ffd83dbSDimitry Andric     case 13:
2505ffd83dbSDimitry Andric       return VECC::CC_GENAN;
2515ffd83dbSDimitry Andric     case 14:
2525ffd83dbSDimitry Andric       return VECC::CC_LENAN;
2535ffd83dbSDimitry Andric     case 15:
2545ffd83dbSDimitry Andric       return VECC::CC_AT;
2555ffd83dbSDimitry Andric     }
256480093f4SDimitry Andric   }
257480093f4SDimitry Andric   llvm_unreachable("Invalid cond code");
258480093f4SDimitry Andric }
259480093f4SDimitry Andric 
2605ffd83dbSDimitry Andric inline static const char *VERDToString(VERD::RoundingMode R) {
2615ffd83dbSDimitry Andric   switch (R) {
2625ffd83dbSDimitry Andric   case VERD::RD_NONE:
2635ffd83dbSDimitry Andric     return "";
2645ffd83dbSDimitry Andric   case VERD::RD_RZ:
2655ffd83dbSDimitry Andric     return ".rz";
2665ffd83dbSDimitry Andric   case VERD::RD_RP:
2675ffd83dbSDimitry Andric     return ".rp";
2685ffd83dbSDimitry Andric   case VERD::RD_RM:
2695ffd83dbSDimitry Andric     return ".rm";
2705ffd83dbSDimitry Andric   case VERD::RD_RN:
2715ffd83dbSDimitry Andric     return ".rn";
2725ffd83dbSDimitry Andric   case VERD::RD_RA:
2735ffd83dbSDimitry Andric     return ".ra";
2745ffd83dbSDimitry Andric   default:
2755ffd83dbSDimitry Andric     llvm_unreachable("Invalid branch predicate");
2765ffd83dbSDimitry Andric   }
277480093f4SDimitry Andric }
278480093f4SDimitry Andric 
2795ffd83dbSDimitry Andric inline static VERD::RoundingMode stringToVERD(StringRef S) {
2805ffd83dbSDimitry Andric   return StringSwitch<VERD::RoundingMode>(S)
2815ffd83dbSDimitry Andric       .Case("", VERD::RD_NONE)
2825ffd83dbSDimitry Andric       .Case(".rz", VERD::RD_RZ)
2835ffd83dbSDimitry Andric       .Case(".rp", VERD::RD_RP)
2845ffd83dbSDimitry Andric       .Case(".rm", VERD::RD_RM)
2855ffd83dbSDimitry Andric       .Case(".rn", VERD::RD_RN)
2865ffd83dbSDimitry Andric       .Case(".ra", VERD::RD_RA)
2875ffd83dbSDimitry Andric       .Default(VERD::UNKNOWN);
288480093f4SDimitry Andric }
289480093f4SDimitry Andric 
2905ffd83dbSDimitry Andric inline static unsigned VERDToVal(VERD::RoundingMode R) {
2915ffd83dbSDimitry Andric   switch (R) {
2925ffd83dbSDimitry Andric   case VERD::RD_NONE:
2935ffd83dbSDimitry Andric   case VERD::RD_RZ:
2945ffd83dbSDimitry Andric   case VERD::RD_RP:
2955ffd83dbSDimitry Andric   case VERD::RD_RM:
2965ffd83dbSDimitry Andric   case VERD::RD_RN:
2975ffd83dbSDimitry Andric   case VERD::RD_RA:
2985ffd83dbSDimitry Andric     return static_cast<unsigned>(R);
2995ffd83dbSDimitry Andric   default:
3005ffd83dbSDimitry Andric     break;
3015ffd83dbSDimitry Andric   }
3025ffd83dbSDimitry Andric   llvm_unreachable("Invalid branch predicates");
3035ffd83dbSDimitry Andric }
3045ffd83dbSDimitry Andric 
3055ffd83dbSDimitry Andric inline static VERD::RoundingMode VEValToRD(unsigned Val) {
3065ffd83dbSDimitry Andric   switch (Val) {
3075ffd83dbSDimitry Andric   case static_cast<unsigned>(VERD::RD_NONE):
3085ffd83dbSDimitry Andric     return VERD::RD_NONE;
3095ffd83dbSDimitry Andric   case static_cast<unsigned>(VERD::RD_RZ):
3105ffd83dbSDimitry Andric     return VERD::RD_RZ;
3115ffd83dbSDimitry Andric   case static_cast<unsigned>(VERD::RD_RP):
3125ffd83dbSDimitry Andric     return VERD::RD_RP;
3135ffd83dbSDimitry Andric   case static_cast<unsigned>(VERD::RD_RM):
3145ffd83dbSDimitry Andric     return VERD::RD_RM;
3155ffd83dbSDimitry Andric   case static_cast<unsigned>(VERD::RD_RN):
3165ffd83dbSDimitry Andric     return VERD::RD_RN;
3175ffd83dbSDimitry Andric   case static_cast<unsigned>(VERD::RD_RA):
3185ffd83dbSDimitry Andric     return VERD::RD_RA;
3195ffd83dbSDimitry Andric   default:
3205ffd83dbSDimitry Andric     break;
3215ffd83dbSDimitry Andric   }
3225ffd83dbSDimitry Andric   llvm_unreachable("Invalid branch predicates");
3235ffd83dbSDimitry Andric }
3245ffd83dbSDimitry Andric 
3255ffd83dbSDimitry Andric // MImm - Special immediate value of sequential bit stream of 0 or 1.
3265ffd83dbSDimitry Andric //   See VEInstrInfo.td for details.
3275ffd83dbSDimitry Andric inline static bool isMImmVal(uint64_t Val) {
3285ffd83dbSDimitry Andric   if (Val == 0) {
3295ffd83dbSDimitry Andric     // (0)1 is 0
3305ffd83dbSDimitry Andric     return true;
3315ffd83dbSDimitry Andric   }
3325ffd83dbSDimitry Andric   if (isMask_64(Val)) {
3335ffd83dbSDimitry Andric     // (m)0 patterns
3345ffd83dbSDimitry Andric     return true;
3355ffd83dbSDimitry Andric   }
3365ffd83dbSDimitry Andric   // (m)1 patterns
337*d409305fSDimitry Andric   return (Val & (UINT64_C(1) << 63)) && isShiftedMask_64(Val);
3385ffd83dbSDimitry Andric }
3395ffd83dbSDimitry Andric 
3405ffd83dbSDimitry Andric inline static bool isMImm32Val(uint32_t Val) {
3415ffd83dbSDimitry Andric   if (Val == 0) {
3425ffd83dbSDimitry Andric     // (0)1 is 0
3435ffd83dbSDimitry Andric     return true;
3445ffd83dbSDimitry Andric   }
3455ffd83dbSDimitry Andric   if (isMask_32(Val)) {
3465ffd83dbSDimitry Andric     // (m)0 patterns
3475ffd83dbSDimitry Andric     return true;
3485ffd83dbSDimitry Andric   }
3495ffd83dbSDimitry Andric   // (m)1 patterns
350*d409305fSDimitry Andric   return (Val & (UINT32_C(1) << 31)) && isShiftedMask_32(Val);
3515ffd83dbSDimitry Andric }
3525ffd83dbSDimitry Andric 
353e8d8bef9SDimitry Andric /// val2MImm - Convert an integer immediate value to target MImm immediate.
354e8d8bef9SDimitry Andric inline static uint64_t val2MImm(uint64_t Val) {
355e8d8bef9SDimitry Andric   if (Val == 0)
356e8d8bef9SDimitry Andric     return 0; // (0)1
357*d409305fSDimitry Andric   if (Val & (UINT64_C(1) << 63))
358e8d8bef9SDimitry Andric     return countLeadingOnes(Val);       // (m)1
359e8d8bef9SDimitry Andric   return countLeadingZeros(Val) | 0x40; // (m)0
360e8d8bef9SDimitry Andric }
361e8d8bef9SDimitry Andric 
362e8d8bef9SDimitry Andric /// mimm2Val - Convert a target MImm immediate to an integer immediate value.
363e8d8bef9SDimitry Andric inline static uint64_t mimm2Val(uint64_t Val) {
364e8d8bef9SDimitry Andric   if (Val == 0)
365e8d8bef9SDimitry Andric     return 0; // (0)1
366e8d8bef9SDimitry Andric   if ((Val & 0x40) == 0)
367*d409305fSDimitry Andric     return (uint64_t)((INT64_C(1) << 63) >> (Val & 0x3f)); // (m)1
368*d409305fSDimitry Andric   return ((uint64_t)INT64_C(-1) >> (Val & 0x3f));          // (m)0
369e8d8bef9SDimitry Andric }
370e8d8bef9SDimitry Andric 
3715ffd83dbSDimitry Andric inline unsigned M0(unsigned Val) { return Val + 64; }
3725ffd83dbSDimitry Andric inline unsigned M1(unsigned Val) { return Val; }
3735ffd83dbSDimitry Andric 
374480093f4SDimitry Andric } // namespace llvm
375480093f4SDimitry Andric #endif
376