gallivm: Have a default emit function for min/max opcode
authorVincent Lejeune <vljn@ovi.com>
Thu, 29 Nov 2012 22:43:31 +0000 (23:43 +0100)
committerVincent Lejeune <vljn@ovi.com>
Wed, 5 Dec 2012 17:31:18 +0000 (18:31 +0100)
Reveiwed-by: Tom Stellard <thomas.stellard at amd.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c

index cd57faef0c07f83fa073f008c26ed49ed06ac263..cc4bd2e1647d00f6fb850a093ced17ed903a72a9 100644 (file)
@@ -744,6 +744,32 @@ umul_emit(
                                    emit_data->args[0], emit_data->args[1]);
 }
 
+/* TGSI_OPCODE_MAX */
+static void fmax_emit(
+   const struct lp_build_tgsi_action * action,
+   struct lp_build_tgsi_context * bld_base,
+   struct lp_build_emit_data * emit_data)
+{
+   LLVMBuilderRef builder = bld_base->base.gallivm->builder;
+   emit_data->output[emit_data->chan] = LLVMBuildSelect(builder,
+                                   LLVMBuildFCmp(builder, LLVMRealUGE,
+                                   emit_data->args[0], emit_data->args[1], ""),
+                                   emit_data->args[0], emit_data->args[1], "");
+}
+
+/* TGSI_OPCODE_MIN */
+static void fmin_emit(
+   const struct lp_build_tgsi_action * action,
+   struct lp_build_tgsi_context * bld_base,
+   struct lp_build_emit_data * emit_data)
+{
+   LLVMBuilderRef builder = bld_base->base.gallivm->builder;
+   emit_data->output[emit_data->chan] = LLVMBuildSelect(builder,
+                                   LLVMBuildFCmp(builder, LLVMRealUGE,
+                                   emit_data->args[0], emit_data->args[1], ""),
+                                   emit_data->args[1], emit_data->args[0], "");
+}
+
 /* TGSI_OPCODE_XPD */
 
 static void
@@ -844,6 +870,9 @@ lp_set_default_actions(struct lp_build_tgsi_context * bld_base)
    bld_base->op_actions[TGSI_OPCODE_U2F].emit = u2f_emit;
    bld_base->op_actions[TGSI_OPCODE_UMAD].emit = umad_emit;
    bld_base->op_actions[TGSI_OPCODE_UMUL].emit = umul_emit;
+
+   bld_base->op_actions[TGSI_OPCODE_MAX].emit = fmax_emit;
+   bld_base->op_actions[TGSI_OPCODE_MIN].emit = fmin_emit;
 }
 
 /* CPU Only default actions */