diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2012-01-04 12:58:43 -0500 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2012-01-05 13:16:59 -0500 |
commit | 17b19ecc7b4d825cc9f679e3a867d77872a1e91f (patch) | |
tree | 1845c206d02fa26341d4b4edfa3fabcdf2b382a1 | |
parent | 41eb700d23c49c31a3018093bcf7204bf7196576 (diff) |
tgsi_llvm: SLT/ SLE
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_llvm.c | 109 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_llvm.h | 4 |
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); |