================
@@ -680,14 +680,11 @@ ABIArgInfo RISCVABIInfo::classifyArgumentType(QualType 
Ty, bool IsFixed,
     if (const auto *ED = Ty->getAsEnumDecl())
       Ty = ED->getIntegerType();
 
-    // All integral types are promoted to XLen width
-    if (Size < XLen && Ty->isIntegralOrEnumerationType()) {
-      return extendType(Ty, CGT.ConvertType(Ty));
-    }
-
     if (const auto *EIT = Ty->getAs<BitIntType>()) {
-      if (EIT->getNumBits() < XLen)
-        return extendType(Ty, CGT.ConvertType(Ty));
+      // FIXME: Maybe we should treat 32 as a special case and wait for
+      // the SPEC to decide.
+      if (EIT->getNumBits() <= 2 * XLen)
+        return ABIArgInfo::getExtend(Ty, CGT.ConvertType(Ty));
       if (EIT->getNumBits() > 128 ||
----------------
BeMg wrote:

I think it's fine. And after this patch, I only assume updating the 
signed/unsigned extension between 0 and 2×XLEN. 

The other part match the following rule.

```
0~XLEN      pass by value(reg)
XLEN~2xXLEN pass by value(reg pair)
> 2xXLEN    pass be reference(mem)
```

cc @kito-cheng 


https://github.com/llvm/llvm-project/pull/156592
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to