diff options
Diffstat (limited to 'clang/lib/Basic/Targets/AMDGPU.cpp')
| -rw-r--r-- | clang/lib/Basic/Targets/AMDGPU.cpp | 84 | 
1 files changed, 62 insertions, 22 deletions
| diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index 135ad3f97ce12..db7db8d36d037 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -17,6 +17,7 @@  #include "clang/Basic/MacroBuilder.h"  #include "clang/Basic/TargetBuiltins.h"  #include "llvm/ADT/StringSwitch.h" +#include "llvm/Frontend/OpenMP/OMPGridValues.h"  #include "llvm/IR/DataLayout.h"  using namespace clang; @@ -124,7 +125,36 @@ const char *const AMDGPUTargetInfo::GCCRegNames[] = {    "s113", "s114", "s115", "s116", "s117", "s118", "s119", "s120", "s121",    "s122", "s123", "s124", "s125", "s126", "s127", "exec", "vcc", "scc",    "m0", "flat_scratch", "exec_lo", "exec_hi", "vcc_lo", "vcc_hi", -  "flat_scratch_lo", "flat_scratch_hi" +  "flat_scratch_lo", "flat_scratch_hi", +  "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", +  "a9", "a10", "a11", "a12", "a13", "a14", "a15", "a16", "a17", +  "a18", "a19", "a20", "a21", "a22", "a23", "a24", "a25", "a26", +  "a27", "a28", "a29", "a30", "a31", "a32", "a33", "a34", "a35", +  "a36", "a37", "a38", "a39", "a40", "a41", "a42", "a43", "a44", +  "a45", "a46", "a47", "a48", "a49", "a50", "a51", "a52", "a53", +  "a54", "a55", "a56", "a57", "a58", "a59", "a60", "a61", "a62", +  "a63", "a64", "a65", "a66", "a67", "a68", "a69", "a70", "a71", +  "a72", "a73", "a74", "a75", "a76", "a77", "a78", "a79", "a80", +  "a81", "a82", "a83", "a84", "a85", "a86", "a87", "a88", "a89", +  "a90", "a91", "a92", "a93", "a94", "a95", "a96", "a97", "a98", +  "a99", "a100", "a101", "a102", "a103", "a104", "a105", "a106", "a107", +  "a108", "a109", "a110", "a111", "a112", "a113", "a114", "a115", "a116", +  "a117", "a118", "a119", "a120", "a121", "a122", "a123", "a124", "a125", +  "a126", "a127", "a128", "a129", "a130", "a131", "a132", "a133", "a134", +  "a135", "a136", "a137", "a138", "a139", "a140", "a141", "a142", "a143", +  "a144", "a145", "a146", "a147", "a148", "a149", "a150", "a151", "a152", +  "a153", "a154", "a155", "a156", "a157", "a158", "a159", "a160", "a161", +  "a162", "a163", "a164", "a165", "a166", "a167", "a168", "a169", "a170", +  "a171", "a172", "a173", "a174", "a175", "a176", "a177", "a178", "a179", +  "a180", "a181", "a182", "a183", "a184", "a185", "a186", "a187", "a188", +  "a189", "a190", "a191", "a192", "a193", "a194", "a195", "a196", "a197", +  "a198", "a199", "a200", "a201", "a202", "a203", "a204", "a205", "a206", +  "a207", "a208", "a209", "a210", "a211", "a212", "a213", "a214", "a215", +  "a216", "a217", "a218", "a219", "a220", "a221", "a222", "a223", "a224", +  "a225", "a226", "a227", "a228", "a229", "a230", "a231", "a232", "a233", +  "a234", "a235", "a236", "a237", "a238", "a239", "a240", "a241", "a242", +  "a243", "a244", "a245", "a246", "a247", "a248", "a249", "a250", "a251", +  "a252", "a253", "a254", "a255"  };  ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const { @@ -140,6 +170,22 @@ bool AMDGPUTargetInfo::initFeatureMap(    // XXX - What does the member GPU mean if device name string passed here?    if (isAMDGCN(getTriple())) {      switch (llvm::AMDGPU::parseArchAMDGCN(CPU)) { +    case GK_GFX1030: +      Features["ci-insts"] = true; +      Features["dot1-insts"] = true; +      Features["dot2-insts"] = true; +      Features["dot5-insts"] = true; +      Features["dot6-insts"] = true; +      Features["dl-insts"] = true; +      Features["flat-address-space"] = true; +      Features["16-bit-insts"] = true; +      Features["dpp"] = true; +      Features["gfx8-insts"] = true; +      Features["gfx9-insts"] = true; +      Features["gfx10-insts"] = true; +      Features["gfx10-3-insts"] = true; +      Features["s-memrealtime"] = true; +      break;      case GK_GFX1012:      case GK_GFX1011:        Features["dot1-insts"] = true; @@ -163,6 +209,7 @@ bool AMDGPUTargetInfo::initFeatureMap(        Features["dot4-insts"] = true;        Features["dot5-insts"] = true;        Features["dot6-insts"] = true; +      Features["mai-insts"] = true;        LLVM_FALLTHROUGH;      case GK_GFX906:        Features["dl-insts"] = true; @@ -232,27 +279,6 @@ bool AMDGPUTargetInfo::initFeatureMap(    return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);  } -void AMDGPUTargetInfo::adjustTargetOptions(const CodeGenOptions &CGOpts, -                                           TargetOptions &TargetOpts) const { -  bool hasFP32Denormals = false; -  bool hasFP64Denormals = false; - -  for (auto &I : TargetOpts.FeaturesAsWritten) { -    if (I == "+fp32-denormals" || I == "-fp32-denormals") -      hasFP32Denormals = true; -    if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals") -      hasFP64Denormals = true; -  } -  if (!hasFP32Denormals) -    TargetOpts.Features.push_back( -      (Twine(hasFastFMAF() && hasFullRateDenormalsF32() && !CGOpts.FlushDenorm -             ? '+' : '-') + Twine("fp32-denormals")) -            .str()); -  // Always do not flush fp64 or fp16 denorms. -  if (!hasFP64Denormals && hasFP64()) -    TargetOpts.Features.push_back("+fp64-fp16-denormals"); -} -  void AMDGPUTargetInfo::fillValidCPUList(      SmallVectorImpl<StringRef> &Values) const {    if (isAMDGCN(getTriple())) @@ -277,6 +303,7 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,    resetDataLayout(isAMDGCN(getTriple()) ? DataLayoutStringAMDGCN                                          : DataLayoutStringR600);    assert(DataLayout->getAllocaAddrSpace() == Private); +  GridValues = llvm::omp::AMDGPUGpuGridValues;    setAddressSpaceMap(Triple.getOS() == llvm::Triple::Mesa3D ||                       !isAMDGCN(Triple)); @@ -354,4 +381,17 @@ void AMDGPUTargetInfo::setAuxTarget(const TargetInfo *Aux) {    copyAuxTarget(Aux);    LongDoubleFormat = SaveLongDoubleFormat;    Float128Format = SaveFloat128Format; +  // For certain builtin types support on the host target, claim they are +  // support to pass the compilation of the host code during the device-side +  // compilation. +  // FIXME: As the side effect, we also accept `__float128` uses in the device +  // code. To rejct these builtin types supported in the host target but not in +  // the device target, one approach would support `device_builtin` attribute +  // so that we could tell the device builtin types from the host ones. The +  // also solves the different representations of the same builtin type, such +  // as `size_t` in the MSVC environment. +  if (Aux->hasFloat128Type()) { +    HasFloat128 = true; +    Float128Format = DoubleFormat; +  }  } | 
