diff options
Diffstat (limited to 'clang/lib/Basic/Targets/AMDGPU.h')
| -rw-r--r-- | clang/lib/Basic/Targets/AMDGPU.h | 51 | 
1 files changed, 44 insertions, 7 deletions
| diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index 456cb2ebb8b55..d0394492cad6d 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -114,11 +114,14 @@ public:    /// Accepted register names: (n, m is unsigned integer, n < m)    /// v    /// s +  /// a    /// {vn}, {v[n]}    /// {sn}, {s[n]} +  /// {an}, {a[n]}    /// {S} , where S is a special register name    ////{v[n:m]}    /// {s[n:m]} +  /// {a[n:m]}    bool validateAsmConstraint(const char *&Name,                               TargetInfo::ConstraintInfo &Info) const override {      static const ::llvm::StringSet<> SpecialRegs({ @@ -127,7 +130,30 @@ public:          "exec_hi", "tma_lo", "tma_hi", "tba_lo", "tba_hi",      }); +    switch (*Name) { +    case 'I': +      Info.setRequiresImmediate(-16, 64); +      return true; +    case 'J': +      Info.setRequiresImmediate(-32768, 32767); +      return true; +    case 'A': +    case 'B': +    case 'C': +      Info.setRequiresImmediate(); +      return true; +    default: +      break; +    } +      StringRef S(Name); + +    if (S == "DA" || S == "DB") { +      Name++; +      Info.setRequiresImmediate(); +      return true; +    } +      bool HasLeftParen = false;      if (S.front() == '{') {        HasLeftParen = true; @@ -135,7 +161,7 @@ public:      }      if (S.empty())        return false; -    if (S.front() != 'v' && S.front() != 's') { +    if (S.front() != 'v' && S.front() != 's' && S.front() != 'a') {        if (!HasLeftParen)          return false;        auto E = S.find('}'); @@ -153,7 +179,7 @@ public:      if (!HasLeftParen) {        if (!S.empty())          return false; -      // Found s or v. +      // Found s, v or a.        Info.setAllowsRegister();        Name = S.data() - 1;        return true; @@ -184,7 +210,8 @@ public:      S = S.drop_front();      if (!S.empty())        return false; -    // Found {vn}, {sn}, {v[n]}, {s[n]}, {v[n:m]}, or {s[n:m]}. +    // Found {vn}, {sn}, {an}, {v[n]}, {s[n]}, {a[n]}, {v[n:m]}, {s[n:m]} +    // or {a[n:m]}.      Info.setAllowsRegister();      Name = S.data() - 1;      return true; @@ -194,6 +221,12 @@ public:    // the constraint.  In practice, it won't be changed unless the    // constraint is longer than one character.    std::string convertConstraint(const char *&Constraint) const override { + +    StringRef S(Constraint); +    if (S == "DA" || S == "DB") { +      return std::string("^") + std::string(Constraint++, 2); +    } +      const char *Begin = Constraint;      TargetInfo::ConstraintInfo Info("", "");      if (validateAsmConstraint(Constraint, Info)) @@ -208,11 +241,10 @@ public:                   StringRef CPU,                   const std::vector<std::string> &FeatureVec) const override; -  void adjustTargetOptions(const CodeGenOptions &CGOpts, -                           TargetOptions &TargetOpts) const override; -    ArrayRef<Builtin::Info> getTargetBuiltins() const override; +  bool useFP16ConversionIntrinsics() const override { return false; } +    void getTargetDefines(const LangOptions &Opts,                          MacroBuilder &Builder) const override; @@ -263,6 +295,7 @@ public:        Opts.support("cl_khr_int64_base_atomics");        Opts.support("cl_khr_int64_extended_atomics");        Opts.support("cl_khr_mipmap_image"); +      Opts.support("cl_khr_mipmap_image_writes");        Opts.support("cl_khr_subgroups");        Opts.support("cl_khr_3d_image_writes");        Opts.support("cl_amd_media_ops"); @@ -348,10 +381,14 @@ public:    // address space has value 0 but in private and local address space has    // value ~0.    uint64_t getNullPointerValue(LangAS AS) const override { -    return AS == LangAS::opencl_local ? ~0 : 0; +    // FIXME: Also should handle region. +    return (AS == LangAS::opencl_local || AS == LangAS::opencl_private) +      ? ~0 : 0;    }    void setAuxTarget(const TargetInfo *Aux) override; + +  bool hasExtIntType() const override { return true; }  };  } // namespace targets | 
