[RISCV] Consider scalar types for required extensions.
authorHsiangkai Wang <kai.wang@sifive.com>
Fri, 7 May 2021 07:18:11 +0000 (15:18 +0800)
committerHsiangkai Wang <kai.wang@sifive.com>
Fri, 7 May 2021 20:06:45 +0000 (04:06 +0800)
We have vector operations on double vector and float scalar. For
example, vfwadd.wf is such a instruction.

vfloat64m1_t vfwadd_wf(vfloat64m1_t op0, float op1, size_t op2);

We should specify F and D extensions for it.

Differential Revision: https://reviews.llvm.org/D102051

clang/utils/TableGen/RISCVVEmitter.cpp

index 423e547..467a8b2 100644 (file)
@@ -107,6 +107,9 @@ public:
   bool isFloatVector(unsigned Width) const {
     return isVector() && isFloat() && ElementBitwidth == Width;
   }
+  bool isFloat(unsigned Width) const {
+    return isFloat() && ElementBitwidth == Width;
+  }
 
 private:
   // Verify RVV vector type and set Valid.
@@ -765,11 +768,11 @@ RVVIntrinsic::RVVIntrinsic(StringRef NewName, StringRef Suffix,
   }
   // Init RISC-V extensions
   for (const auto &T : OutInTypes) {
-    if (T->isFloatVector(16))
+    if (T->isFloatVector(16) || T->isFloat(16))
       RISCVExtensions |= RISCVExtension::Zfh;
-    else if (T->isFloatVector(32))
+    else if (T->isFloatVector(32) || T->isFloat(32))
       RISCVExtensions |= RISCVExtension::F;
-    else if (T->isFloatVector(64))
+    else if (T->isFloatVector(64) || T->isFloat(64))
       RISCVExtensions |= RISCVExtension::D;
   }
   if (RequiredExtension == "Zvamo")