diff options
| author | Dale Johannesen <dalej@apple.com> | 2010-10-29 23:12:32 +0000 |
|---|---|---|
| committer | Dale Johannesen <dalej@apple.com> | 2010-10-29 23:12:32 +0000 |
| commit | 7d3dfc0622341be00cf9b0c2ad79db93fa533068 (patch) | |
| tree | 8d98094955548454fed4641d8c5c34770f4ebe5a /clang/lib | |
| parent | 45834a0065374a5ed6deed5353b3ab432dafeaa4 (diff) | |
| download | bcm5719-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.cpp | 13 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGStmt.cpp | 11 |
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); } } |

