Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>tags/18.0-branchpoint
@@ -35,6 +35,7 @@ | |||
#include <llvm/ExecutionEngine/ExecutionEngine.h> | |||
#include <llvm/IR/Attributes.h> | |||
#include <llvm/IR/CallSite.h> | |||
#include <llvm/IR/IRBuilder.h> | |||
#if HAVE_LLVM < 0x0500 | |||
namespace llvm { | |||
@@ -80,3 +81,32 @@ bool ac_llvm_is_function(LLVMValueRef v) | |||
return llvm::isa<llvm::Function>(llvm::unwrap(v)); | |||
#endif | |||
} | |||
LLVMBuilderRef ac_create_builder(LLVMContextRef ctx, | |||
enum ac_float_mode float_mode) | |||
{ | |||
LLVMBuilderRef builder = LLVMCreateBuilderInContext(ctx); | |||
#if HAVE_LLVM >= 0x0308 | |||
llvm::FastMathFlags flags; | |||
switch (float_mode) { | |||
case AC_FLOAT_MODE_DEFAULT: | |||
break; | |||
case AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH: | |||
flags.setNoSignedZeros(); | |||
llvm::unwrap(builder)->setFastMathFlags(flags); | |||
break; | |||
case AC_FLOAT_MODE_UNSAFE_FP_MATH: | |||
#if HAVE_LLVM >= 0x0600 | |||
flags.setFast(); | |||
#else | |||
flags.setUnsafeAlgebra(); | |||
#endif | |||
llvm::unwrap(builder)->setFastMathFlags(flags); | |||
break; | |||
} | |||
#endif | |||
return builder; | |||
} |
@@ -62,6 +62,12 @@ enum ac_target_machine_options { | |||
AC_TM_PROMOTE_ALLOCA_TO_SCRATCH = (1 << 4), | |||
}; | |||
enum ac_float_mode { | |||
AC_FLOAT_MODE_DEFAULT, | |||
AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH, | |||
AC_FLOAT_MODE_UNSAFE_FP_MATH, | |||
}; | |||
const char *ac_get_llvm_processor_name(enum radeon_family family); | |||
LLVMTargetMachineRef ac_create_target_machine(enum radeon_family family, enum ac_target_machine_options tm_options); | |||
@@ -77,6 +83,9 @@ void ac_dump_module(LLVMModuleRef module); | |||
LLVMValueRef ac_llvm_get_called_value(LLVMValueRef call); | |||
bool ac_llvm_is_function(LLVMValueRef v); | |||
LLVMBuilderRef ac_create_builder(LLVMContextRef ctx, | |||
enum ac_float_mode float_mode); | |||
void | |||
ac_llvm_add_target_dep_function_attr(LLVMValueRef F, | |||
const char *name, int value); |
@@ -813,32 +813,3 @@ lp_is_function(LLVMValueRef v) | |||
return llvm::isa<llvm::Function>(llvm::unwrap(v)); | |||
#endif | |||
} | |||
extern "C" LLVMBuilderRef | |||
lp_create_builder(LLVMContextRef ctx, enum lp_float_mode float_mode) | |||
{ | |||
LLVMBuilderRef builder = LLVMCreateBuilderInContext(ctx); | |||
#if HAVE_LLVM >= 0x0308 | |||
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: | |||
#if HAVE_LLVM >= 0x0600 | |||
flags.setFast(); | |||
#else | |||
flags.setUnsafeAlgebra(); | |||
#endif | |||
llvm::unwrap(builder)->setFastMathFlags(flags); | |||
break; | |||
} | |||
#endif | |||
return builder; | |||
} |
@@ -76,15 +76,6 @@ 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, enum lp_float_mode float_mode); | |||
#ifdef __cplusplus | |||
} | |||
#endif |
@@ -1160,11 +1160,11 @@ void si_llvm_context_init(struct si_shader_context *ctx, | |||
LLVMDisposeMessage(data_layout_str); | |||
bool unsafe_fpmath = (sscreen->debug_flags & DBG(UNSAFE_MATH)) != 0; | |||
enum lp_float_mode float_mode = | |||
unsafe_fpmath ? LP_FLOAT_MODE_UNSAFE_FP_MATH : | |||
LP_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH; | |||
enum ac_float_mode float_mode = | |||
unsafe_fpmath ? AC_FLOAT_MODE_UNSAFE_FP_MATH : | |||
AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH; | |||
ctx->gallivm.builder = lp_create_builder(ctx->gallivm.context, | |||
ctx->gallivm.builder = ac_create_builder(ctx->gallivm.context, | |||
float_mode); | |||
ac_llvm_context_init(&ctx->ac, ctx->gallivm.context, |