LLVM 19.0.0git
RISCVTargetParser.h
Go to the documentation of this file.
1//===-- RISCVTargetParser - Parser for target features ----------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements a target parser to recognise hardware features
10// for RISC-V CPUs.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_TARGETPARSER_RISCVTARGETPARSER_H
15#define LLVM_TARGETPARSER_RISCVTARGETPARSER_H
16
17#include "llvm/ADT/StringRef.h"
20
21namespace llvm {
22
23class Triple;
24
25namespace RISCV {
26
27// We use 64 bits as the known part in the scalable vector types.
28static constexpr unsigned RVVBitsPerBlock = 64;
29
31 SmallVectorImpl<std::string> &EnabledFeatures,
32 bool NeedPlus = false);
33bool parseCPU(StringRef CPU, bool IsRV64);
34bool parseTuneCPU(StringRef CPU, bool IsRV64);
36void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
40
41} // namespace RISCV
42
43namespace RISCVII {
44enum VLMUL : uint8_t {
45 LMUL_1 = 0,
53};
54
55enum {
59};
60} // namespace RISCVII
61
62namespace RISCVVType {
63// Is this a SEW value that can be encoded into the VTYPE format.
64inline static bool isValidSEW(unsigned SEW) {
65 return isPowerOf2_32(SEW) && SEW >= 8 && SEW <= 64;
66}
67
68// Is this a LMUL value that can be encoded into the VTYPE format.
69inline static bool isValidLMUL(unsigned LMUL, bool Fractional) {
70 return isPowerOf2_32(LMUL) && LMUL <= 8 && (!Fractional || LMUL != 1);
71}
72
73unsigned encodeVTYPE(RISCVII::VLMUL VLMUL, unsigned SEW, bool TailAgnostic,
74 bool MaskAgnostic);
75
76inline static RISCVII::VLMUL getVLMUL(unsigned VType) {
77 unsigned VLMUL = VType & 0x7;
78 return static_cast<RISCVII::VLMUL>(VLMUL);
79}
80
81// Decode VLMUL into 1,2,4,8 and fractional indicator.
82std::pair<unsigned, bool> decodeVLMUL(RISCVII::VLMUL VLMUL);
83
84inline static RISCVII::VLMUL encodeLMUL(unsigned LMUL, bool Fractional) {
85 assert(isValidLMUL(LMUL, Fractional) && "Unsupported LMUL");
86 unsigned LmulLog2 = Log2_32(LMUL);
87 return static_cast<RISCVII::VLMUL>(Fractional ? 8 - LmulLog2 : LmulLog2);
88}
89
90inline static unsigned decodeVSEW(unsigned VSEW) {
91 assert(VSEW < 8 && "Unexpected VSEW value");
92 return 1 << (VSEW + 3);
93}
94
95inline static unsigned encodeSEW(unsigned SEW) {
96 assert(isValidSEW(SEW) && "Unexpected SEW value");
97 return Log2_32(SEW) - 3;
98}
99
100inline static unsigned getSEW(unsigned VType) {
101 unsigned VSEW = (VType >> 3) & 0x7;
102 return decodeVSEW(VSEW);
103}
104
105inline static bool isTailAgnostic(unsigned VType) { return VType & 0x40; }
106
107inline static bool isMaskAgnostic(unsigned VType) { return VType & 0x80; }
108
109void printVType(unsigned VType, raw_ostream &OS);
110
111unsigned getSEWLMULRatio(unsigned SEW, RISCVII::VLMUL VLMul);
112
113std::optional<RISCVII::VLMUL>
114getSameRatioLMUL(unsigned SEW, RISCVII::VLMUL VLMUL, unsigned EEW);
115} // namespace RISCVVType
116
117} // namespace llvm
118
119#endif
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:586
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
@ TAIL_UNDISTURBED_MASK_UNDISTURBED
static bool isTailAgnostic(unsigned VType)
static RISCVII::VLMUL getVLMUL(unsigned VType)
static unsigned decodeVSEW(unsigned VSEW)
std::pair< unsigned, bool > decodeVLMUL(RISCVII::VLMUL VLMUL)
unsigned getSEWLMULRatio(unsigned SEW, RISCVII::VLMUL VLMul)
static bool isValidLMUL(unsigned LMUL, bool Fractional)
static RISCVII::VLMUL encodeLMUL(unsigned LMUL, bool Fractional)
static bool isMaskAgnostic(unsigned VType)
static unsigned encodeSEW(unsigned SEW)
static bool isValidSEW(unsigned SEW)
void printVType(unsigned VType, raw_ostream &OS)
unsigned encodeVTYPE(RISCVII::VLMUL VLMUL, unsigned SEW, bool TailAgnostic, bool MaskAgnostic)
static unsigned getSEW(unsigned VType)
std::optional< RISCVII::VLMUL > getSameRatioLMUL(unsigned SEW, RISCVII::VLMUL VLMUL, unsigned EEW)
bool hasFastVectorUnalignedAccess(StringRef CPU)
void getFeaturesForCPU(StringRef CPU, SmallVectorImpl< std::string > &EnabledFeatures, bool NeedPlus=false)
void fillValidTuneCPUArchList(SmallVectorImpl< StringRef > &Values, bool IsRV64)
StringRef getMArchFromMcpu(StringRef CPU)
bool parseCPU(StringRef CPU, bool IsRV64)
bool hasFastScalarUnalignedAccess(StringRef CPU)
static constexpr unsigned RVVBitsPerBlock
bool parseTuneCPU(StringRef CPU, bool IsRV64)
void fillValidCPUArchList(SmallVectorImpl< StringRef > &Values, bool IsRV64)
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition: MathExtras.h:340
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition: MathExtras.h:291