diff options
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_misc.cpp | 15 | ||||
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_misc.h | 8 | ||||
-rw-r--r-- | 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 e005469a565..444686fdc79 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp @@ -781,15 +781,24 @@ lp_is_function(LLVMValueRef v) } 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 diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.h b/src/gallium/auxiliary/gallivm/lp_bld_misc.h index c499a6f51eb..6abb30d73fa 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.h +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.h @@ -82,8 +82,14 @@ 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 } diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c index 6618009610a..69eaf0c6364 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c @@ -1267,8 +1267,12 @@ void si_llvm_context_init(struct si_shader_context *ctx, #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; |