Browse Source

freedreno/a3xx/compiler: add KILL_IF

The KILL_IF opcode could potentially be merged in to the regular KILL
opcode function.  It was a pain to do so, so I've left is separated
for cleanliness.

Signed-off-by: Ryan Houdek <Sonicadvance1@gmail.com>
Signed-off-by: Rob Clark <robclark@freedesktop.org>
tags/10.3-branchpoint
Ryan Houdek 11 years ago
parent
commit
ac2a8e3c9d
1 changed files with 35 additions and 1 deletions
  1. 35
    1
      src/gallium/drivers/freedreno/a3xx/fd3_compiler.c

+ 35
- 1
src/gallium/drivers/freedreno/a3xx/fd3_compiler.c View File

@@ -1631,7 +1631,7 @@ trans_endif(const struct instr_translater *t,
}

/*
* Kill / Kill-if
* Kill
*/

static void
@@ -1677,6 +1677,39 @@ trans_kill(const struct instr_translater *t,
ctx->kill[ctx->kill_count++] = instr;
}

/*
* Kill-If
*/

static void
trans_killif(const struct instr_translater *t,
struct fd3_compile_context *ctx,
struct tgsi_full_instruction *inst)
{
struct tgsi_src_register *src = &inst->Src[0].Register;
struct ir3_instruction *instr, *immed, *cond = NULL;
bool inv = false;

immed = create_immed(ctx, 0.0);

/* cmps.f.ne p0.x, cond, {0.0} */
instr = instr_create(ctx, 2, OPC_CMPS_F);
instr->cat2.condition = IR3_COND_NE;
ir3_reg_create(instr, regid(REG_P0, 0), 0);
ir3_reg_create(instr, 0, IR3_REG_SSA)->instr = immed;
add_src_reg(ctx, instr, src, src->SwizzleX);

cond = instr;

/* kill p0.x */
instr = instr_create(ctx, 0, OPC_KILL);
instr->cat0.inv = inv;
ir3_reg_create(instr, 0, 0); /* dummy dst */
ir3_reg_create(instr, 0, IR3_REG_SSA)->instr = cond;

ctx->kill[ctx->kill_count++] = instr;

}
/*
* I2F / U2F / F2I / F2U
*/
@@ -1916,6 +1949,7 @@ static const struct instr_translater translaters[TGSI_OPCODE_LAST] = {
INSTR(ENDIF, trans_endif),
INSTR(END, instr_cat0, .opc = OPC_END),
INSTR(KILL, trans_kill, .opc = OPC_KILL),
INSTR(KILL_IF, trans_killif, .opc = OPC_KILL),
INSTR(I2F, trans_cov),
INSTR(U2F, trans_cov),
INSTR(F2I, trans_cov),

Loading…
Cancel
Save