]> granicus.if.org Git - clang/commitdiff
PTX: Add PTX intrinsics as builtins and add ptx32 and ptx64 as valid architectures...
authorJustin Holewinski <justin.holewinski@gmail.com>
Wed, 20 Apr 2011 19:34:15 +0000 (19:34 +0000)
committerJustin Holewinski <justin.holewinski@gmail.com>
Wed, 20 Apr 2011 19:34:15 +0000 (19:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129870 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/BuiltinsPTX.def [new file with mode: 0644]
include/clang/Basic/TargetBuiltins.h
lib/Basic/Targets.cpp
test/CodeGen/builtins-ptx.c [new file with mode: 0644]

diff --git a/include/clang/Basic/BuiltinsPTX.def b/include/clang/Basic/BuiltinsPTX.def
new file mode 100644 (file)
index 0000000..f90a43f
--- /dev/null
@@ -0,0 +1,62 @@
+//===--- BuiltinsPTX.def - PTX Builtin function database ----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the PTX-specific builtin function database.  Users of
+// this file must define the BUILTIN macro to make use of this information.
+//
+//===----------------------------------------------------------------------===//
+
+// The format of this database matches clang/Basic/Builtins.def.
+
+BUILTIN(__builtin_ptx_read_tid_x, "i", "nc")
+BUILTIN(__builtin_ptx_read_tid_y, "i", "nc")
+BUILTIN(__builtin_ptx_read_tid_z, "i", "nc")
+BUILTIN(__builtin_ptx_read_tid_w, "i", "nc")
+
+BUILTIN(__builtin_ptx_read_ntid_x, "i", "nc")
+BUILTIN(__builtin_ptx_read_ntid_y, "i", "nc")
+BUILTIN(__builtin_ptx_read_ntid_z, "i", "nc")
+BUILTIN(__builtin_ptx_read_ntid_w, "i", "nc")
+
+BUILTIN(__builtin_ptx_read_ctaid_x, "i", "nc")
+BUILTIN(__builtin_ptx_read_ctaid_y, "i", "nc")
+BUILTIN(__builtin_ptx_read_ctaid_z, "i", "nc")
+BUILTIN(__builtin_ptx_read_ctaid_w, "i", "nc")
+
+BUILTIN(__builtin_ptx_read_nctaid_x, "i", "nc")
+BUILTIN(__builtin_ptx_read_nctaid_y, "i", "nc")
+BUILTIN(__builtin_ptx_read_nctaid_z, "i", "nc")
+BUILTIN(__builtin_ptx_read_nctaid_w, "i", "nc")
+
+BUILTIN(__builtin_ptx_read_laneid, "i", "nc")
+BUILTIN(__builtin_ptx_read_warpid, "i", "nc")
+BUILTIN(__builtin_ptx_read_nwarpid, "i", "nc")
+
+BUILTIN(__builtin_ptx_read_smid, "i", "nc")
+BUILTIN(__builtin_ptx_read_nsmid, "i", "nc")
+BUILTIN(__builtin_ptx_read_gridid, "i", "nc")
+
+BUILTIN(__builtin_ptx_read_lanemask_eq, "i", "nc")
+BUILTIN(__builtin_ptx_read_lanemask_le, "i", "nc")
+BUILTIN(__builtin_ptx_read_lanemask_lt, "i", "nc")
+BUILTIN(__builtin_ptx_read_lanemask_ge, "i", "nc")
+BUILTIN(__builtin_ptx_read_lanemask_gt, "i", "nc")
+
+BUILTIN(__builtin_ptx_read_clock, "i", "n")
+BUILTIN(__builtin_ptx_read_clock64, "Li", "n")
+
+BUILTIN(__builtin_ptx_read_pm0, "i", "n")
+BUILTIN(__builtin_ptx_read_pm1, "i", "n")
+BUILTIN(__builtin_ptx_read_pm2, "i", "n")
+BUILTIN(__builtin_ptx_read_pm3, "i", "n")
+
+BUILTIN(__builtin_ptx_bar_sync, "vi", "n")
+
+
+#undef BUILTIN
index f1edd1d45162853e5180740f8784edf81db1911f..8bc60ff5386d98d54896b72c04ee29c52b03af0e 100644 (file)
@@ -35,6 +35,17 @@ namespace clang {
     };
   }
 
+  /// PTX builtins
+  namespace PTX {
+    enum {
+        LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1,
+#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
+#include "clang/Basic/BuiltinsPTX.def"
+        LastTSBuiltin
+    };
+  }
+
+
   /// X86 builtins
   namespace X86 {
     enum {
index f331c50a21963587f1f984371fb80f6c89acdb5e..fd7168d16ccf0101cba298027e7f0b2b9ba6b62b 100644 (file)
@@ -844,6 +844,87 @@ public:
 };
 } // end anonymous namespace.
 
