ac/nir: add back nir_op_fmod
authorMarek Olšák <marek.olsak@amd.com>
Tue, 8 Oct 2019 04:08:19 +0000 (00:08 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 10 Oct 2019 19:57:50 +0000 (15:57 -0400)
radeonsi doesn't lower it for doubles.

This partially reverts commit d861401554b52b2c2fc6721c69bdfe1697ee608f.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/amd/llvm/ac_nir_to_llvm.c

index 41b71cd63a5433852d4777037847a885954dcbda..b08483e5cf4e8e25bc5c54100107deca2caf6232 100644 (file)
@@ -548,6 +548,17 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
        case nir_op_umod:
                result = LLVMBuildURem(ctx->ac.builder, src[0], src[1], "");
                break;
+       case nir_op_fmod:
+               /* lower_fmod only lower 16-bit and 32-bit fmod */
+               assert(instr->dest.dest.ssa.bit_size == 64);
+               src[0] = ac_to_float(&ctx->ac, src[0]);
+               src[1] = ac_to_float(&ctx->ac, src[1]);
+               result = ac_build_fdiv(&ctx->ac, src[0], src[1]);
+               result = emit_intrin_1f_param(&ctx->ac, "llvm.floor",
+                                             ac_to_float_type(&ctx->ac, def_type), result);
+               result = LLVMBuildFMul(ctx->ac.builder, src[1] , result, "");
+               result = LLVMBuildFSub(ctx->ac.builder, src[0], result, "");
+               break;
        case nir_op_irem:
                result = LLVMBuildSRem(ctx->ac.builder, src[0], src[1], "");
                break;