summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2010-10-29 23:12:32 +0000
committerDale Johannesen <dalej@apple.com>2010-10-29 23:12:32 +0000
commit7d3dfc0622341be00cf9b0c2ad79db93fa533068 (patch)
tree8d98094955548454fed4641d8c5c34770f4ebe5a /clang/lib
parent45834a0065374a5ed6deed5353b3ab432dafeaa4 (diff)
downloadbcm5719-llvm-7d3dfc0622341be00cf9b0c2ad79db93fa533068.tar.gz
bcm5719-llvm-7d3dfc0622341be00cf9b0c2ad79db93fa533068.zip
Generate bitcasts going in and out of MMX parameters
in asm's. PR 8501, 8602988. I don't like including Type.h where it is; the idea was to get references to X86_MMXTy out of the common code. Maybe there's a better way? llvm-svn: 117736
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Basic/Targets.cpp13
-rw-r--r--clang/lib/CodeGen/CGStmt.cpp11
2 files changed, 23 insertions, 1 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 5ed285dcd74..631aa1f33d9 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -985,6 +985,9 @@ public:
}
virtual bool validateAsmConstraint(const char *&Name,
TargetInfo::ConstraintInfo &info) const;
+ virtual const llvm::Type* adjustInlineAsmType(std::string& Constraint,
+ const llvm::Type* Ty,
+ llvm::LLVMContext& Context) const;
virtual std::string convertConstraint(const char Constraint) const;
virtual const char *getClobbers() const {
return "~{dirflag},~{fpsr},~{flags}";
@@ -1306,6 +1309,16 @@ X86TargetInfo::validateAsmConstraint(const char *&Name,
return false;
}
+const llvm::Type*
+X86TargetInfo::adjustInlineAsmType(std::string& Constraint,
+ const llvm::Type* Ty,
+ llvm::LLVMContext &Context) const {
+ if (Constraint=="y" && Ty->isVectorTy())
+ return llvm::Type::getX86_MMXTy(Context);
+ return Ty;
+}
+
+
std::string
X86TargetInfo::convertConstraint(const char Constraint) const {
switch (Constraint) {
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index 4de505abdf6..282541bd02c 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -1046,6 +1046,10 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
ResultRegTypes.back() = ConvertType(InputTy);
}
}
+ if (const llvm::Type* AdjTy =
+ Target.adjustInlineAsmType(OutputConstraint, ResultRegTypes.back(),
+ VMContext))
+ ResultRegTypes.back() = AdjTy;
} else {
ArgTypes.push_back(Dest.getAddress()->getType());
Args.push_back(Dest.getAddress());
@@ -1109,7 +1113,10 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
Arg = Builder.CreateFPExt(Arg, OutputTy);
}
}
-
+ if (const llvm::Type* AdjTy =
+ Target.adjustInlineAsmType(InputConstraint, Arg->getType(),
+ VMContext))
+ Arg = Builder.CreateBitCast(Arg, AdjTy);
ArgTypes.push_back(Arg->getType());
Args.push_back(Arg);
@@ -1204,6 +1211,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
Tmp = Builder.CreateTrunc(Tmp, TruncTy);
} else if (TruncTy->isIntegerTy()) {
Tmp = Builder.CreateTrunc(Tmp, TruncTy);
+ } else if (TruncTy->isVectorTy()) {
+ Tmp = Builder.CreateBitCast(Tmp, TruncTy);
}
}
OpenPOWER on IntegriCloud