diff options
author | Marek Olšák <[email protected]> | 2017-01-29 22:45:36 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-02-21 21:27:23 +0100 |
commit | fd3e73f54e323d5de182bf6cdb6094c2fd7362b3 (patch) | |
tree | 1dd7f363ca9902fa441ba4ac87ca7e495f9cedbd /src | |
parent | 84e72f2962eab5eeb8b331e7a5d6eccaa7b8f5be (diff) |
gallivm: add no-signed-zeros-fp-math option to lp_create_builder (v2)
v2: define lp_float_mode
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src')
-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; |