[llvm-commits] [llvm-gcc-4.2] r117619 - in /llvm-gcc-4.2/trunk/gcc: config/i386/llvm-i386-target.h llvm-abi.h llvm-convert.cpp
Dale Johannesen
dalej at apple.com
Thu Oct 28 17:18:18 PDT 2010
Author: johannes
Date: Thu Oct 28 19:18:18 2010
New Revision: 117619
URL: http://llvm.org/viewvc/llvm-project?rev=117619&view=rev
Log:
Emit x86_mmx types for asm arguments based on looking
at the constraints ("y" is MMX). 8602988.
Modified:
llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
llvm-gcc-4.2/trunk/gcc/llvm-abi.h
llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Modified: llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h?rev=117619&r1=117618&r2=117619&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/i386/llvm-i386-target.h Thu Oct 28 19:18:18 2010
@@ -43,6 +43,13 @@
LLVMTy->getScalarSizeInBits() !=64) ? \
Type::getX86_MMXTy(Context) : LLVMTy)
+/* For parameters to an asm, check the constraint and use X86_mmx if an MMX
+ register is called for. "y" means an MMX register. */
+#define LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(Constraint, LLVMTy) \
+ ((TARGET_MMX && \
+ StringRef(Constraint).equals(StringRef(std::string("y")))) ? \
+ Type::getX86_MMXTy(Context) : LLVMTy)
+
/* LLVM specific stuff for supporting calling convention output */
#define TARGET_ADJUST_LLVM_CC(CC, type) \
{ \
Modified: llvm-gcc-4.2/trunk/gcc/llvm-abi.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-abi.h?rev=117619&r1=117618&r2=117619&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-abi.h (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-abi.h Thu Oct 28 19:18:18 2010
@@ -383,7 +383,11 @@
#endif
#ifndef LLVM_ADJUST_MMX_PARAMETER_TYPE
-#define LLVM_ADJUST_MMX_PARAMETER_TYPE(LLVMTy) LLVMTy
+#define LLVM_ADJUST_MMX_PARAMETER_TYPE(LLVMTy) (LLVMTy)
+#endif
+
+#ifndef LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE
+#define LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(Constraint, LLVMTy) (LLVMTy)
#endif
/// DefaultABI - This class implements the default LLVM ABI where structures are
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=117619&r1=117618&r2=117619&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Thu Oct 28 19:18:18 2010
@@ -4922,14 +4922,16 @@
StoreCallResultAddrs.push_back(Dest.Ptr);
ConstraintStr += ",=";
ConstraintStr += SimplifiedConstraint;
- CallResultTypes.push_back(DestValTy);
+ CallResultTypes.push_back(LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(
+ SimplifiedConstraint, DestValTy));
CallResultIsSigned.push_back(!TYPE_UNSIGNED(TREE_TYPE(Operand)));
OutputLocations.push_back(std::make_pair(true, CallResultTypes.size()-1));
} else {
ConstraintStr += ",=*";
ConstraintStr += SimplifiedConstraint;
CallOps.push_back(Dest.Ptr);
- CallArgTypes.push_back(Dest.Ptr->getType());
+ CallArgTypes.push_back(LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(
+ SimplifiedConstraint, Dest.Ptr->getType()));
OutputLocations.push_back(std::make_pair(false, CallArgTypes.size()-1));
}
}
@@ -5051,8 +5053,12 @@
}
}
+ const Type* AdjTy = LLVM_ADJUST_MMX_INLINE_PARAMETER_TYPE(
+ Constraint, Op->getType());
+ if (AdjTy != Op->getType())
+ Op = BitCastToType(Op, AdjTy);
CallOps.push_back(Op);
- CallArgTypes.push_back(Op->getType());
+ CallArgTypes.push_back(AdjTy);
} else { // Memory operand.
lang_hooks.mark_addressable(TREE_VALUE(Input));
isIndirect = true;
@@ -5156,11 +5162,20 @@
CV->setDoesNotThrow();
// If the call produces a value, store it into the destination.
- if (StoreCallResultAddrs.size() == 1)
- Builder.CreateStore(CV, StoreCallResultAddrs[0]);
- else if (unsigned NumResults = StoreCallResultAddrs.size()) {
+ if (StoreCallResultAddrs.size() == 1) {
+ Value *V = CV;
+ const Type *DestValTy =
+ cast<PointerType>(StoreCallResultAddrs[0]->getType())->getElementType();
+ if (CV->getType() != DestValTy)
+ V = BitCastToType(CV, DestValTy);
+ Builder.CreateStore(V, StoreCallResultAddrs[0]);
+ } else if (unsigned NumResults = StoreCallResultAddrs.size()) {
for (unsigned i = 0; i != NumResults; ++i) {
+ const Type *DestValTy =
+ cast<PointerType>(StoreCallResultAddrs[i]->getType())->getElementType();
Value *ValI = Builder.CreateExtractValue(CV, i, "asmresult");
+ if (ValI->getType() != DestValTy)
+ ValI = BitCastToType(ValI, DestValTy);
Builder.CreateStore(ValI, StoreCallResultAddrs[i]);
}
}
More information about the llvm-commits
mailing list