From be6ac0408a903e36a9a6df3b2ca5fa0a5f4a6959 Mon Sep 17 00:00:00 2001 From: Evghenii Date: Fri, 24 Jan 2014 09:02:12 +0100 Subject: [PATCH] added compile-time constant __is_nvptx_traget that can be used with stdlib.ispc --- builtins.cpp | 3 +++ stdlib.ispc | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/builtins.cpp b/builtins.cpp index 80740146..a72d20f4 100644 --- a/builtins.cpp +++ b/builtins.cpp @@ -1181,6 +1181,9 @@ DefineStdlib(SymbolTable *symbolTable, llvm::LLVMContext *ctx, llvm::Module *mod lDefineConstantInt("__have_native_transcendentals", g->target->hasTranscendentals(), module, symbolTable); + lDefineConstantInt("__is_nvptx_target", (int)(g->target->getISA() == Target::NVPTX), + module, symbolTable); + if (g->forceAlignment != -1) { llvm::GlobalVariable *alignment = module->getGlobalVariable("memory_alignment", true); alignment->setInitializer(LLVMInt32(g->forceAlignment)); diff --git a/stdlib.ispc b/stdlib.ispc index 3e37ac5b..6ce656fe 100644 --- a/stdlib.ispc +++ b/stdlib.ispc @@ -521,7 +521,10 @@ __declspec(safe) static inline uniform int popcnt(bool v) { // As with any() and all(), only count across the active lanes #if (ISPC_MASK_BITS == 1) - return __popcnt_int64(__movmsk(v & __mask)); + if (__is_nvptx_target) + return __popcnt_int64(__movmsk_ptx(v & __mask)); + else + return __popcnt_int64(__movmsk(v & __mask)); #else return __popcnt_int64(__movmsk((UIntMaskType)__sext_varying_bool(v) & __mask)); #endif