summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2012-01-04 12:58:43 -0500
committerTom Stellard <thomas.stellard@amd.com>2012-01-05 13:16:59 -0500
commit17b19ecc7b4d825cc9f679e3a867d77872a1e91f (patch)
tree1845c206d02fa26341d4b4edfa3fabcdf2b382a1
parent41eb700d23c49c31a3018093bcf7204bf7196576 (diff)
tgsi_llvm: SLT/ SLE
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_llvm.c109
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_llvm.h4
2 files changed, 57 insertions, 56 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_llvm.c b/src/gallium/auxiliary/tgsi/tgsi_llvm.c
index 3763c3e9286..a8c2ac238ce 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_llvm.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_llvm.c
@@ -84,6 +84,18 @@ void tgsi_llvm_fetch_args(
emit_data->arg_count = emit_data->info->num_src;
}
+void tgsi_llvm_fetch_args_2_reverse(
+ struct tgsi_llvm_context * ctx,
+ struct tgsi_llvm_emit_data * emit_data)
+{
+ assert(emit_data->info->num_src == 2);
+ emit_data->args[0] = lp_emit_fetch_soa(&ctx->bld_ctx.soa, emit_data->inst,
+ 1, emit_data->chan);
+ emit_data->args[1] = lp_emit_fetch_soa(&ctx->bld_ctx.soa, emit_data->inst,
+ 0, emit_data->chan);
+ emit_data->arg_count = 2;
+}
+
static void
emit_declaration(
struct tgsi_llvm_context * ctx,
@@ -694,70 +706,55 @@ emit_instruction(
break;
case TGSI_OPCODE_SCS:
- {
- LLVMValueRef dst[4];
- unsigned chan_index;
- LLVMValueRef src0;
- assert(!ctx->aos);
- if (!ctx->op_actions[TGSI_OPCODE_SIN].intr_name ||
- !ctx->op_actions[TGSI_OPCODE_COS].intr_name) {
- goto fallback;
+ emit_data.dst_type = base->elem_type;
+ if (!action->fetch_args) {
+ /* src0.x */
+ emit_data.args[0] = lp_emit_fetch_soa(&ctx->bld_ctx.soa, inst,
+ 0, CHAN_X);
+ } else {
+ action->fetch_args(ctx, &emit_data);
+ }
+
+ if (!action->emit) {
+ if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
+ struct tgsi_llvm_opcode_action * cos_action =
+ &ctx->op_actions[TGSI_OPCODE_COS];
+ struct tgsi_llvm_emit_data cos_emit_data;
+
+ assert(cos_action->emit);
+ memset(&cos_emit_data, 0, sizeof(cos_emit_data));
+ cos_emit_data.dst_type = base->elem_type;
+ cos_emit_data.args[0] = emit_data.args[0] /* src0.x */;
+ cos_emit_data.arg_count = 1;
+ values[CHAN_X] = cos_action->emit(cos_action, ctx, &cos_emit_data);
}
- src0 = lp_emit_fetch_soa(&ctx->bld_ctx.soa, inst, 0, 0);
- dst[0] = lp_build_intrinsic_unary(builder,
- ctx->op_actions[TGSI_OPCODE_COS].intr_name,
- base->elem_type, src0);
- dst[1] = lp_build_intrinsic_unary(builder,
- ctx->op_actions[TGSI_OPCODE_SIN].intr_name,
- base->elem_type, src0);
- dst[2] = base->zero;
- dst[3] = base->one;
- FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
- bld_base->emit_store(bld_base, inst, 0, chan_index,
- NULL, dst[chan_index]);
+ if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
+ struct tgsi_llvm_opcode_action * sin_action =
+ &ctx->op_actions[TGSI_OPCODE_SIN];
+ struct tgsi_llvm_emit_data sin_emit_data;
+
+ assert(sin_action->emit);
+ memset(&sin_emit_data, 0, sizeof(sin_emit_data));
+ sin_emit_data.dst_type = base->elem_type;
+ sin_emit_data.args[0] = emit_data.args[0] /* src0.x */;
+ sin_emit_data.arg_count = 1;
+ values[CHAN_Y] = sin_action->emit(sin_action, ctx, &sin_emit_data);
}
- break;
- }
- case TGSI_OPCODE_SLT:
- if (ctx->aos) {
- src0 = lp_emit_fetch_aos(&ctx->bld_ctx.aos, inst, 0);
- src1 = lp_emit_fetch_aos(&ctx->bld_ctx.aos, inst, 1);
- ret_type = base->vec_type;
- dst = lp_build_intrinsic_binary(base->gallivm->builder,
- ctx->op_actions[TGSI_OPCODE_SGT].intr_name,
- ret_type, src1, src0);
- } else {
- unsigned chan_index;
- ret_type =base->elem_type;
- FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
- src0 = lp_emit_fetch_soa(&ctx->bld_ctx.soa, inst, 0, chan_index);
- src1 = lp_emit_fetch_soa(&ctx->bld_ctx.soa, inst, 1, chan_index);
- dst = lp_build_intrinsic_binary(base->gallivm->builder,
- ctx->op_actions[TGSI_OPCODE_SGT].intr_name, ret_type, src1, src0);
- bld_base->emit_store(bld_base, inst, 0, chan_index,
- NULL, dst);
+ if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Z) {
+ values[CHAN_Z] = base->zero;
}
- }
- break;
- case TGSI_OPCODE_SLE:
- {
- unsigned chan_index;
- assert(ctx->op_actions[TGSI_OPCODE_SGE].intr_name);
- FOR_EACH_DST0_ENABLED_CHANNEL(inst, chan_index) {
- src0 = lp_emit_fetch_soa(&ctx->bld_ctx.soa, inst, 0, chan_index);
- src1 = lp_emit_fetch_soa(&ctx->bld_ctx.soa, inst, 1, chan_index);
- dst = lp_build_intrinsic_binary(builder,
- ctx->op_actions[TGSI_OPCODE_SGE].intr_name,
- base->elem_type,
- src1, src0);
- bld_base->emit_store(bld_base, inst, 0, chan_index,
- NULL, dst);
+ if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_W) {
+ values[CHAN_W] = base->one;
}
- break;
+
+ } else {
+ tgsi_llvm_emit_soa(ctx, inst, action, &emit_data, values);
}
+ store_values(bld_base, inst, values);
+ break;
/* These are a special case because the do not have a dst reg */
case TGSI_OPCODE_KILP:
diff --git a/src/gallium/auxiliary/tgsi/tgsi_llvm.h b/src/gallium/auxiliary/tgsi/tgsi_llvm.h
index b8377d1fec7..bb9e1b69779 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_llvm.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_llvm.h
@@ -183,6 +183,10 @@ void tgsi_llvm_fetch_args(
struct tgsi_llvm_context * ctx,
struct tgsi_llvm_emit_data * emit_data);
+void tgsi_llvm_fetch_args_2_reverse(
+ struct tgsi_llvm_context * ctx,
+ struct tgsi_llvm_emit_data * emit_data);
+
void tgsi_llvm_fetch_args_tex(
struct tgsi_llvm_context * ctx,
struct tgsi_llvm_emit_data * emit_data);