[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-03-17 Thread Zakk Chen via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG95c0125f2bc6: [Clang][RISCV] Add rvv vsetvl and vsetvlmax 
intrinsic functions. (authored by khchen).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

Files:
  clang/include/clang/Basic/riscv_vector.td
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvl.c
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvlmax.c
  clang/utils/TableGen/RISCVVEmitter.cpp

Index: clang/utils/TableGen/RISCVVEmitter.cpp
===
--- clang/utils/TableGen/RISCVVEmitter.cpp
+++ clang/utils/TableGen/RISCVVEmitter.cpp
@@ -145,6 +145,8 @@
   bool HasMaskedOffOperand;
   bool HasVL;
   bool HasGeneric;
+  bool HasAutoDef; // There is automiatic definition in header
+  std::string ManualCodegen;
   RVVTypePtr OutputType; // Builtin output type
   RVVTypes InputTypes;   // Builtin input types
   // The types we use to obtain the specific LLVM intrinsic. They are index of
@@ -159,8 +161,8 @@
   RVVIntrinsic(StringRef Name, StringRef Suffix, StringRef MangledName,
StringRef IRName, bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL, bool HasGeneric,
-   const RVVTypes ,
-   const std::vector );
+   bool HasAutoDef, StringRef ManualCodegen, const RVVTypes ,
+   const std::vector );
   ~RVVIntrinsic() = default;
 
   StringRef getName() const { return Name; }
@@ -169,6 +171,8 @@
   bool hasMaskedOffOperand() const { return HasMaskedOffOperand; }
   bool hasVL() const { return HasVL; }
   bool hasGeneric() const { return HasGeneric; }
+  bool hasManualCodegen() const { return !ManualCodegen.empty(); }
+  bool hasAutoDef() const { return HasAutoDef; }
   size_t getNumOperand() const { return InputTypes.size(); }
   StringRef getIRName() const { return IRName; }
   uint8_t getRISCVExtensions() const { return RISCVExtensions; }
@@ -190,6 +194,7 @@
 class RVVEmitter {
 private:
   RecordKeeper 
+  std::string HeaderCode;
   // Concat BasicType, LMUL and Proto as key
   StringMap LegalTypes;
   StringSet<> IllegalTypes;
@@ -637,11 +642,13 @@
StringRef NewMangledName, StringRef IRName,
bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL,
-   bool HasGeneric, const RVVTypes ,
+   bool HasGeneric, bool HasAutoDef,
+   StringRef ManualCodegen, const RVVTypes ,
const std::vector )
 : IRName(IRName), HasSideEffects(HasSideEffects),
   HasMaskedOffOperand(HasMaskedOffOperand), HasVL(HasVL),
