Browse Source

tgsi: Cleanup dot-product opcodes in interpreter.

tags/7.8-rc1
Michal Krol 16 years ago
parent
commit
dddd5a36ac
1 changed files with 130 additions and 97 deletions
  1. 130
    97
      src/gallium/auxiliary/tgsi/tgsi_exec.c

+ 130
- 97
src/gallium/auxiliary/tgsi/tgsi_exec.c View File

@@ -1914,6 +1914,130 @@ exec_vector_trinary(struct tgsi_exec_machine *mach,
}
}

static void
exec_dp3(struct tgsi_exec_machine *mach,
const struct tgsi_full_instruction *inst)
{
unsigned int chan;
union tgsi_exec_channel arg[3];

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_X, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_X, TGSI_EXEC_DATA_FLOAT);
micro_mul(&arg[2], &arg[0], &arg[1]);

for (chan = CHAN_Y; chan <= CHAN_Z; chan++) {
fetch_source(mach, &arg[0], &inst->Src[0], chan, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], chan, TGSI_EXEC_DATA_FLOAT);
micro_mad(&arg[2], arg);
}

for (chan = 0; chan < NUM_CHANNELS; chan++) {
if (inst->Dst[0].Register.WriteMask & (1 << chan)) {
store_dest(mach, &arg[2], &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT);
}
}
}

static void
exec_dp4(struct tgsi_exec_machine *mach,
const struct tgsi_full_instruction *inst)
{
unsigned int chan;
union tgsi_exec_channel arg[3];

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_X, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_X, TGSI_EXEC_DATA_FLOAT);
micro_mul(&arg[2], &arg[0], &arg[1]);

for (chan = CHAN_Y; chan <= CHAN_W; chan++) {
fetch_source(mach, &arg[0], &inst->Src[0], chan, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], chan, TGSI_EXEC_DATA_FLOAT);
micro_mad(&arg[2], arg);
}

for (chan = 0; chan < NUM_CHANNELS; chan++) {
if (inst->Dst[0].Register.WriteMask & (1 << chan)) {
store_dest(mach, &arg[2], &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT);
}
}
}

static void
exec_dp2a(struct tgsi_exec_machine *mach,
const struct tgsi_full_instruction *inst)
{
unsigned int chan;
union tgsi_exec_channel arg[3];

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_X, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_X, TGSI_EXEC_DATA_FLOAT);
micro_mul(&arg[2], &arg[0], &arg[1]);

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_Y, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_Y, TGSI_EXEC_DATA_FLOAT);
micro_mad(&arg[0], arg);

fetch_source(mach, &arg[1], &inst->Src[2], CHAN_X, TGSI_EXEC_DATA_FLOAT);
micro_add(&arg[0], &arg[0], &arg[1]);

for (chan = 0; chan < NUM_CHANNELS; chan++) {
if (inst->Dst[0].Register.WriteMask & (1 << chan)) {
store_dest(mach, &arg[0], &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT);
}
}
}

static void
exec_dph(struct tgsi_exec_machine *mach,
const struct tgsi_full_instruction *inst)
{
unsigned int chan;
union tgsi_exec_channel arg[3];

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_X, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_X, TGSI_EXEC_DATA_FLOAT);
micro_mul(&arg[2], &arg[0], &arg[1]);

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_Y, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_Y, TGSI_EXEC_DATA_FLOAT);
micro_mad(&arg[2], arg);

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_Z, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_Z, TGSI_EXEC_DATA_FLOAT);
micro_mad(&arg[0], arg);

fetch_source(mach, &arg[1], &inst->Src[1], CHAN_W, TGSI_EXEC_DATA_FLOAT);
micro_add(&arg[0], &arg[0], &arg[1]);

for (chan = 0; chan < NUM_CHANNELS; chan++) {
if (inst->Dst[0].Register.WriteMask & (1 << chan)) {
store_dest(mach, &arg[0], &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT);
}
}
}

static void
exec_dp2(struct tgsi_exec_machine *mach,
const struct tgsi_full_instruction *inst)
{
unsigned int chan;
union tgsi_exec_channel arg[3];

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_X, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_X, TGSI_EXEC_DATA_FLOAT);
micro_mul(&arg[2], &arg[0], &arg[1]);

