[clang] [llvm] [RISCV][GISel] Add support for quadruple-precision floating point ABIs (PR #195166)

Gábor Spaits via cfe-commits cfe-commits at lists.llvm.org
Fri May 1 14:49:38 PDT 2026


================
@@ -102,12 +103,19 @@ struct RISCVOutgoingValueHandler : public CallLowering::OutgoingValueHandler {
     assert(VA.getValNo() == VAHi.getValNo() &&
            "Values belong to different arguments");
 
-    assert(VA.getLocVT() == MVT::i32 && VAHi.getLocVT() == MVT::i32 &&
-           VA.getValVT() == MVT::f64 && VAHi.getValVT() == MVT::f64 &&
-           "unexpected custom value");
-
-    Register NewRegs[] = {MRI.createGenericVirtualRegister(LLT::scalar(32)),
-                          MRI.createGenericVirtualRegister(LLT::scalar(32))};
+    uint32_t RegWidth = 0;
+    if (VA.getLocVT() == MVT::i32 && VAHi.getLocVT() == MVT::i32 &&
+        VA.getValVT() == MVT::f64 && VAHi.getValVT() == MVT::f64)
+      RegWidth = 32;
+    else if (VA.getLocVT() == MVT::i64 && VAHi.getLocVT() == MVT::i64 &&
+             VA.getValVT() == MVT::f128 && VAHi.getValVT() == MVT::f128)
+      RegWidth = 64;
+    else
+      llvm_unreachable("Unexpected custom value");
+
+    Register NewRegs[] = {
+        MRI.createGenericVirtualRegister(LLT::scalar(RegWidth)),
+        MRI.createGenericVirtualRegister(LLT::scalar(RegWidth))};
     MIRBuilder.buildUnmerge(NewRegs, Arg.Regs[0]);
----------------
spaits wrote:

Later on the `Register`s crated here will be used when calling `assignValueToAddress` and `assignValueToReg`. So I think this array should stay `Register[]`.

https://github.com/llvm/llvm-project/pull/195166


More information about the cfe-commits mailing list