[cfe-commits] r63086 - /cfe/trunk/lib/CodeGen/CGCall.cpp

Daniel Dunbar daniel at zuster.org
Mon Jan 26 18:01:34 PST 2009


Author: ddunbar
Date: Mon Jan 26 20:01:34 2009
New Revision: 63086

URL: http://llvm.org/viewvc/llvm-project?rev=63086&view=rev
Log:
x86_64: Classify __m64 and __m128 "correctly".
 - gcc appears to be classifying <1 x double> as INTEGER which is
   odd. Will investigate later.

Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=63086&r1=63085&r2=63086&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Jan 26 20:01:34 2009
@@ -450,12 +450,24 @@
       Lo = X87;
       Hi = X87Up;
     }
-    // FIXME: _Decimal32, _Decimal64, and __m64 are SSE.
-    // FIXME: _float128, _Decimal128, and __m128 are (SSE, SSEUp).
+    
+    // FIXME: _Decimal32 and _Decimal64 are SSE.
+    // FIXME: _float128 and _Decimal128 are (SSE, SSEUp).
     // FIXME: __int128 is (Integer, Integer).
   } else if (Ty->isPointerLikeType() || Ty->isBlockPointerType() ||
              Ty->isObjCQualifiedInterfaceType()) {
     Lo = Integer;
+  } else if (const VectorType *VT = Ty->getAsVectorType()) {
+    unsigned Size = Context.getTypeSize(VT);
+    if (Size == 64) {
+      // FIXME: For some reason, gcc appears to be treating <1 x
+      // double> as INTEGER; this seems wrong, but we will match for
+      // now (icc rejects <1 x double>, so...).
+      Lo = (VT->getElementType() == Context.DoubleTy) ? Integer : SSE;
+    } else if (Size == 128) {
+      Lo = SSE;
+      Hi = SSEUp;
+    }
   } else if (const ComplexType *CT = Ty->getAsComplexType()) {
     QualType ET = CT->getElementType();
     





More information about the cfe-commits mailing list