fetch_source(mach, &arg[0], &inst->Src[0], CHAN_Y, TGSI_EXEC_DATA_FLOAT);
fetch_source(mach, &arg[1], &inst->Src[1], CHAN_Y, TGSI_EXEC_DATA_FLOAT);
micro_mad(&arg[2], arg);

for (chan = 0; chan < NUM_CHANNELS; chan++) {
if (inst->Dst[0].Register.WriteMask & (1 << chan)) {
store_dest(mach, &arg[2], &inst->Dst[0], inst, chan, TGSI_EXEC_DATA_FLOAT);
}
}
}

static void
exec_break(struct tgsi_exec_machine *mach)
{
@@ -2394,54 +2518,11 @@ exec_instruction(
break;

case TGSI_OPCODE_DP3:
/* TGSI_OPCODE_DOT3 */
FETCH( &r[0], 0, CHAN_X );
FETCH( &r[1], 1, CHAN_X );
micro_mul( &r[0], &r[0], &r[1] );

FETCH( &r[1], 0, CHAN_Y );
FETCH( &r[2], 1, CHAN_Y );
micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FETCH( &r[1], 0, CHAN_Z );
FETCH( &r[2], 1, CHAN_Z );
micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
STORE( &r[0], 0, chan_index );
}
exec_dp3(mach, inst);
break;

case TGSI_OPCODE_DP4:
/* TGSI_OPCODE_DOT4 */
FETCH(&r[0], 0, CHAN_X);
FETCH(&r[1], 1, CHAN_X);

micro_mul( &r[0], &r[0], &r[1] );

FETCH(&r[1], 0, CHAN_Y);
FETCH(&r[2], 1, CHAN_Y);

micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FETCH(&r[1], 0, CHAN_Z);
FETCH(&r[2], 1, CHAN_Z);

micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FETCH(&r[1], 0, CHAN_W);
FETCH(&r[2], 1, CHAN_W);

micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
STORE( &r[0], 0, chan_index );
}
case TGSI_OPCODE_DP4:
exec_dp4(mach, inst);
break;

case TGSI_OPCODE_DST:
@@ -2537,21 +2618,7 @@ exec_instruction(
break;

case TGSI_OPCODE_DP2A:
FETCH( &r[0], 0, CHAN_X );
FETCH( &r[1], 1, CHAN_X );
micro_mul( &r[0], &r[0], &r[1] );

FETCH( &r[1], 0, CHAN_Y );
FETCH( &r[2], 1, CHAN_Y );
micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FETCH( &r[2], 2, CHAN_X );
micro_add( &r[0], &r[0], &r[2] );

FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
STORE( &r[0], 0, chan_index );
}
exec_dp2a(mach, inst);
break;

case TGSI_OPCODE_FRC:
@@ -2651,30 +2718,7 @@ exec_instruction(
break;

case TGSI_OPCODE_DPH:
FETCH(&r[0], 0, CHAN_X);
FETCH(&r[1], 1, CHAN_X);

micro_mul( &r[0], &r[0], &r[1] );

FETCH(&r[1], 0, CHAN_Y);
FETCH(&r[2], 1, CHAN_Y);

micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FETCH(&r[1], 0, CHAN_Z);
FETCH(&r[2], 1, CHAN_Z);

micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FETCH(&r[1], 1, CHAN_W);

micro_add( &r[0], &r[0], &r[1] );

FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
STORE( &r[0], 0, chan_index );
}
exec_dph(mach, inst);
break;

case TGSI_OPCODE_COS:
@@ -3088,18 +3132,7 @@ exec_instruction(
break;

case TGSI_OPCODE_DP2:
FETCH( &r[0], 0, CHAN_X );
FETCH( &r[1], 1, CHAN_X );
micro_mul( &r[0], &r[0], &r[1] );

FETCH( &r[1], 0, CHAN_Y );
FETCH( &r[2], 1, CHAN_Y );
micro_mul( &r[1], &r[1], &r[2] );
micro_add( &r[0], &r[0], &r[1] );

FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) {
STORE( &r[0], 0, chan_index );
}
exec_dp2(mach, inst);
break;

case TGSI_OPCODE_IF:

Loading…
Cancel
Save