[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