60 static_assert(target_width + os_width + arch_width <= 32,
"Too large value to encode");
71 m_target = (
ISPCTarget)(encoding & target_mask);
73 m_arch = (
Arch)((encoding & arch_mask) >> (target_width +
os_width));
79 uint32_t result = (uint32_t)m_arch;
92 for (
auto lib : *libs) {
93 switch (lib->getType()) {
98 m_builtins[
Triple(lib->getISPCTarget(), lib->getOS(), lib->getArch()).
encode()] = lib;
99 m_supported_oses[(int)lib->getOS()] =
true;
108 m_targets[
Triple(lib->getISPCTarget(), lib->getOS(), lib->getArch()).
encode()] = lib;
121 libs =
new std::vector<const BitcodeLib *>();
123 libs->push_back(lib);
135 if (result != m_builtins.end()) {
136 return result->second;
167 auto result = m_targets.find(
Triple(target, os, arch).
encode());
168 if (result != m_targets.end()) {
169 return result->second;
177 std::vector<std::vector<std::string>> table;
180 std::vector<std::string> os_names;
181 os_names.push_back(
"");
185 table.push_back(os_names);
189 std::vector<std::string> row;
192 std::vector<std::string> arch_list_target;
195 std::string arch_list_os;
199 if (isSupported(target, os, arch)) {
200 if (!arch_list_os.empty()) {
201 arch_list_os +=
", ";
206 arch_list_target.push_back(arch_list_os);
207 row.push_back(arch_list_os);
209 table.push_back(row);
213 std::vector<int> column_sizes(table[0].size(), 7);
214 for (
auto &row : table) {
215 for (
int i = 0; i < row.size(); i++) {
216 column_sizes[i] = column_sizes[i] > row[i].size() ? column_sizes[i] : row[i].size();
219 int width = std::accumulate(column_sizes.begin(), column_sizes.end(), 0) + (column_sizes.size() - 1) * 3;
222 for (
int i = 0; i < table.size(); i++) {
224 for (
int j = 0; j < row.size(); j++) {
225 auto align = std::string(column_sizes[j] - row[j].size(),
' ');
226 printf(
"%s%s", row[j].c_str(), align.c_str());
227 if (j + 1 != row.size()) {
233 auto line = std::string(width,
'-');
234 printf(
"%s\n", line.c_str());
248 if (isSupported(target, os, arch)) {
249 if (!archs.empty()) {
271 if (isSupported(target, os, arch)) {
272 if (!targets.empty()) {
292 if (m_supported_oses[j]) {
304 auto clib = getBuiltinsCLib(os, arch);
306 auto lib = getISPCTargetLib(target, os, arch);
static constexpr uint32_t os_width
std::string ArchToString(Arch arch)
static constexpr uint32_t arch_width
static constexpr uint32_t arch_mask
Registry to handle bitcode libraries.
const BitcodeLib * getISPCTargetLib(ISPCTarget target, TargetOS os, Arch arch) const
bool isSupported(ISPCTarget target, TargetOS os, Arch arch) const
std::string getSupportedTargets()
Triple(uint32_t encoding)
static constexpr uint32_t target_width
std::string getSupportedOSes()
std::string OSToString(TargetOS os)
static std::vector< const BitcodeLib * > * libs
static TargetLibRegistry * getTargetLibRegistry()
static constexpr uint32_t target_mask
void printSupportMatrix() const
std::string ISPCTargetToString(ISPCTarget target)
const BitcodeLib * getBuiltinsCLib(TargetOS os, Arch arch) const
static void RegisterTarget(const BitcodeLib *lib)
static constexpr uint32_t os_mask
std::string OSToLowerString(TargetOS os)
Triple(ISPCTarget target, TargetOS os, Arch arch)
const BitcodeLib * getDispatchLib() const
static constexpr uint32_t bits_required(uint32_t x)
std::string getSupportedArchs()