-  HasGeneric(HasGeneric) {
+  HasGeneric(HasGeneric), HasAutoDef(HasAutoDef),
+  ManualCodegen(ManualCodegen.str()) {
 
   // Init Name and MangledName
   Name = NewName.str();
@@ -702,7 +709,13 @@
 }
 
 void RVVIntrinsic::emitCodeGenSwitchBody(raw_ostream ) const {
+
   OS << "  ID = Intrinsic::riscv_" + getIRName() + ";\n";
+  if (hasManualCodegen()) {
+OS << ManualCodegen;
+OS << "break;\n";
+return;
+  }
   OS << "  IntrinsicTypes = {";
   ListSeparator LS;
   for (const auto  : IntrinsicTypes) {
@@ -792,6 +805,11 @@
   std::vector> Defs;
   createRVVIntrinsics(Defs);
 
+  // Print header code
+  if (!HeaderCode.empty()) {
+OS << HeaderCode;
+  }
+
   auto printType = [&](auto T) {
 OS << "typedef " << T->getClangBuiltinStr() << " " << T->getTypeStr()
<< ";\n";
@@ -910,7 +928,6 @@
 
 void RVVEmitter::createRVVIntrinsics(
 std::vector> ) {
-
   std::vector RV = Records.getAllDerivedDefinitions("RVVBuiltin");
   for (auto *R : RV) {
 StringRef Name = R->getValueAsString("Name");
@@ -924,11 +941,18 @@
 bool HasGeneric = R->getValueAsBit("HasGeneric");
 bool HasSideEffects = R->getValueAsBit("HasSideEffects");
 std::vector Log2LMULList = R->getValueAsListOfInts("Log2LMUL");
+StringRef ManualCodegen = R->getValueAsString("ManualCodegen");
+StringRef ManualCodegenMask = R->getValueAsString("ManualCodegenMask");
 std::vector IntrinsicTypes =
 R->getValueAsListOfInts("IntrinsicTypes");
 StringRef IRName = R->getValueAsString("IRName");
 StringRef IRNameMask = R->getValueAsString("IRNameMask");
 
+StringRef HeaderCodeStr = R->getValueAsString("HeaderCode");
+bool HasAutoDef = HeaderCodeStr.empty();
+if (!HeaderCodeStr.empty()) {
+  HeaderCode += HeaderCodeStr.str();
+}
 // Parse prototype and create a list of primitive type with transformers
 // (operand) in ProtoSeq. ProtoSeq[0] is output operand.
 SmallVector ProtoSeq;
@@ -955,7 +979,7 @@
   ProtoMaskSeq.push_back("z");
 }
 
-// Create intrinsics for each type and LMUL.
+// Create Intrinsics for each type and LMUL.
 for (char I : TypeRange) {
   

[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-03-17 Thread Craig Topper via Phabricator via cfe-commits
craig.topper accepted this revision.
craig.topper added a comment.
This revision is now accepted and ready to land.

LGTM


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-03-17 Thread Zakk Chen via Phabricator via cfe-commits
khchen marked an inline comment as done.
khchen added inline comments.



Comment at: clang/lib/Basic/Targets/RISCV.cpp:169
+Builder.defineMacro("__rvv_e64", "3");
+Builder.defineMacro("__rvv_e128", "4");
+

craig.topper wrote:
> Are intending to support e128?
remove! thanks


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-03-17 Thread Zakk Chen via Phabricator via cfe-commits
khchen updated this revision to Diff 331267.
khchen marked 2 inline comments as done.
khchen added a comment.

1. address Craig's comments.
2. update test by using 2>&1 instead of 2>%t


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

Files:
  clang/include/clang/Basic/riscv_vector.td
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvl.c
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvlmax.c
  clang/utils/TableGen/RISCVVEmitter.cpp

Index: clang/utils/TableGen/RISCVVEmitter.cpp
===
--- clang/utils/TableGen/RISCVVEmitter.cpp
+++ clang/utils/TableGen/RISCVVEmitter.cpp
@@ -145,6 +145,8 @@
   bool HasMaskedOffOperand;
   bool HasVL;
   bool HasGeneric;
+  bool HasAutoDef; // There is automiatic definition in header
+  std::string ManualCodegen;
   RVVTypePtr OutputType; // Builtin output type
   RVVTypes InputTypes;   // Builtin input types
   // The types we use to obtain the specific LLVM intrinsic. They are index of
@@ -159,8 +161,8 @@
   RVVIntrinsic(StringRef Name, StringRef Suffix, StringRef MangledName,
StringRef IRName, bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL, bool HasGeneric,
-   const RVVTypes ,
-   const std::vector );
+   bool HasAutoDef, StringRef ManualCodegen, const RVVTypes ,
+   const std::vector );
   ~RVVIntrinsic() = default;
 
   StringRef getName() const { return Name; }
@@ -169,6 +171,8 @@
   bool hasMaskedOffOperand() const { return HasMaskedOffOperand; }
   bool hasVL() const { return HasVL; }
   bool hasGeneric() const { return HasGeneric; }
+  bool hasManualCodegen() const { return !ManualCodegen.empty(); }
+  bool hasAutoDef() const { return HasAutoDef; }
   size_t getNumOperand() const { return InputTypes.size(); }
   StringRef getIRName() const { return IRName; }
   uint8_t getRISCVExtensions() const { return RISCVExtensions; }
@@ -190,6 +194,7 @@
 class RVVEmitter {
 private:
   RecordKeeper 
+  std::string HeaderCode;
   // Concat BasicType, LMUL and Proto as key
   StringMap LegalTypes;
   StringSet<> IllegalTypes;
@@ -637,11 +642,13 @@
StringRef NewMangledName, StringRef IRName,
bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL,
-   bool HasGeneric, const RVVTypes ,
+   bool HasGeneric, bool HasAutoDef,
+   StringRef ManualCodegen, const RVVTypes ,
const std::vector )
 : IRName(IRName), HasSideEffects(HasSideEffects),
   HasMaskedOffOperand(HasMaskedOffOperand), HasVL(HasVL),
-  HasGeneric(HasGeneric) {
+  HasGeneric(HasGeneric), HasAutoDef(HasAutoDef),
+  ManualCodegen(ManualCodegen.str()) {
 
   // Init Name and MangledName
   Name = NewName.str();
@@ -702,7 +709,13 @@
 }
 
 void RVVIntrinsic::emitCodeGenSwitchBody(raw_ostream ) const {
+
   OS << "  ID = Intrinsic::riscv_" + getIRName() + ";\n";
+  if (hasManualCodegen()) {
+OS << ManualCodegen;
+OS << "break;\n";
+return;
+  }
   OS << "  IntrinsicTypes = {";
   ListSeparator LS;
   for (const auto  : IntrinsicTypes) {
@@ -792,6 +805,11 @@
   std::vector> Defs;
   createRVVIntrinsics(Defs);
 
+  // Print header code
+  if (!HeaderCode.empty()) {
+OS << HeaderCode;
+  }
+
   auto printType = [&](auto T) {
 OS << "typedef " << T->getClangBuiltinStr() << " " << T->getTypeStr()
<< ";\n";
@@ -910,7 +928,6 @@
 
 void RVVEmitter::createRVVIntrinsics(
 std::vector> ) {
-
   std::vector RV = Records.getAllDerivedDefinitions("RVVBuiltin");
   for (auto *R : RV) {
 StringRef Name = R->getValueAsString("Name");
@@ -924,11 +941,18 @@
 bool HasGeneric = R->getValueAsBit("HasGeneric");
 bool HasSideEffects = R->getValueAsBit("HasSideEffects");
 std::vector Log2LMULList = R->getValueAsListOfInts("Log2LMUL");
+StringRef ManualCodegen = R->getValueAsString("ManualCodegen");
+StringRef ManualCodegenMask = R->getValueAsString("ManualCodegenMask");
 std::vector IntrinsicTypes =
 R->getValueAsListOfInts("IntrinsicTypes");
 StringRef IRName = R->getValueAsString("IRName");
 StringRef IRNameMask = R->getValueAsString("IRNameMask");
 
+StringRef HeaderCodeStr = R->getValueAsString("HeaderCode");
+bool HasAutoDef = HeaderCodeStr.empty();
+if (!HeaderCodeStr.empty()) {
+  HeaderCode += HeaderCodeStr.str();
+}
 // Parse prototype and create a list of primitive type with transformers
 // (operand) in ProtoSeq. ProtoSeq[0] is output operand.
 SmallVector ProtoSeq;
@@ -955,7 +979,7 @@
   ProtoMaskSeq.push_back("z");
 }
 
-// Create intrinsics for each type and LMUL.
+// Create Intrinsics for each type and LMUL.
 for (char I : TypeRange) {
   for 

[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-03-15 Thread Craig Topper via Phabricator via cfe-commits
craig.topper added inline comments.



Comment at: clang/lib/Basic/Targets/RISCV.cpp:164
+
+// SEW
+Builder.defineMacro("__rvv_e8", "0");

I'm not sure if it makes sense to expose these from the compiler. Should we 
define them in the header instead? They don't look useful without the header. 
Most of the defines from the compiler are expressing capabilities like what 
features are enabled so these seem different.



Comment at: clang/lib/Basic/Targets/RISCV.cpp:169
+Builder.defineMacro("__rvv_e64", "3");
+Builder.defineMacro("__rvv_e128", "4");
+

Are intending to support e128?



Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:774
+  // Print header code
+  if (HeaderCode.size()) {
+OS << HeaderCode;

!HeaderCode.empty()


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-02-25 Thread Zakk Chen via Phabricator via cfe-commits
khchen added inline comments.



Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:1052
   uint8_t PrevExt = (*Defs.begin())->getRISCV_Extensions();
-  bool NeedEndif = emitExtDefStr(PrevExt, OS);
+  bool NeedEndif =
+  (*Defs.begin())->hasAutoDef() ? emitExtDefStr(PrevExt, OS) : false;

craig.topper wrote:
> It doesn't make sense to me to skip the emitExtDefStr for !hasAutoDef. The 
> intrinsics without a definition are still sorted with the others. If they 
> happen to have non-zero extensions and on the boundary of the different 
> extension regions in the sorted list we still need to manage the #if/#endif 
> for that boundary.
You are right, thanks for catch bug!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-02-25 Thread Zakk Chen via Phabricator via cfe-commits
khchen updated this revision to Diff 326612.
khchen marked 3 inline comments as done.
khchen added a comment.

address Craig's comments.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

Files:
  clang/include/clang/Basic/riscv_vector.td
  clang/lib/Basic/Targets/RISCV.cpp
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvl.c
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvlmax.c
  clang/utils/TableGen/RISCVVEmitter.cpp

Index: clang/utils/TableGen/RISCVVEmitter.cpp
===
--- clang/utils/TableGen/RISCVVEmitter.cpp
+++ clang/utils/TableGen/RISCVVEmitter.cpp
@@ -129,6 +129,8 @@
   bool HasMaskedOffOperand;
   bool HasVL;
   bool HasGeneric;
+  bool HasAutoDef; // There is automiatic definition in header
+  std::string ManualCodegen;
   RVVTypePtr OutputType; // Builtin output type
   RVVTypes InputTypes;   // Builtin input types
   // The types we use to obtain the specific LLVM intrinsic. They are index of
@@ -143,8 +145,8 @@
   RVVIntrinsic(StringRef Name, StringRef Suffix, StringRef MangledName,
StringRef IRName, bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL, bool HasGeneric,
-   const RVVTypes ,
-   const std::vector );
+   bool HasAutoDef, StringRef ManualCodegen, const RVVTypes ,
+   const std::vector );
   ~RVVIntrinsic() = default;
 
   StringRef getName() const { return Name; }
@@ -153,6 +155,8 @@
   bool hasMaskedOffOperand() const { return HasMaskedOffOperand; }
   bool hasVL() const { return HasVL; }
   bool hasGeneric() const { return HasGeneric; }
+  bool hasManualCodegen() const { return !ManualCodegen.empty(); }
+  bool hasAutoDef() const { return HasAutoDef; }
   size_t getNumOperand() const { return InputTypes.size(); }
   StringRef getIRName() const { return IRName; }
   uint8_t getRISCV_Extensions() const { return RISCV_Extensions; }
@@ -174,6 +178,7 @@
 class RVVEmitter {
 private:
   RecordKeeper 
+  std::string HeaderCode;
   // Concat BasicType, LMUL and Proto as key
   StringMap LegalTypes;
   StringSet<> IllegalTypes;
@@ -603,11 +608,13 @@
StringRef NewMangledName, StringRef IRName,
bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL,
-   bool HasGeneric, const RVVTypes ,
+   bool HasGeneric, bool HasAutoDef,
+   StringRef ManualCodegen, const RVVTypes ,
const std::vector )
 : IRName(IRName), HasSideEffects(HasSideEffects),
   HasMaskedOffOperand(HasMaskedOffOperand), HasVL(HasVL),
-  HasGeneric(HasGeneric) {
+  HasGeneric(HasGeneric), HasAutoDef(HasAutoDef),
+  ManualCodegen(ManualCodegen.str()) {
 
   // Init Name and MangledName
   Name = NewName.str();
@@ -668,7 +675,13 @@
 }
 
 void RVVIntrinsic::emitCodeGenSwitchBody(raw_ostream ) const {
+
   OS << "  ID = Intrinsic::riscv_" + getIRName() + ";\n";
+  if (hasManualCodegen()) {
+OS << ManualCodegen;
+OS << "break;\n";
+return;
+  }
   OS << "  IntrinsicTypes = {";
   for (const auto  : IntrinsicTypes) {
 if (Idx == -1)
@@ -757,6 +770,11 @@
   std::vector> Defs;
   createRVVIntrinsics(Defs);
 
+  // Print header code
+  if (HeaderCode.size()) {
+OS << HeaderCode;
+  }
+
   auto printType = [&](auto T) {
 OS << "typedef " << T->getClangBuiltinStr() << " " << T->getTypeStr()
<< ";\n";
@@ -875,7 +893,6 @@
 
 void RVVEmitter::createRVVIntrinsics(
 std::vector> ) {
-
   std::vector RV = Records.getAllDerivedDefinitions("RVVBuiltin");
   for (auto *R : RV) {
 StringRef Name = R->getValueAsString("Name");
@@ -889,11 +906,18 @@
 bool HasGeneric = R->getValueAsBit("HasGeneric");
 bool HasSideEffects = R->getValueAsBit("HasSideEffects");
 std::vector Log2LMULList = R->getValueAsListOfInts("Log2LMUL");
+StringRef ManualCodegen = R->getValueAsString("ManualCodegen");
+StringRef ManualCodegenMask = R->getValueAsString("ManualCodegenMask");
 std::vector IntrinsicTypes =
 R->getValueAsListOfInts("IntrinsicTypes");
 StringRef IRName = R->getValueAsString("IRName");
 StringRef IRNameMask = R->getValueAsString("IRNameMask");
 
+StringRef HeaderCodeStr = R->getValueAsString("HeaderCode");
+bool HasAutoDef = HeaderCodeStr.empty();
+if (!HeaderCodeStr.empty()) {
+  HeaderCode += HeaderCodeStr.str();
+}
 // Parse prototype and create a list of primitive type with transformers
 // (operand) in ProtoSeq. ProtoSeq[0] is output operand.
 SmallVector ProtoSeq;
@@ -920,7 +944,7 @@
   ProtoMaskSeq.push_back("z");
 }
 
-// Create intrinsics for each type and LMUL.
+// Create Intrinsics for each type and LMUL.
 for (char I : TypeRange) {
   for (int Log2LMUL 

[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-02-25 Thread Craig Topper via Phabricator via cfe-commits
craig.topper added inline comments.



Comment at: clang/include/clang/Basic/riscv_vector.td:165
+  // and it will have to be provided manually. See IntrinsicTypes below.
+  bit HasManualCodegen = true;
+

Why do we need a flag? Can we just make ManualCodegen and ManualCodegenMask 
default to empty rather than a code sequence that we should never use? Then we 
can just detect them not being empty in place of the flag.



Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:924
+bool HasAutoDef = HeaderCodeStr.empty();
+if (HeaderCodeStr.size()) {
+  HeaderCode += HeaderCodeStr.str();

!HeaderCodeStr.empty()



Comment at: clang/utils/TableGen/RISCVVEmitter.cpp:1052
   uint8_t PrevExt = (*Defs.begin())->getRISCV_Extensions();
-  bool NeedEndif = emitExtDefStr(PrevExt, OS);
+  bool NeedEndif =
+  (*Defs.begin())->hasAutoDef() ? emitExtDefStr(PrevExt, OS) : false;

It doesn't make sense to me to skip the emitExtDefStr for !hasAutoDef. The 
intrinsics without a definition are still sorted with the others. If they 
happen to have non-zero extensions and on the boundary of the different 
extension regions in the sorted list we still need to manage the #if/#endif for 
that boundary.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-02-25 Thread Zakk Chen via Phabricator via cfe-commits
khchen updated this revision to Diff 326310.
khchen added a comment.

Rebase.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D96843/new/

https://reviews.llvm.org/D96843

Files:
  clang/include/clang/Basic/riscv_vector.td
  clang/lib/Basic/Targets/RISCV.cpp
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvl.c
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvlmax.c
  clang/utils/TableGen/RISCVVEmitter.cpp

Index: clang/utils/TableGen/RISCVVEmitter.cpp
===
--- clang/utils/TableGen/RISCVVEmitter.cpp
+++ clang/utils/TableGen/RISCVVEmitter.cpp
@@ -129,6 +129,9 @@
   bool HasMaskedOffOperand;
   bool HasVL;
   bool HasGeneric;
+  bool HasAutoDef;
+  bool HasManualCodegen;
+  std::string ManualCodegen;
   RVVTypePtr OutputType; // Builtin output type
   RVVTypes InputTypes;   // Builtin input types
   // The types we use to obtain the specific LLVM intrinsic. They are index of
@@ -143,8 +146,9 @@
   RVVIntrinsic(StringRef Name, StringRef Suffix, StringRef MangledName,
StringRef IRName, bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL, bool HasGeneric,
+   bool HasAutoDef, bool HasManualCodegen, StringRef ManualCodegen,
const RVVTypes ,
-   const std::vector );
+   const std::vector );
   ~RVVIntrinsic() = default;
 
   StringRef getName() const { return Name; }
@@ -153,6 +157,7 @@
   bool hasMaskedOffOperand() const { return HasMaskedOffOperand; }
   bool hasVL() const { return HasVL; }
   bool hasGeneric() const { return HasGeneric; }
+  bool hasAutoDef() const { return HasAutoDef; }
   size_t getNumOperand() const { return InputTypes.size(); }
   StringRef getIRName() const { return IRName; }
   uint8_t getRISCV_Extensions() const { return RISCV_Extensions; }
@@ -174,6 +179,7 @@
 class RVVEmitter {
 private:
   RecordKeeper 
+  std::string HeaderCode;
   // Concat BasicType, LMUL and Proto as key
   StringMap LegalTypes;
   StringSet<> IllegalTypes;
@@ -603,11 +609,14 @@
StringRef NewMangledName, StringRef IRName,
bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL,
-   bool HasGeneric, const RVVTypes ,
+   bool HasGeneric, bool HasAutoDef,
+   bool HasManualCodegen, StringRef ManualCodegen,
+   const RVVTypes ,
const std::vector )
 : IRName(IRName), HasSideEffects(HasSideEffects),
   HasMaskedOffOperand(HasMaskedOffOperand), HasVL(HasVL),
-  HasGeneric(HasGeneric) {
+  HasGeneric(HasGeneric), HasAutoDef(HasAutoDef),
+  HasManualCodegen(HasManualCodegen), ManualCodegen(ManualCodegen.str()) {
 
   // Init Name and MangledName
   Name = NewName.str();
@@ -670,6 +679,10 @@
 void RVVIntrinsic::emitCodeGenSwitchBody(raw_ostream ) const {
 
   OS << "  ID = Intrinsic::riscv_" + getIRName() + ";\n";
+  if (HasManualCodegen) {
+OS << ManualCodegen;
+return;
+  }
   OS << "  IntrinsicTypes = {";
   for (const auto  : IntrinsicTypes) {
 if (Idx == -1)
@@ -759,6 +772,11 @@
   std::vector> Defs;
   createRVVIntrinsics(Defs);
 
+  // Print header code
+  if (HeaderCode.size()) {
+OS << HeaderCode;
+  }
+
   auto printType = [&](auto T) {
 OS << "typedef " << T->getClangBuiltinStr() << " " << T->getTypeStr()
<< ";\n";
@@ -880,7 +898,6 @@
 
 void RVVEmitter::createRVVIntrinsics(
 std::vector> ) {
-
   std::vector RV = Records.getAllDerivedDefinitions("RVVBuiltin");
   for (auto *R : RV) {
 StringRef Name = R->getValueAsString("Name");
@@ -894,11 +911,19 @@
 bool HasGeneric = R->getValueAsBit("HasGeneric");
 bool HasSideEffects = R->getValueAsBit("HasSideEffects");
 std::vector Log2LMULList = R->getValueAsListOfInts("Log2LMUL");
+bool HasManualCodegen = R->getValueAsBit("HasManualCodegen");
+StringRef ManualCodegen = R->getValueAsString("ManualCodegen");
+StringRef ManualCodegenMask = R->getValueAsString("ManualCodegenMask");
 std::vector IntrinsicTypes =
 R->getValueAsListOfInts("IntrinsicTypes");
 StringRef IRName = R->getValueAsString("IRName");
 StringRef IRNameMask = R->getValueAsString("IRNameMask");
 
+StringRef HeaderCodeStr = R->getValueAsString("HeaderCode");
+bool HasAutoDef = HeaderCodeStr.empty();
+if (HeaderCodeStr.size()) {
+  HeaderCode += HeaderCodeStr.str();
+}
 // Parse prototype and create a list of primitive type with transformers
 // (operand) in ProtoSeq. ProtoSeq[0] is output operand.
 SmallVector ProtoSeq;
@@ -925,7 +950,7 @@
   ProtoMaskSeq.push_back("z");
 }
 
-// Create intrinsics for each type and LMUL.
+// Create Intrinsics for each type and LMUL.
 for (char I : TypeRange) {
   for (int Log2LMUL : Log2LMULList) 

[PATCH] D96843: [Clang][RISCV] Add vsetvl and vsetvlmax.

2021-02-16 Thread Zakk Chen via Phabricator via cfe-commits
khchen created this revision.
khchen added reviewers: craig.topper, jrtc27, rogfer01, frasercrmck, HsiangKai, 
evandro.
Herald added subscribers: vkmr, dexonsmith, luismarques, apazos, 
sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, 
brucehoult, MartinMosbeck, edward-jones, zzheng, shiva0217, kito-cheng, niosHD, 
sabuasal, simoncook, johnrusso, rbar, asb.
khchen requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay.
Herald added a project: clang.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D96843

Files:
  clang/include/clang/Basic/riscv_vector.td
  clang/lib/Basic/Targets/RISCV.cpp
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvl.c
  clang/test/CodeGen/RISCV/rvv-intrinsics/vsetvlmax.c
  clang/utils/TableGen/RISCVVEmitter.cpp

Index: clang/utils/TableGen/RISCVVEmitter.cpp
===
--- clang/utils/TableGen/RISCVVEmitter.cpp
+++ clang/utils/TableGen/RISCVVEmitter.cpp
@@ -132,6 +132,9 @@
   bool HasMaskedOffOperand;
   bool HasVL;
   bool HasGeneric;
+  bool HasAutoDef;
+  bool HasManualCodegen;
+  std::string ManualCodegen;
   RVVTypes Types;  // Include output and other input
   std::vector IntrinsicTypes; // Type name in LLVM IR intrinsic suffix
   uint8_t RISCV_Extensions = 0;
@@ -140,8 +143,9 @@
   RVVIntrinsic(StringRef Name, StringRef Suffix, StringRef MangledName,
StringRef IRName, bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL, bool HasGeneric,
+   bool HasAutoDef, bool HasManualCodegen, StringRef ManualCodegen,
const RVVTypes ,
-   const std::vector );
+   const std::vector );
   ~RVVIntrinsic() = default;
 
   StringRef getName() const { return Name; }
@@ -150,6 +154,9 @@
   bool hasMaskedOffOperand() const { return HasMaskedOffOperand; }
   bool hasVL() const { return HasVL; }
   bool hasGeneric() const { return HasGeneric; }
+  bool hasAutoDef() const { return HasAutoDef; }
+  bool hasManualCodegen() const { return HasManualCodegen; }
+  StringRef getManualCodegen() const { return ManualCodegen; }
   size_t getNumOperand() const { return Types.size() - 1; }
   // Get output and input types
   ArrayRef getTypes() const { return Types; }
@@ -176,6 +183,7 @@
 class RVVEmitter {
 private:
   RecordKeeper 
+  std::string HeaderCode;
   // Concat BasicType, LMUL and Proto as key
   StringMap LegalTypes;
   StringSet<> IllegalTypes;
@@ -604,11 +612,15 @@
StringRef NewMangledName, StringRef IRName,
bool HasSideEffects, bool IsMask,
bool HasMaskedOffOperand, bool HasVL,
-   bool HasGeneric, const RVVTypes ,
+   bool HasGeneric, bool HasAutoDef,
+   bool HasManualCodegen, StringRef ManualCodegen,
+   const RVVTypes ,
const std::vector )
 : IRName(IRName), HasSideEffects(HasSideEffects), IsMask(IsMask),
   HasMaskedOffOperand(HasMaskedOffOperand), HasVL(HasVL),
-  HasGeneric(HasGeneric), Types(Types), IntrinsicTypes(IntrinsicTypes) {
+  HasGeneric(HasGeneric), HasAutoDef(HasAutoDef),
+  HasManualCodegen(HasManualCodegen), ManualCodegen(ManualCodegen.str()),
+  Types(Types), IntrinsicTypes(IntrinsicTypes) {
 
   // Init Name and MangledName
   Name = NewName.str();
@@ -645,8 +657,6 @@
 
   auto getIntrinsicTypesString =
   [this](const std::vector , raw_ostream ) {
-OS << "  ID = Intrinsic::riscv_" + getIRName() + ";\n";
-
 OS << "  IntrinsicTypes = {";
 for (const auto  : IntrinsicTypes) {
   if (Idx == -1)
@@ -663,6 +673,11 @@
 OS << "};\n";
   };
 
+  OS << "  ID = Intrinsic::riscv_" + getIRName() + ";\n";
+  if (hasManualCodegen()) {
+OS << getManualCodegen().str();
+return;
+  }
   if (!IsMask) {
 getIntrinsicTypesString(getIntrinsicTypes(), OS);
 return;
@@ -756,6 +771,11 @@
   std::vector> Defs;
   createRVVIntrinsics(Defs);
 
+  // Dump header
+  if (HeaderCode.size()) {
+OS << HeaderCode;
+  }
+
   // Dump RVV boolean types.
   auto dumpType = [&](auto T) {
 OS << "typedef " << T->clang_builtin_str() << " " << T->type_str() << ";\n";
@@ -875,7 +895,6 @@
 
 void RVVEmitter::createRVVIntrinsics(
 std::vector> ) {
-
   std::vector RV = Records.getAllDerivedDefinitions("RVVBuiltin");
   for (auto *R : RV) {
 StringRef Name = R->getValueAsString("Name");
@@ -889,11 +908,19 @@
 bool HasGeneric = R->getValueAsBit("HasGeneric");
 bool HasSideEffects = R->getValueAsBit("HasSideEffects");
 std::vector Log2LMULList = R->getValueAsListOfInts("Log2LMUL");
+bool HasManualCodegen = R->getValueAsBit("HasManualCodegen");
+StringRef ManualCodegen = R->getValueAsString("ManualCodegen");
+StringRef ManualCodegenMask =