diff options
author | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-02-26 18:33:46 +0000 |
---|---|---|
committer | Lauro Ramos Venancio <lauro.venancio@gmail.com> | 2008-02-26 18:33:46 +0000 |
commit | c9fbd7301a728a3373f08e01e67d82f0cdbfafd6 (patch) | |
tree | 88e67833016a27be63afa48a6d80764c09edcdb9 /clang/Basic/Targets.cpp | |
parent | a39cff3aaa8ee681fd1e59484da84a7cb9bcf39d (diff) | |
download | bcm5719-llvm-c9fbd7301a728a3373f08e01e67d82f0cdbfafd6.tar.gz bcm5719-llvm-c9fbd7301a728a3373f08e01e67d82f0cdbfafd6.zip |
Convert x86 target specific inline asm constraints to LLVM.
llvm-svn: 47609
Diffstat (limited to 'clang/Basic/Targets.cpp')
-rw-r--r-- | clang/Basic/Targets.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/clang/Basic/Targets.cpp b/clang/Basic/Targets.cpp index 6888d44f5ef..ed2e0e0a448 100644 --- a/clang/Basic/Targets.cpp +++ b/clang/Basic/Targets.cpp @@ -493,6 +493,28 @@ namespace X86 { } } + static std::string convertConstraint(const char Constraint) { + switch (Constraint) { + case 'a': return std::string("{ax}"); + case 'b': return std::string("{bx}"); + case 'c': return std::string("{cx}"); + case 'd': return std::string("{dx}"); + case 'S': return std::string("{si}"); + case 'D': return std::string("{di}"); + case 't': // top of floating point stack. + return std::string("{st}"); + case 'u': // second from top of floating point stack. + return std::string("{st(1)}"); // second from top of floating point stack. + case 'A': // edx:eax. + case 'q': // a, b, c, d registers or any integer register in 64-bit. + case 'Z': // 32-bit integer constant for used with zero-extending x86_64 + // instructions. + assert(false && "Unimplemented inline asm constraint"); + default: + return std::string(1, Constraint); + } + } + const char *getClobbers() { return "~{dirflag},~{fpsr},~{flags}"; } @@ -614,6 +636,11 @@ public: TargetInfo::ConstraintInfo &info) const { return X86::validateAsmConstraint(c, info); } + + virtual std::string convertConstraint(const char Constraint) const { + return X86::convertConstraint(Constraint); + } + virtual const char *getClobbers() const { return X86::getClobbers(); } @@ -650,7 +677,10 @@ public: virtual bool validateAsmConstraint(char c, TargetInfo::ConstraintInfo &info) const { return X86::validateAsmConstraint(c, info); - } + } + virtual std::string convertConstraint(const char Constraint) const { + return X86::convertConstraint(Constraint); + } virtual const char *getClobbers() const { return X86::getClobbers(); } @@ -732,6 +762,9 @@ public: TargetInfo::ConstraintInfo &info) const { return X86::validateAsmConstraint(c, info); } + virtual std::string convertConstraint(const char Constraint) const { + return X86::convertConstraint(Constraint); + } virtual const char *getClobbers() const { return X86::getClobbers(); } |