On Tue, Mar 13, 2012 at 03:07:02PM -0400, Tom Stellard wrote: > On Thu, Mar 08, 2012 at 01:19:31PM -0500, Tom Stellard wrote: > > Hi, > > > > This patch adds a TargetInfo definition for the R600 target, > > which represents AMD GPUs (HD2XXX-HD6XXX). This patch depends > > on the r600 target triple patch, which was sent to llvm-commits: > > http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20120305/138626.html > > > > This is the bare minimum needed to successfully compile OpenCL kernels > > for the r600 target, and in the future we would like to add some target > > specific builtins for handling OpenCL C functions. > > > > Please Review. > > > > Thanks, > > Tom Stellard > > Has anyone had a chance to look at this patch yet? > > I have attached a second patch to this email that I would like to get > committed along with the first one. The second patch adds some builtin > definitions for r600. > > -Tom >
Hi, I've quashed the previous two patches together and made some additional changes, so here is an updated patch that adds a TargetInfo definition for the r600 target. This patch replaces the previous two. Please Review. Thanks, Tom Stellard
diff --git include/clang/Basic/BuiltinsR600.def include/clang/Basic/BuiltinsR600.def new file mode 100644 index 0000000..c81758e --- /dev/null +++ include/clang/Basic/BuiltinsR600.def @@ -0,0 +1,40 @@ +//===--- BuiltinsR600.def - R600 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 R600-specific builtin function database. Users of +// this file must define the BUILTIN macro to make use of this information. +// +//===----------------------------------------------------------------------===// +// +// Authors: Tom Stellard <[email protected]> +// + +// The format of this database matches clang/Basic/Builtins.def. + +BUILTIN(__builtin_r600_read_global_size_x, "z", "nc") +BUILTIN(__builtin_r600_read_global_size_y, "z", "nc") +BUILTIN(__builtin_r600_read_global_size_z, "z", "nc") + +BUILTIN(__builtin_r600_read_local_size_x, "z", "nc") +BUILTIN(__builtin_r600_read_local_size_y, "z", "nc") +BUILTIN(__builtin_r600_read_local_size_z, "z", "nc") + +BUILTIN(__builtin_r600_read_ngroups_x, "z", "nc") +BUILTIN(__builtin_r600_read_ngroups_y, "z", "nc") +BUILTIN(__builtin_r600_read_ngroups_z, "z", "nc") + +BUILTIN(__builtin_r600_read_tidig_x, "z", "nc") +BUILTIN(__builtin_r600_read_tidig_y, "z", "nc") +BUILTIN(__builtin_r600_read_tidig_z, "z", "nc") + +BUILTIN(__builtin_r600_read_tgid_x, "z", "nc") +BUILTIN(__builtin_r600_read_tgid_y, "z", "nc") +BUILTIN(__builtin_r600_read_tgid_z, "z", "nc") + +#undef BUILTIN diff --git include/clang/Basic/TargetBuiltins.h include/clang/Basic/TargetBuiltins.h index 7c04bf7..3460cd5 100644 --- include/clang/Basic/TargetBuiltins.h +++ include/clang/Basic/TargetBuiltins.h @@ -45,6 +45,16 @@ namespace clang { }; } + /// R600 builtins + namespace R600 { + enum { + LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, +#define BUILTIN(ID, TYPE, ATTRS) BI##ID, +#include "clang/Basic/BuiltinsR600.def" + LastTSBuiltin + }; + } + /// X86 builtins namespace X86 { diff --git lib/Basic/Targets.cpp lib/Basic/Targets.cpp index 85dfd78..03f1a18 100644 --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -1068,6 +1068,81 @@ namespace { } namespace { + +class AMDGPUTargetInfo : public TargetInfo { + static const Builtin::Info BuiltinInfo[]; +public: + + AMDGPUTargetInfo(const std::string& triple) : TargetInfo(triple) { } + + virtual const char * getClobbers() const { + return ""; + } + + virtual void getGCCRegNames(const char * const *&Names, + unsigned &numNames) const { + Names = NULL; + numNames = 0; + } + + virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, + unsigned &NumAliases) const { + Aliases = NULL; + NumAliases = 0; + } + + virtual bool validateAsmConstraint(const char *&Name, + TargetInfo::ConstraintInfo &info) const { + return true; + } + + virtual void getTargetBuiltins(const Builtin::Info *&Records, + unsigned &NumRecords) const { + Records = BuiltinInfo; + NumRecords = clang::R600::LastTSBuiltin-Builtin::FirstTSBuiltin; + } +}; + + +static const unsigned R600AddrSpaceMap[] = { + 1, // opencl_global + 3, // opencl_local + 2 // opencl_constant +}; + +class R600TargetInfo : public AMDGPUTargetInfo { +public: + R600TargetInfo(const std::string& triple) : AMDGPUTargetInfo(triple) { + DescriptionString = + "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16" + "-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:32:32" + "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64" + "-v96:128:128-v128:128:128-v192:256:256-v256:256:256" + "-v512:512:512-v1024:1024:1024-v2048:2048:2048" + "-n8:16:32:64"; + AddrSpaceMap = &R600AddrSpaceMap; + } + + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + Builder.defineMacro("__R600__"); + } + + virtual const char * getVAListDeclaration() const { + return ""; + } +}; + +const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = { +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ + ALL_LANGUAGES }, +#include "clang/Basic/BuiltinsR600.def" +}; + +} // end anonymous namespace + +namespace { // MBlaze abstract base class class MBlazeTargetInfo : public TargetInfo { static const char * const GCCRegNames[]; @@ -3963,6 +4038,9 @@ static TargetInfo *AllocateTarget(const std::string &T) { case llvm::Triple::mblaze: return new MBlazeTargetInfo(T); + case llvm::Triple::r600: + return new R600TargetInfo(T); + case llvm::Triple::sparc: switch (os) { case llvm::Triple::Linux:
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
