[Mesa-dev] [PATCH 4/6] gallivm: add no-signed-zeros-fp-math option to lp_create_builder (v2)

Marek Olšák maraeo at gmail.com
Sun Feb 19 16:27:45 UTC 2017


From: Marek Olšák <marek.olsak at 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



More information about the mesa-dev mailing list