radeonsi: use minnum and maxnum LLVM intrinsics for MIN and MAX opcodes
authorMarek Olšák <marek.olsak@amd.com>
Thu, 20 Nov 2014 21:16:09 +0000 (22:16 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 21 Nov 2014 11:15:58 +0000 (12:15 +0100)
So far it has been compiled into pretty ugly code (8 instructions or so
for either opcode).

Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/radeonsi/si_shader.c

index 40a2f906414e5084c9a90b809757e37e1dbed223..037811edd18bd780dc549144032441b17ed15a00 100644 (file)
@@ -2737,6 +2737,13 @@ int si_shader_create(struct si_screen *sscreen, struct si_shader *shader)
        bld_base->op_actions[TGSI_OPCODE_EMIT].emit = si_llvm_emit_vertex;
        bld_base->op_actions[TGSI_OPCODE_ENDPRIM].emit = si_llvm_emit_primitive;
 
+       if (HAVE_LLVM >= 0x0306) {
+               bld_base->op_actions[TGSI_OPCODE_MAX].emit = build_tgsi_intrinsic_nomem;
+               bld_base->op_actions[TGSI_OPCODE_MAX].intr_name = "llvm.maxnum.f32";
+               bld_base->op_actions[TGSI_OPCODE_MIN].emit = build_tgsi_intrinsic_nomem;
+               bld_base->op_actions[TGSI_OPCODE_MIN].intr_name = "llvm.minnum.f32";
+       }
+
        si_shader_ctx.radeon_bld.load_system_value = declare_system_value;
        si_shader_ctx.tokens = sel->tokens;
        tgsi_parse_init(&si_shader_ctx.parse, si_shader_ctx.tokens);