+namespace {
+  class PTXTargetInfo : public TargetInfo {
+    static const char * const GCCRegNames[];
+    static const Builtin::Info BuiltinInfo[];
+  public:
+    PTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
+      TLSSupported = false;
+      LongWidth = LongAlign = 64;
+    }
+    virtual void getTargetDefines(const LangOptions &Opts,
+                                  MacroBuilder &Builder) const {
+      Builder.defineMacro("__PTX__");
+    }
+    virtual void getTargetBuiltins(const Builtin::Info *&Records,
+                                   unsigned &NumRecords) const {
+      Records = BuiltinInfo;
+      NumRecords = clang::PTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
+    }
+
+    virtual void getGCCRegNames(const char * const *&Names,
+                                unsigned &NumNames) const;
+    virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
+                                  unsigned &NumAliases) const {
+      // No aliases.
+      Aliases = 0;
+      NumAliases = 0;
+    }
+    virtual bool validateAsmConstraint(const char *&Name,
+                                       TargetInfo::ConstraintInfo &info) const {
+      // FIXME: implement
+      return true;
+    }
+    virtual const char *getClobbers() const {
+      // FIXME: Is this really right?
+      return "";
+    }
+    virtual const char *getVAListDeclaration() const {
+      // FIXME: implement
+      return "typedef char* __builtin_va_list;";
+    }
+  };
+
+  const Builtin::Info PTXTargetInfo::BuiltinInfo[] = {
+#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES, false },
+#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
+                                              ALL_LANGUAGES, false },
+#include "clang/Basic/BuiltinsPTX.def"
+  };
+
+  const char * const PTXTargetInfo::GCCRegNames[] = {
+    "r0"
+  };
+
+  void PTXTargetInfo::getGCCRegNames(const char * const *&Names,
+                                     unsigned &NumNames) const {
+    Names = GCCRegNames;
+    NumNames = llvm::array_lengthof(GCCRegNames);
+  }
+
+
+  class PTX32TargetInfo : public PTXTargetInfo {
+  public:
+  PTX32TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
+      PointerWidth = PointerAlign = 32;
+      SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
+      DescriptionString
+        = "e-p:32:32-i64:64:64-f64:64:64-n1:8:16:32:64";
+    }
+  };
+
+  class PTX64TargetInfo : public PTXTargetInfo {
+  public:
+  PTX64TargetInfo(const std::string& triple) : PTXTargetInfo(triple) {
+      PointerWidth = PointerAlign = 64;
+      SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
+      DescriptionString
+        = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64";
+    }
+  };
+}
+
 namespace {
 // MBlaze abstract base class
 class MBlazeTargetInfo : public TargetInfo {
@@ -2659,6 +2740,11 @@ static TargetInfo *AllocateTarget(const std::string &T) {
       return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
     return new PPC64TargetInfo(T);
 
+  case llvm::Triple::ptx32:
+    return new PTX32TargetInfo(T);
+  case llvm::Triple::ptx64:
+    return new PTX64TargetInfo(T);
+
   case llvm::Triple::mblaze:
     return new MBlazeTargetInfo(T);
 
diff --git a/test/CodeGen/builtins-ptx.c b/test/CodeGen/builtins-ptx.c
new file mode 100644 (file)
index 0000000..6dd1018
--- /dev/null
@@ -0,0 +1,99 @@
+// RUN: %clang_cc1 -triple ptx32-unknown-unknown -emit-llvm -o %t %s
+// RUN: %clang_cc1 -triple ptx64-unknown-unknown -emit-llvm -o %t %s
+
+
+int read_tid() {
+
+  int x = __builtin_ptx_read_tid_x();
+  int y = __builtin_ptx_read_tid_y();
+  int z = __builtin_ptx_read_tid_z();
+  int w = __builtin_ptx_read_tid_w();
+
+  return x + y + z + w;
+
+}
+
+int read_ntid() {
+
+  int x = __builtin_ptx_read_ntid_x();
+  int y = __builtin_ptx_read_ntid_y();
+  int z = __builtin_ptx_read_ntid_z();
+  int w = __builtin_ptx_read_ntid_w();
+
+  return x + y + z + w;
+
+}
+
+int read_ctaid() {
+
+  int x = __builtin_ptx_read_ctaid_x();
+  int y = __builtin_ptx_read_ctaid_y();
+  int z = __builtin_ptx_read_ctaid_z();
+  int w = __builtin_ptx_read_ctaid_w();
+
+  return x + y + z + w;
+
+}
+
+int read_nctaid() {
+
+  int x = __builtin_ptx_read_nctaid_x();
+  int y = __builtin_ptx_read_nctaid_y();
+  int z = __builtin_ptx_read_nctaid_z();
+  int w = __builtin_ptx_read_nctaid_w();
+
+  return x + y + z + w;
+
+}
+
+int read_ids() {
+
+  int a = __builtin_ptx_read_laneid();
+  int b = __builtin_ptx_read_warpid();
+  int c = __builtin_ptx_read_nwarpid();
+  int d = __builtin_ptx_read_smid();
+  int e = __builtin_ptx_read_nsmid();
+  int f = __builtin_ptx_read_gridid();
+
+  return a + b + c + d + e + f;
+
+}
+
+int read_lanemasks() {
+
+  int a = __builtin_ptx_read_lanemask_eq();
+  int b = __builtin_ptx_read_lanemask_le();
+  int c = __builtin_ptx_read_lanemask_lt();
+  int d = __builtin_ptx_read_lanemask_ge();
+  int e = __builtin_ptx_read_lanemask_gt();
+
+  return a + b + c + d + e;
+
+}
+
+
+long read_clocks() {
+
+  int a = __builtin_ptx_read_clock();
+  long b = __builtin_ptx_read_clock64();
+
+  return (long)a + b;
+
+}
+
+int read_pms() {
+
+  int a = __builtin_ptx_read_pm0();
+  int b = __builtin_ptx_read_pm1();
+  int c = __builtin_ptx_read_pm2();
+  int d = __builtin_ptx_read_pm3();
+
+  return a + b + c + d;
+
+}
+
+void sync() {
+
+  __builtin_ptx_bar_sync(0);
+
+}