ac/llvm: add AC_FLOAT_MODE_ROUND_TO_ZERO

Because some instructions will be optimized by the backend compiler,
the driver has to manually flush to zero to keep the result exact.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Samuel Pitoiset
2019-10-14 15:36:37 +02:00
parent d94bd4e512
commit 7dfb15fff1
4 changed files with 5 additions and 0 deletions

View File

@@ -73,6 +73,7 @@ ac_llvm_context_init(struct ac_llvm_context *ctx,
ctx->family = family; ctx->family = family;
ctx->wave_size = wave_size; ctx->wave_size = wave_size;
ctx->ballot_mask_bits = ballot_mask_bits; ctx->ballot_mask_bits = ballot_mask_bits;
ctx->float_mode = float_mode;
ctx->module = ac_create_module(wave_size == 32 ? compiler->tm_wave32 ctx->module = ac_create_module(wave_size == 32 ? compiler->tm_wave32
: compiler->tm, : compiler->tm,
ctx->context); ctx->context);

View File

@@ -120,6 +120,8 @@ struct ac_llvm_context {
unsigned wave_size; unsigned wave_size;
unsigned ballot_mask_bits; unsigned ballot_mask_bits;
unsigned float_mode;
LLVMValueRef lds; LLVMValueRef lds;
}; };

View File

@@ -82,6 +82,7 @@ LLVMBuilderRef ac_create_builder(LLVMContextRef ctx,
switch (float_mode) { switch (float_mode) {
case AC_FLOAT_MODE_DEFAULT: case AC_FLOAT_MODE_DEFAULT:
case AC_FLOAT_MODE_DENORM_FLUSH_TO_ZERO:
break; break;
case AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH: case AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH:
flags.setNoSignedZeros(); flags.setNoSignedZeros();

View File

@@ -73,6 +73,7 @@ enum ac_float_mode {
AC_FLOAT_MODE_DEFAULT, AC_FLOAT_MODE_DEFAULT,
AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH, AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH,
AC_FLOAT_MODE_UNSAFE_FP_MATH, AC_FLOAT_MODE_UNSAFE_FP_MATH,
AC_FLOAT_MODE_DENORM_FLUSH_TO_ZERO,
}; };
/* Per-thread persistent LLVM objects. */ /* Per-thread persistent LLVM objects. */