From: Marek Olšák <marek.ol...@amd.com> v2: define lp_float_mode --- src/gallium/auxiliary/gallivm/lp_bld_misc.cpp | 15 ++++++++++++--- src/gallium/auxiliary/gallivm/lp_bld_misc.h | 8 +++++++- src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c | 6 +++++- 3 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp index 498bbd7..d7be5a5 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp @@ -735,24 +735,33 @@ extern "C" bool lp_is_function(LLVMValueRef v) { #if HAVE_LLVM >= 0x0309 return LLVMGetValueKind(v) == LLVMFunctionValueKind; #else return llvm::isa<llvm::Function>(llvm::unwrap(v)); #endif } extern "C" LLVMBuilderRef -lp_create_builder(LLVMContextRef ctx, bool unsafe_fpmath) +lp_create_builder(LLVMContextRef ctx, enum lp_float_mode float_mode) { LLVMBuilderRef builder = LLVMCreateBuilderInContext(ctx); #if HAVE_LLVM >= 0x0308 - if (unsafe_fpmath) { - llvm::FastMathFlags flags; + llvm::FastMathFlags flags; + + switch (float_mode) { + case LP_FLOAT_MODE_DEFAULT: + break; + case LP_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH: + flags.setNoSignedZeros(); + llvm::unwrap(builder)->setFastMathFlags(flags); + break; + case LP_FLOAT_MODE_UNSAFE_FP_MATH: flags.setUnsafeAlgebra(); llvm::unwrap(builder)->setFastMathFlags(flags); + break; } #endif return builder; } diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.h b/src/gallium/auxiliary/gallivm/lp_bld_misc.h index c499a6f..6abb30d 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.h @@ -75,19 +75,25 @@ lp_free_memory_manager(LLVMMCJITMemoryManagerRef memorymgr); extern void lp_add_attr_dereferenceable(LLVMValueRef val, uint64_t bytes); extern LLVMValueRef lp_get_called_value(LLVMValueRef call); extern bool lp_is_function(LLVMValueRef v); +enum lp_float_mode { + LP_FLOAT_MODE_DEFAULT, + LP_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH, + LP_FLOAT_MODE_UNSAFE_FP_MATH, +}; + extern LLVMBuilderRef -lp_create_builder(LLVMContextRef ctx, bool unsafe_fpmath); +lp_create_builder(LLVMContextRef ctx, enum lp_float_mode float_mode); #ifdef __cplusplus } #endif #endif /* !LP_BLD_MISC_H */ diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index 6618009..69eaf0c 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -1260,22 +1260,26 @@ void si_llvm_context_init(struct si_shader_context *ctx, #if HAVE_LLVM >= 0x0309 LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(tm); char *data_layout_str = LLVMCopyStringRepOfTargetData(data_layout); LLVMSetDataLayout(ctx->gallivm.module, data_layout_str); LLVMDisposeTargetData(data_layout); LLVMDisposeMessage(data_layout_str); #endif bool unsafe_fpmath = (sscreen->b.debug_flags & DBG_UNSAFE_MATH) != 0; + enum lp_float_mode float_mode = + unsafe_fpmath ? LP_FLOAT_MODE_UNSAFE_FP_MATH : + LP_FLOAT_MODE_DEFAULT; + ctx->gallivm.builder = lp_create_builder(ctx->gallivm.context, - unsafe_fpmath); + float_mode); ac_llvm_context_init(&ctx->ac, ctx->gallivm.context); ctx->ac.module = ctx->gallivm.module; ctx->ac.builder = ctx->gallivm.builder; struct lp_build_tgsi_context *bld_base = &ctx->bld_base; bld_base->info = info; if (info && info->array_max[TGSI_FILE_TEMPORARY] > 0) { -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev