diff options
| author | Michael Zuckerman <Michael.zuckerman@intel.com> | 2016-10-31 17:23:52 +0000 | 
|---|---|---|
| committer | Michael Zuckerman <Michael.zuckerman@intel.com> | 2016-10-31 17:23:52 +0000 | 
| commit | 849a6a5e5a1259c49c1544cfb84b476da5eae5c9 (patch) | |
| tree | 747edf2837fc27b064ded1c88da8c3633bac799d /clang/lib/Basic/Targets.cpp | |
| parent | 8a92dcc53b2d0225490b6b6eb22ed500defc688d (diff) | |
| download | bcm5719-llvm-849a6a5e5a1259c49c1544cfb84b476da5eae5c9.tar.gz bcm5719-llvm-849a6a5e5a1259c49c1544cfb84b476da5eae5c9.zip | |
[x86][inline-asm][AVX512][clang][PART-1] Introducing "k" and "Yk" constraints for extended inline assembly, enabling use of AVX512 masked vectorized instructions.
Commit on behalf of mharoush
Extending inline assembly support, compatible with GCC as folowing:
 "k" constraint hints the compiler to select any of AVX512 k0-k7 registers.
 "Yk" constraint is a subset of "k" excluding k0 which is not allowd to be used as a mask.
Reviewer: 1. rnk
Differential Revision: https://reviews.llvm.org/D25063
llvm-svn: 285604
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 20 | 
1 files changed, 20 insertions, 0 deletions
| diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 64c7dbee3e8..e2b82718928 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -3997,6 +3997,7 @@ X86TargetInfo::validateAsmConstraint(const char *&Name,      case 't': // Any SSE register, when SSE2 is enabled.      case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.      case 'm': // Any MMX register, when inter-unit moves enabled. +    case 'k': // AVX512 arch mask registers: k1-k7.        Info.setAllowsRegister();        return true;      } @@ -4018,6 +4019,8 @@ X86TargetInfo::validateAsmConstraint(const char *&Name,    case 'q': // Any register accessible as [r]l: a, b, c, and d.    case 'y': // Any MMX register.    case 'x': // Any SSE register. +  case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0 +            // for intermideate k reg operations).    case 'Q': // Any register accessible as [r]h: a, b, c, and d.    case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.    case 'l': // "Index" registers: any general register that can be used as an @@ -4051,6 +4054,8 @@ bool X86TargetInfo::validateOperandSize(StringRef Constraint,                                          unsigned Size) const {    switch (Constraint[0]) {    default: break; +  case 'k': +  // Registers k0-k7 (AVX512) size limit is 64 bit.    case 'y':      return Size <= 64;    case 'f': @@ -4071,6 +4076,7 @@ bool X86TargetInfo::validateOperandSize(StringRef Constraint,      default: break;      case 'm':        // 'Ym' is synonymous with 'y'. +    case 'k':        return Size <= 64;      case 'i':      case 't': @@ -4102,6 +4108,20 @@ X86TargetInfo::convertConstraint(const char *&Constraint) const {      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 'Y': +    switch (Constraint[1]) { +    default: +      // Break from inner switch and fall through (copy single char), +      // continue parsing after copying the current constraint into  +      // the return string. +      break; +    case 'k': +      // "^" hints llvm that this is a 2 letter constraint. +      // "Constraint++" is used to promote the string iterator  +      // to the next constraint. +      return std::string("^") + std::string(Constraint++, 2); +    }  +    LLVM_FALLTHROUGH;    default:      return std::string(1, *Constraint);    } | 

