tgsi: Implement EXP opcode for SSE2.
This commit is contained in:
@@ -1756,18 +1756,18 @@ exec_instruction(
|
|||||||
micro_flr( &r[1], &r[0] ); /* r1 = floor(r0) */
|
micro_flr( &r[1], &r[0] ); /* r1 = floor(r0) */
|
||||||
if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) {
|
if (IS_CHANNEL_ENABLED( *inst, CHAN_X )) {
|
||||||
micro_exp2( &r[2], &r[1] ); /* r2 = 2 ^ r1 */
|
micro_exp2( &r[2], &r[1] ); /* r2 = 2 ^ r1 */
|
||||||
STORE( &r[2], 0, CHAN_X ); /* store r2 */
|
STORE( &r[2], 0, CHAN_X ); /* store r2 */
|
||||||
}
|
}
|
||||||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Y )) {
|
if (IS_CHANNEL_ENABLED( *inst, CHAN_Y )) {
|
||||||
micro_sub( &r[2], &r[0], &r[1] ); /* r2 = r0 - r1 */
|
micro_sub( &r[2], &r[0], &r[1] ); /* r2 = r0 - r1 */
|
||||||
STORE( &r[2], 0, CHAN_Y ); /* store r2 */
|
STORE( &r[2], 0, CHAN_Y ); /* store r2 */
|
||||||
}
|
}
|
||||||
if (IS_CHANNEL_ENABLED( *inst, CHAN_Z )) {
|
if (IS_CHANNEL_ENABLED( *inst, CHAN_Z )) {
|
||||||
micro_exp2( &r[2], &r[0] ); /* r2 = 2 ^ r0 */
|
micro_exp2( &r[2], &r[0] ); /* r2 = 2 ^ r0 */
|
||||||
STORE( &r[2], 0, CHAN_Z ); /* store r2 */
|
STORE( &r[2], 0, CHAN_Z ); /* store r2 */
|
||||||
}
|
}
|
||||||
if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) {
|
if (IS_CHANNEL_ENABLED( *inst, CHAN_W )) {
|
||||||
STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_W );
|
STORE( &mach->Temps[TEMP_1_I].xyzw[TEMP_1_C], 0, CHAN_W );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -61,6 +61,9 @@
|
|||||||
#define CHAN_Z 2
|
#define CHAN_Z 2
|
||||||
#define CHAN_W 3
|
#define CHAN_W 3
|
||||||
|
|
||||||
|
#define TEMP_ONE_I TGSI_EXEC_TEMP_ONE_I
|
||||||
|
#define TEMP_ONE_C TGSI_EXEC_TEMP_ONE_C
|
||||||
|
|
||||||
#define TEMP_R0 TGSI_EXEC_TEMP_R0
|
#define TEMP_R0 TGSI_EXEC_TEMP_R0
|
||||||
#define TEMP_ADDR TGSI_EXEC_TEMP_ADDR
|
#define TEMP_ADDR TGSI_EXEC_TEMP_ADDR
|
||||||
|
|
||||||
@@ -958,8 +961,8 @@ emit_fetch(
|
|||||||
emit_tempf(
|
emit_tempf(
|
||||||
func,
|
func,
|
||||||
xmm,
|
xmm,
|
||||||
TGSI_EXEC_TEMP_ONE_I,
|
TEMP_ONE_I,
|
||||||
TGSI_EXEC_TEMP_ONE_C );
|
TEMP_ONE_C );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -1173,8 +1176,8 @@ emit_setcc(
|
|||||||
func,
|
func,
|
||||||
make_xmm( 0 ),
|
make_xmm( 0 ),
|
||||||
get_temp(
|
get_temp(
|
||||||
TGSI_EXEC_TEMP_ONE_I,
|
TEMP_ONE_I,
|
||||||
TGSI_EXEC_TEMP_ONE_C ) );
|
TEMP_ONE_C ) );
|
||||||
STORE( func, *inst, 0, 0, chan_index );
|
STORE( func, *inst, 0, 0, chan_index );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1243,8 +1246,8 @@ emit_instruction(
|
|||||||
emit_tempf(
|
emit_tempf(
|
||||||
func,
|
func,
|
||||||
0,
|
0,
|
||||||
TGSI_EXEC_TEMP_ONE_I,
|
TEMP_ONE_I,
|
||||||
TGSI_EXEC_TEMP_ONE_C);
|
TEMP_ONE_C);
|
||||||
if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) ) {
|
if( IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) ) {
|
||||||
STORE( func, *inst, 0, 0, CHAN_X );
|
STORE( func, *inst, 0, 0, CHAN_X );
|
||||||
}
|
}
|
||||||
@@ -1329,7 +1332,38 @@ emit_instruction(
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case TGSI_OPCODE_EXP:
|
case TGSI_OPCODE_EXP:
|
||||||
return 0;
|
if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) ||
|
||||||
|
IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) ||
|
||||||
|
IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z )) {
|
||||||
|
FETCH( func, *inst, 0, 0, CHAN_X );
|
||||||
|
if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X ) ||
|
||||||
|
IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y )) {
|
||||||
|
emit_MOV( func, 1, 0 );
|
||||||
|
emit_flr( func, 1 );
|
||||||
|
/* dst.x = ex2(floor(src.x)) */
|
||||||
|
if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_X )) {
|
||||||
|
emit_MOV( func, 2, 1 );
|
||||||
|
emit_ex2( func, 2 );
|
||||||
|
STORE( func, *inst, 2, 0, CHAN_X );
|
||||||
|
}
|
||||||
|
/* dst.y = src.x - floor(src.x) */
|
||||||
|
if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y )) {
|
||||||
|
emit_MOV( func, 2, 0 );
|
||||||
|
emit_sub( func, 2, 1 );
|
||||||
|
STORE( func, *inst, 2, 0, CHAN_Y );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* dst.z = ex2(src.x) */
|
||||||
|
if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Z )) {
|
||||||
|
emit_ex2( func, 0 );
|
||||||
|
STORE( func, *inst, 0, 0, CHAN_Z );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* dst.w = 1.0 */
|
||||||
|
if (IS_DST0_CHANNEL_ENABLED( *inst, CHAN_W )) {
|
||||||
|
emit_tempf( func, 0, TEMP_ONE_I, TEMP_ONE_C );
|
||||||
|
STORE( func, *inst, 0, 0, CHAN_W );
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TGSI_OPCODE_LOG:
|
case TGSI_OPCODE_LOG:
|
||||||
@@ -1399,8 +1433,8 @@ emit_instruction(
|
|||||||
emit_tempf(
|
emit_tempf(
|
||||||
func,
|
func,
|
||||||
0,
|
0,
|
||||||
TGSI_EXEC_TEMP_ONE_I,
|
TEMP_ONE_I,
|
||||||
TGSI_EXEC_TEMP_ONE_C );
|
TEMP_ONE_C );
|
||||||
STORE( func, *inst, 0, 0, CHAN_X );
|
STORE( func, *inst, 0, 0, CHAN_X );
|
||||||
}
|
}
|
||||||
IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) {
|
IF_IS_DST0_CHANNEL_ENABLED( *inst, CHAN_Y ) {
|
||||||
@@ -1603,8 +1637,8 @@ emit_instruction(
|
|||||||
emit_tempf(
|
emit_tempf(
|
||||||
func,
|
func,
|
||||||
0,
|
0,
|
||||||
TGSI_EXEC_TEMP_ONE_I,
|
TEMP_ONE_I,
|
||||||
TGSI_EXEC_TEMP_ONE_C );
|
TEMP_ONE_C );
|
||||||
STORE( func, *inst, 0, 0, CHAN_W );
|
STORE( func, *inst, 0, 0, CHAN_W );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1731,8 +1765,8 @@ emit_instruction(
|
|||||||
emit_tempf(
|
emit_tempf(
|
||||||
func,
|
func,
|
||||||
0,
|
0,
|
||||||
TGSI_EXEC_TEMP_ONE_I,
|
TEMP_ONE_I,
|
||||||
TGSI_EXEC_TEMP_ONE_C );
|
TEMP_ONE_C );
|
||||||
FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
|
FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
|
||||||
STORE( func, *inst, 0, 0, chan_index );
|
STORE( func, *inst, 0, 0, chan_index );
|
||||||
}
|
}
|
||||||
@@ -1820,8 +1854,8 @@ emit_instruction(
|
|||||||
emit_tempf(
|
emit_tempf(
|
||||||
func,
|
func,
|
||||||
0,
|
0,
|
||||||
TGSI_EXEC_TEMP_ONE_I,
|
TEMP_ONE_I,
|
||||||
TGSI_EXEC_TEMP_ONE_C );
|
TEMP_ONE_C );
|
||||||
STORE( func, *inst, 0, 0, CHAN_W );
|
STORE( func, *inst, 0, 0, CHAN_W );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user