1 #include "tgsi_platform.h"
3 #include "x86/rtasm/x86sse.h"
5 #if defined(USE_X86_ASM) || defined(SLANG_X86)
7 #define FOR_EACH_CHANNEL( CHAN )\
8 for( CHAN = 0; CHAN < 4; CHAN++ )
10 #define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
11 ((INST).FullDstRegisters[0].DstRegister.WriteMask & (1 << (CHAN)))
13 #define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
14 if( IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
16 #define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
17 FOR_EACH_CHANNEL( CHAN )\
18 IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
25 #define ALIGN16( ADDR ) (((ADDR) + 15) & ~15)
32 x86_make_reg( file_REG32
, reg_SP
),
42 (enum x86_reg_name
) xmm
);
46 get_const_base( void )
60 (vec
* 4 + chan
) * 4 );
64 get_input_base( void )
78 (vec
* 4 + chan
) * 16 );
82 get_output_base( void )
96 (vec
* 4 + chan
) * 16 );
100 get_temp_base( void )
107 static struct x86_reg
112 return x86_make_disp(
114 (vec
* 4 + chan
) * 16 );
117 static struct x86_reg
123 vec
+ TGSI_EXEC_NUM_TEMPS
,
129 struct x86_function
*func
,
137 get_const( vec
, chan
) );
142 SHUF( 0, 0, 0, 0 ) );
147 struct x86_function
*func
,
155 get_input( vec
, chan
) );
160 struct x86_function
*func
,
167 get_output( vec
, chan
),
173 struct x86_function
*func
,
181 get_temp( vec
, chan
) );
186 struct x86_function
*func
,
193 get_temp( vec
, chan
),
199 struct x86_function
*func
,
207 vec
+ TGSI_EXEC_NUM_TEMPS
,
213 struct x86_function
*func
,
221 vec
+ TGSI_EXEC_NUM_TEMPS
,
227 struct x86_function
*func
,
234 TGSI_EXEC_TEMP_7FFFFFFF_I
,
235 TGSI_EXEC_TEMP_7FFFFFFF_C
) );
240 struct x86_function
*func
,
247 TGSI_EXEC_TEMP_80000000_I
,
248 TGSI_EXEC_TEMP_80000000_C
) );
253 struct x86_function
*func
,
260 TGSI_EXEC_TEMP_80000000_I
,
261 TGSI_EXEC_TEMP_80000000_C
) );
266 struct x86_function
*func
,
273 make_xmm( xmm_src
) );
278 struct x86_function
*func
)
282 x86_make_reg( file_REG32
, reg_AX
) );
285 x86_make_reg( file_REG32
, reg_BX
) );
288 x86_make_reg( file_REG32
, reg_CX
) );
291 x86_make_reg( file_REG32
, reg_DX
) );
296 struct x86_function
*func
)
300 x86_make_reg( file_REG32
, reg_DX
) );
303 x86_make_reg( file_REG32
, reg_CX
) );
306 x86_make_reg( file_REG32
, reg_BX
) );
309 x86_make_reg( file_REG32
, reg_AX
) );
314 struct x86_function
*func
,
317 unsigned char *code
)
321 x86_make_reg( file_REG32
, reg_AX
) );
324 x86_make_reg( file_REG32
, reg_AX
),
328 x86_deref( x86_make_reg( file_REG32
, reg_AX
) ),
329 make_xmm( xmm_dst
) );
340 x86_deref( x86_make_reg( file_REG32
, reg_AX
) ) );
343 x86_make_reg( file_REG32
, reg_AX
) );
348 struct x86_function
*func
,
352 unsigned char *code
)
356 x86_make_reg( file_REG32
, reg_AX
) );
359 x86_make_reg( file_REG32
, reg_AX
),
363 x86_deref( x86_make_reg( file_REG32
, reg_AX
) ),
364 make_xmm( xmm_dst
) );
367 x86_make_disp( x86_make_reg( file_REG32
, reg_AX
), 16 ),
368 make_xmm( xmm_src
) );
379 x86_deref( x86_make_reg( file_REG32
, reg_AX
) ) );
382 x86_make_reg( file_REG32
, reg_AX
) );
385 /* XXX: move into machine context */
386 static float g_cos_storage
[4 + 3];
391 float *store
= (float *) ALIGN16( (unsigned) g_cos_storage
);
394 store
[0] = (float) cos( (double) store
[0] );
395 store
[1] = (float) cos( (double) store
[1] );
396 store
[2] = (float) cos( (double) store
[2] );
397 store
[3] = (float) cos( (double) store
[3] );
399 store
[0] = cosf( store
[0] );
400 store
[1] = cosf( store
[1] );
401 store
[2] = cosf( store
[2] );
402 store
[3] = cosf( store
[3] );
408 struct x86_function
*func
,
414 ALIGN16( (unsigned) g_cos_storage
),
415 (unsigned char *) cos4f
);
418 /* XXX: move into machine context */
419 static float g_sin_storage
[4 + 3];
424 float *store
= (float *) ALIGN16( (unsigned) g_sin_storage
);
427 store
[0] = (float) sin( (double) store
[0] );
428 store
[1] = (float) sin( (double) store
[1] );
429 store
[2] = (float) sin( (double) store
[2] );
430 store
[3] = (float) sin( (double) store
[3] );
432 store
[0] = sinf( store
[0] );
433 store
[1] = sinf( store
[1] );
434 store
[2] = sinf( store
[2] );
435 store
[3] = sinf( store
[3] );
440 emit_sin (struct x86_function
*func
,
446 ALIGN16( (unsigned) g_sin_storage
),
447 (unsigned char *) sin4f
);
452 struct x86_function
*func
,
459 make_xmm( xmm_src
) );
463 emit_mul (struct x86_function
*func
,
470 make_xmm( xmm_src
) );
473 /* XXX: move into machine context */
474 static float g_pow_storage
[4 + 4 + 3];
479 float *store
= (float *) ALIGN16( (unsigned) g_pow_storage
);
482 store
[0] = (float) pow( (double) store
[0], (double) store
[4] );
483 store
[1] = (float) pow( (double) store
[1], (double) store
[5] );
484 store
[2] = (float) pow( (double) store
[2], (double) store
[6] );
485 store
[3] = (float) pow( (double) store
[3], (double) store
[7] );
487 store
[0] = powf( store
[0], store
[4] );
488 store
[1] = powf( store
[1], store
[5] );
489 store
[2] = powf( store
[2], store
[6] );
490 store
[3] = powf( store
[3], store
[7] );
496 struct x86_function
*func
,
504 ALIGN16( (unsigned) g_pow_storage
),
505 (unsigned char *) pow4f
);
508 /* XXX: move into machine context */
509 static float g_ex2_storage
[4 + 3];
514 float *store
= (float *) ALIGN16( (unsigned) g_ex2_storage
);
517 store
[0] = (float) pow( 2.0, (double) store
[0] );
518 store
[1] = (float) pow( 2.0, (double) store
[1] );
519 store
[2] = (float) pow( 2.0, (double) store
[2] );
520 store
[3] = (float) pow( 2.0, (double) store
[3] );
522 store
[0] = powf( 2.0f
, store
[0] );
523 store
[1] = powf( 2.0f
, store
[1] );
524 store
[2] = powf( 2.0f
, store
[2] );
525 store
[3] = powf( 2.0f
, store
[3] );
531 struct x86_function
*func
,
537 ALIGN16( (unsigned) g_ex2_storage
),
538 (unsigned char *) ex24f
);
541 /* XXX: move into machine context */
542 static float g_lg2_storage
[4 + 3];
547 float *store
= (float *) ALIGN16( (unsigned) g_lg2_storage
);
549 store
[0] = LOG2( store
[0] );
550 store
[1] = LOG2( store
[1] );
551 store
[2] = LOG2( store
[2] );
552 store
[3] = LOG2( store
[3] );
557 struct x86_function
*func
,
563 ALIGN16( (unsigned) g_lg2_storage
),
564 (unsigned char *) lg24f
);
567 /* XXX: move into machine context */
568 static float g_flr_storage
[4 + 3];
573 float *store
= (float *) ALIGN16( (unsigned) g_flr_storage
);
575 store
[0] = (float) floor( (double) store
[0] );
576 store
[1] = (float) floor( (double) store
[1] );
577 store
[2] = (float) floor( (double) store
[2] );
578 store
[3] = (float) floor( (double) store
[3] );
583 struct x86_function
*func
,
589 ALIGN16( (unsigned) g_flr_storage
),
590 (unsigned char *) flr4f
);
593 /* XXX: move into machine context */
594 static float g_frc_storage
[4 + 3];
599 float *store
= (float *) ALIGN16( (unsigned) g_frc_storage
);
601 store
[0] -= (float) floor( (double) store
[0] );
602 store
[1] -= (float) floor( (double) store
[1] );
603 store
[2] -= (float) floor( (double) store
[2] );
604 store
[3] -= (float) floor( (double) store
[3] );
609 struct x86_function
*func
,
615 ALIGN16( (unsigned) g_frc_storage
),
616 (unsigned char *) frc4f
);
621 struct x86_function
*func
,
628 make_xmm( xmm_src
) );
633 struct x86_function
*func
,
640 make_xmm( xmm_src
) );
645 struct x86_function
*func
,
652 make_xmm( xmm_src
) );
657 struct x86_function
*func
,
659 const struct tgsi_full_src_register
*reg
,
660 const unsigned chan_index
)
662 unsigned swizzle
= tgsi_util_get_full_src_register_extswizzle( reg
, chan_index
);
665 case TGSI_EXTSWIZZLE_X
:
666 case TGSI_EXTSWIZZLE_Y
:
667 case TGSI_EXTSWIZZLE_Z
:
668 case TGSI_EXTSWIZZLE_W
:
669 switch( reg
->SrcRegister
.File
) {
670 case TGSI_FILE_CONSTANT
:
674 reg
->SrcRegister
.Index
,
678 case TGSI_FILE_INPUT
:
682 reg
->SrcRegister
.Index
,
686 case TGSI_FILE_TEMPORARY
:
690 reg
->SrcRegister
.Index
,
699 case TGSI_EXTSWIZZLE_ZERO
:
703 TGSI_EXEC_TEMP_00000000_I
,
704 TGSI_EXEC_TEMP_00000000_C
);
707 case TGSI_EXTSWIZZLE_ONE
:
711 TGSI_EXEC_TEMP_ONE_I
,
712 TGSI_EXEC_TEMP_ONE_C
);
719 switch( tgsi_util_get_full_src_register_sign_mode( reg
, chan_index
) ) {
720 case TGSI_UTIL_SIGN_CLEAR
:
721 emit_abs( func
, xmm
);
724 case TGSI_UTIL_SIGN_SET
:
725 emit_setsign( func
, xmm
);
728 case TGSI_UTIL_SIGN_TOGGLE
:
729 emit_neg( func
, xmm
);
732 case TGSI_UTIL_SIGN_KEEP
:
739 struct x86_function
*func
,
741 const struct tgsi_full_dst_register
*reg
,
742 const struct tgsi_full_instruction
*inst
,
743 unsigned chan_index
)
745 switch( reg
->DstRegister
.File
) {
746 case TGSI_FILE_OUTPUT
:
750 reg
->DstRegister
.Index
,
754 case TGSI_FILE_TEMPORARY
:
758 reg
->DstRegister
.Index
,
762 case TGSI_FILE_ADDRESS
:
766 reg
->DstRegister
.Index
,
774 switch( inst
->Instruction
.Saturate
) {
778 case TGSI_SAT_ZERO_ONE
:
782 case TGSI_SAT_MINUS_PLUS_ONE
:
790 struct x86_function
*func
,
791 const struct tgsi_full_src_register
*reg
)
794 unsigned registers
[4];
795 unsigned nextregister
= 0;
796 unsigned firstchan
= ~0;
799 /* This mask stores component bits that were already tested. Note that
800 * we test if the value is less than zero, so 1.0 and 0.0 need not to be
802 uniquemask
= (1 << TGSI_EXTSWIZZLE_ZERO
) | (1 << TGSI_EXTSWIZZLE_ONE
);
804 FOR_EACH_CHANNEL( chan_index
) {
807 /* unswizzle channel */
808 swizzle
= tgsi_util_get_full_src_register_extswizzle(
812 /* check if the component has not been already tested */
813 if( !(uniquemask
& (1 << swizzle
)) ) {
814 uniquemask
|= 1 << swizzle
;
816 /* allocate register */
817 registers
[chan_index
] = nextregister
;
825 /* mark the first channel used */
826 if( firstchan
== ~0 ) {
827 firstchan
= chan_index
;
834 x86_make_reg( file_REG32
, reg_AX
) );
837 x86_make_reg( file_REG32
, reg_DX
) );
839 FOR_EACH_CHANNEL( chan_index
) {
840 if( uniquemask
& (1 << chan_index
) ) {
843 make_xmm( registers
[chan_index
] ),
845 TGSI_EXEC_TEMP_00000000_I
,
846 TGSI_EXEC_TEMP_00000000_C
),
849 if( chan_index
== firstchan
) {
852 x86_make_reg( file_REG32
, reg_AX
),
853 make_xmm( registers
[chan_index
] ) );
858 x86_make_reg( file_REG32
, reg_DX
),
859 make_xmm( registers
[chan_index
] ) );
862 x86_make_reg( file_REG32
, reg_AX
),
863 x86_make_reg( file_REG32
, reg_DX
) );
871 TGSI_EXEC_TEMP_KILMASK_I
,
872 TGSI_EXEC_TEMP_KILMASK_C
),
873 x86_make_reg( file_REG32
, reg_AX
) );
877 x86_make_reg( file_REG32
, reg_DX
) );
880 x86_make_reg( file_REG32
, reg_AX
) );
883 #define FETCH( FUNC, INST, XMM, INDEX, CHAN )\
884 emit_fetch( FUNC, XMM, &(INST).FullSrcRegisters[INDEX], CHAN )
886 #define STORE( FUNC, INST, XMM, INDEX, CHAN )\
887 emit_store( FUNC, XMM, &(INST).FullDstRegisters[INDEX], &(INST), CHAN )
891 struct x86_function
*func
,
892 struct tgsi_full_instruction
*inst
,
897 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
898 FETCH( func
, *inst
, 0, 0, chan_index
);
899 FETCH( func
, *inst
, 1, 1, chan_index
);
909 TGSI_EXEC_TEMP_ONE_I
,
910 TGSI_EXEC_TEMP_ONE_C
) );
911 STORE( func
, *inst
, 0, 0, chan_index
);
917 struct x86_function
*func
,
918 struct tgsi_full_instruction
*inst
)
922 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
923 FETCH( func
, *inst
, 0, 0, chan_index
);
924 FETCH( func
, *inst
, 1, 1, chan_index
);
925 FETCH( func
, *inst
, 2, 2, chan_index
);
930 TGSI_EXEC_TEMP_00000000_I
,
931 TGSI_EXEC_TEMP_00000000_C
),
945 STORE( func
, *inst
, 0, 0, chan_index
);
951 struct x86_function
*func
,
962 struct x86_function
*func
,
963 struct tgsi_full_instruction
*inst
)
967 switch( inst
->Instruction
.Opcode
) {
968 case TGSI_OPCODE_ARL
:
969 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
970 FETCH( func
, *inst
, 0, 0, chan_index
);
971 emit_f2it( func
, 0 );
972 STORE( func
, *inst
, 0, 0, chan_index
);
976 case TGSI_OPCODE_MOV
:
977 /* TGSI_OPCODE_SWZ */
978 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
979 FETCH( func
, *inst
, 0, 0, chan_index
);
980 STORE( func
, *inst
, 0, 0, chan_index
);
984 case TGSI_OPCODE_LIT
:
985 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_X
) ||
986 IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_W
) ) {
990 TGSI_EXEC_TEMP_ONE_I
,
991 TGSI_EXEC_TEMP_ONE_C
);
992 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_X
) ) {
993 STORE( func
, *inst
, 0, 0, CHAN_X
);
995 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_W
) ) {
996 STORE( func
, *inst
, 0, 0, CHAN_W
);
999 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Y
) ||
1000 IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Z
) ) {
1001 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Y
) ) {
1002 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1007 TGSI_EXEC_TEMP_00000000_I
,
1008 TGSI_EXEC_TEMP_00000000_C
) );
1009 STORE( func
, *inst
, 0, 0, CHAN_Y
);
1011 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Z
) ) {
1012 FETCH( func
, *inst
, 1, 0, CHAN_Y
);
1017 TGSI_EXEC_TEMP_00000000_I
,
1018 TGSI_EXEC_TEMP_00000000_C
) );
1019 FETCH( func
, *inst
, 2, 0, CHAN_W
);
1024 TGSI_EXEC_TEMP_128_I
,
1025 TGSI_EXEC_TEMP_128_C
) );
1030 TGSI_EXEC_TEMP_MINUS_128_I
,
1031 TGSI_EXEC_TEMP_MINUS_128_C
) );
1032 emit_pow( func
, 1, 2 );
1033 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1047 STORE( func
, *inst
, 2, 0, CHAN_Z
);
1052 case TGSI_OPCODE_RCP
:
1053 /* TGSI_OPCODE_RECIP */
1054 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1055 emit_rcp( func
, 0, 0 );
1056 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1057 STORE( func
, *inst
, 0, 0, chan_index
);
1061 case TGSI_OPCODE_RSQ
:
1062 /* TGSI_OPCODE_RECIPSQRT */
1063 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1064 emit_rsqrt( func
, 0, 0 );
1065 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1066 STORE( func
, *inst
, 0, 0, chan_index
);
1070 case TGSI_OPCODE_EXP
:
1074 case TGSI_OPCODE_LOG
:
1078 case TGSI_OPCODE_MUL
:
1079 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1080 FETCH( func
, *inst
, 0, 0, chan_index
);
1081 FETCH( func
, *inst
, 1, 1, chan_index
);
1082 emit_mul( func
, 0, 1 );
1083 STORE( func
, *inst
, 0, 0, chan_index
);
1087 case TGSI_OPCODE_ADD
:
1088 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1089 FETCH( func
, *inst
, 0, 0, chan_index
);
1090 FETCH( func
, *inst
, 1, 1, chan_index
);
1091 emit_add( func
, 0, 1 );
1092 STORE( func
, *inst
, 0, 0, chan_index
);
1096 case TGSI_OPCODE_DP3
:
1097 /* TGSI_OPCODE_DOT3 */
1098 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1099 FETCH( func
, *inst
, 1, 1, CHAN_X
);
1100 emit_mul( func
, 0, 1 );
1101 FETCH( func
, *inst
, 1, 0, CHAN_Y
);
1102 FETCH( func
, *inst
, 2, 1, CHAN_Y
);
1103 emit_mul( func
, 1, 2 );
1104 emit_add( func
, 0, 1 );
1105 FETCH( func
, *inst
, 1, 0, CHAN_Z
);
1106 FETCH( func
, *inst
, 2, 1, CHAN_Z
);
1107 emit_mul( func
, 1, 2 );
1108 emit_add( func
, 0, 1 );
1109 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1110 STORE( func
, *inst
, 0, 0, chan_index
);
1114 case TGSI_OPCODE_DP4
:
1115 /* TGSI_OPCODE_DOT4 */
1116 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1117 FETCH( func
, *inst
, 1, 1, CHAN_X
);
1118 emit_mul( func
, 0, 1 );
1119 FETCH( func
, *inst
, 1, 0, CHAN_Y
);
1120 FETCH( func
, *inst
, 2, 1, CHAN_Y
);
1121 emit_mul( func
, 1, 2 );
1122 emit_add( func
, 0, 1 );
1123 FETCH( func
, *inst
, 1, 0, CHAN_Z
);
1124 FETCH( func
, *inst
, 2, 1, CHAN_Z
);
1125 emit_mul(func
, 1, 2 );
1126 emit_add(func
, 0, 1 );
1127 FETCH( func
, *inst
, 1, 0, CHAN_W
);
1128 FETCH( func
, *inst
, 2, 1, CHAN_W
);
1129 emit_mul( func
, 1, 2 );
1130 emit_add( func
, 0, 1 );
1131 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1132 STORE( func
, *inst
, 0, 0, chan_index
);
1136 case TGSI_OPCODE_DST
:
1137 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_X
) {
1141 TGSI_EXEC_TEMP_ONE_I
,
1142 TGSI_EXEC_TEMP_ONE_C
);
1143 STORE( func
, *inst
, 0, 0, CHAN_X
);
1145 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Y
) {
1146 FETCH( func
, *inst
, 0, 0, CHAN_Y
);
1147 FETCH( func
, *inst
, 1, 1, CHAN_Y
);
1148 emit_mul( func
, 0, 1 );
1149 STORE( func
, *inst
, 0, 0, CHAN_Y
);
1151 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Z
) {
1152 FETCH( func
, *inst
, 0, 0, CHAN_Z
);
1153 STORE( func
, *inst
, 0, 0, CHAN_Z
);
1155 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_W
) {
1156 FETCH( func
, *inst
, 0, 1, CHAN_W
);
1157 STORE( func
, *inst
, 0, 0, CHAN_W
);
1161 case TGSI_OPCODE_MIN
:
1162 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1163 FETCH( func
, *inst
, 0, 0, chan_index
);
1164 FETCH( func
, *inst
, 1, 1, chan_index
);
1169 STORE( func
, *inst
, 0, 0, chan_index
);
1173 case TGSI_OPCODE_MAX
:
1174 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1175 FETCH( func
, *inst
, 0, 0, chan_index
);
1176 FETCH( func
, *inst
, 1, 1, chan_index
);
1181 STORE( func
, *inst
, 0, 0, chan_index
);
1185 case TGSI_OPCODE_SLT
:
1186 /* TGSI_OPCODE_SETLT */
1187 emit_setcc( func
, inst
, cc_LessThan
);
1190 case TGSI_OPCODE_SGE
:
1191 /* TGSI_OPCODE_SETGE */
1192 emit_setcc( func
, inst
, cc_NotLessThan
);
1195 case TGSI_OPCODE_MAD
:
1196 /* TGSI_OPCODE_MADD */
1197 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1198 FETCH( func
, *inst
, 0, 0, chan_index
);
1199 FETCH( func
, *inst
, 1, 1, chan_index
);
1200 FETCH( func
, *inst
, 2, 2, chan_index
);
1201 emit_mul( func
, 0, 1 );
1202 emit_add( func
, 0, 2 );
1203 STORE( func
, *inst
, 0, 0, chan_index
);
1207 case TGSI_OPCODE_SUB
:
1208 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1209 FETCH( func
, *inst
, 0, 0, chan_index
);
1210 FETCH( func
, *inst
, 1, 1, chan_index
);
1211 emit_sub( func
, 0, 1 );
1212 STORE( func
, *inst
, 0, 0, chan_index
);
1216 case TGSI_OPCODE_LERP
:
1217 /* TGSI_OPCODE_LRP */
1218 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1219 FETCH( func
, *inst
, 0, 0, chan_index
);
1220 FETCH( func
, *inst
, 1, 1, chan_index
);
1221 FETCH( func
, *inst
, 2, 2, chan_index
);
1222 emit_sub( func
, 1, 2 );
1223 emit_mul( func
, 0, 1 );
1224 emit_add( func
, 0, 2 );
1225 STORE( func
, *inst
, 0, 0, chan_index
);
1229 case TGSI_OPCODE_CND
:
1233 case TGSI_OPCODE_CND0
:
1237 case TGSI_OPCODE_DOT2ADD
:
1238 /* TGSI_OPCODE_DP2A */
1242 case TGSI_OPCODE_INDEX
:
1246 case TGSI_OPCODE_NEGATE
:
1250 case TGSI_OPCODE_FRAC
:
1251 /* TGSI_OPCODE_FRC */
1252 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1253 FETCH( func
, *inst
, 0, 0, chan_index
);
1254 emit_frc( func
, 0 );
1255 STORE( func
, *inst
, 0, 0, chan_index
);
1259 case TGSI_OPCODE_CLAMP
:
1263 case TGSI_OPCODE_FLOOR
:
1264 /* TGSI_OPCODE_FLR */
1265 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1266 FETCH( func
, *inst
, 0, 0, chan_index
);
1267 emit_flr( func
, 0 );
1268 STORE( func
, *inst
, 0, 0, chan_index
);
1272 case TGSI_OPCODE_ROUND
:
1276 case TGSI_OPCODE_EXPBASE2
:
1277 /* TGSI_OPCODE_EX2 */
1278 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1279 emit_ex2( func
, 0 );
1280 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1281 STORE( func
, *inst
, 0, 0, chan_index
);
1285 case TGSI_OPCODE_LOGBASE2
:
1286 /* TGSI_OPCODE_LG2 */
1287 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1288 emit_lg2( func
, 0 );
1289 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1290 STORE( func
, *inst
, 0, 0, chan_index
);
1294 case TGSI_OPCODE_POWER
:
1295 /* TGSI_OPCODE_POW */
1296 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1297 FETCH( func
, *inst
, 1, 1, CHAN_X
);
1298 emit_pow( func
, 0, 1 );
1299 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1300 STORE( func
, *inst
, 0, 0, chan_index
);
1304 case TGSI_OPCODE_CROSSPRODUCT
:
1305 /* TGSI_OPCODE_XPD */
1306 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_X
) ||
1307 IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Y
) ) {
1308 FETCH( func
, *inst
, 1, 1, CHAN_Z
);
1309 FETCH( func
, *inst
, 3, 0, CHAN_Z
);
1311 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_X
) ||
1312 IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Z
) ) {
1313 FETCH( func
, *inst
, 0, 0, CHAN_Y
);
1314 FETCH( func
, *inst
, 4, 1, CHAN_Y
);
1316 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_X
) {
1317 emit_mov( func
, 2, 0 );
1318 emit_mul( func
, 2, 1 );
1319 emit_mov( func
, 5, 3 );
1320 emit_mul( func
, 5, 4 );
1321 emit_sub( func
, 2, 5 );
1322 STORE( func
, *inst
, 2, 0, CHAN_X
);
1324 if( IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Y
) ||
1325 IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Z
) ) {
1326 FETCH( func
, *inst
, 2, 1, CHAN_X
);
1327 FETCH( func
, *inst
, 5, 0, CHAN_X
);
1329 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Y
) {
1330 emit_mul( func
, 3, 2 );
1331 emit_mul( func
, 1, 5 );
1332 emit_sub( func
, 3, 1 );
1333 STORE( func
, *inst
, 3, 0, CHAN_Y
);
1335 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Z
) {
1336 emit_mul( func
, 5, 4 );
1337 emit_mul( func
, 0, 2 );
1338 emit_sub( func
, 5, 0 );
1339 STORE( func
, *inst
, 5, 0, CHAN_Z
);
1341 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_W
) {
1342 FETCH( func
, *inst
, 0, TGSI_EXEC_TEMP_ONE_I
, TGSI_EXEC_TEMP_ONE_C
);
1343 STORE( func
, *inst
, 0, 0, CHAN_W
);
1347 case TGSI_OPCODE_MULTIPLYMATRIX
:
1351 case TGSI_OPCODE_ABS
:
1352 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1353 FETCH( func
, *inst
, 0, 0, chan_index
);
1354 emit_abs( func
, 0) ;
1356 STORE( func
, *inst
, 0, 0, chan_index
);
1360 case TGSI_OPCODE_RCC
:
1364 case TGSI_OPCODE_DPH
:
1365 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1366 FETCH( func
, *inst
, 1, 1, CHAN_X
);
1367 emit_mul( func
, 0, 1 );
1368 FETCH( func
, *inst
, 1, 0, CHAN_Y
);
1369 FETCH( func
, *inst
, 2, 1, CHAN_Y
);
1370 emit_mul( func
, 1, 2 );
1371 emit_add( func
, 0, 1 );
1372 FETCH( func
, *inst
, 1, 0, CHAN_Z
);
1373 FETCH( func
, *inst
, 2, 1, CHAN_Z
);
1374 emit_mul( func
, 1, 2 );
1375 emit_add( func
, 0, 1 );
1376 FETCH( func
, *inst
, 1, 1, CHAN_W
);
1377 emit_add( func
, 0, 1 );
1378 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1379 STORE( func
, *inst
, 0, 0, chan_index
);
1383 case TGSI_OPCODE_COS
:
1384 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1385 emit_cos( func
, 0 );
1386 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1387 STORE( func
, *inst
, 0, 0, chan_index
);
1391 case TGSI_OPCODE_DDX
:
1395 case TGSI_OPCODE_DDY
:
1399 case TGSI_OPCODE_KIL
:
1400 emit_kil( func
, &inst
->FullSrcRegisters
[0] );
1403 case TGSI_OPCODE_PK2H
:
1407 case TGSI_OPCODE_PK2US
:
1411 case TGSI_OPCODE_PK4B
:
1415 case TGSI_OPCODE_PK4UB
:
1419 case TGSI_OPCODE_RFL
:
1423 case TGSI_OPCODE_SEQ
:
1427 case TGSI_OPCODE_SFL
:
1431 case TGSI_OPCODE_SGT
:
1435 case TGSI_OPCODE_SIN
:
1436 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1437 emit_sin( func
, 0 );
1438 FOR_EACH_DST0_ENABLED_CHANNEL( *inst
, chan_index
) {
1439 STORE( func
, *inst
, 0, 0, chan_index
);
1443 case TGSI_OPCODE_SLE
:
1447 case TGSI_OPCODE_SNE
:
1451 case TGSI_OPCODE_STR
:
1455 case TGSI_OPCODE_TEX
:
1459 case TGSI_OPCODE_TXD
:
1463 case TGSI_OPCODE_UP2H
:
1467 case TGSI_OPCODE_UP2US
:
1471 case TGSI_OPCODE_UP4B
:
1475 case TGSI_OPCODE_UP4UB
:
1479 case TGSI_OPCODE_X2D
:
1483 case TGSI_OPCODE_ARA
:
1487 case TGSI_OPCODE_ARR
:
1491 case TGSI_OPCODE_BRA
:
1495 case TGSI_OPCODE_CAL
:
1499 case TGSI_OPCODE_RET
:
1503 case TGSI_OPCODE_SSG
:
1507 case TGSI_OPCODE_CMP
:
1508 emit_cmp (func
, inst
);
1511 case TGSI_OPCODE_SCS
:
1512 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_X
) {
1513 FETCH( func
, *inst
, 0, 0, CHAN_X
);
1514 emit_cos( func
, 0 );
1515 STORE( func
, *inst
, 0, 0, CHAN_X
);
1517 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Y
) {
1518 FETCH( func
, *inst
, 0, 0, CHAN_Y
);
1519 emit_sin( func
, 0 );
1520 STORE( func
, *inst
, 0, 0, CHAN_Y
);
1522 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_Z
) {
1523 FETCH( func
, *inst
, 0, TGSI_EXEC_TEMP_00000000_I
, TGSI_EXEC_TEMP_00000000_C
);
1524 STORE( func
, *inst
, 0, 0, CHAN_Z
);
1526 IF_IS_DST0_CHANNEL_ENABLED( *inst
, CHAN_W
) {
1527 FETCH( func
, *inst
, 0, TGSI_EXEC_TEMP_ONE_I
, TGSI_EXEC_TEMP_ONE_C
);
1528 STORE( func
, *inst
, 0, 0, CHAN_W
);
1532 case TGSI_OPCODE_TXB
:
1536 case TGSI_OPCODE_NRM
:
1540 case TGSI_OPCODE_DIV
:
1544 case TGSI_OPCODE_DP2
:
1548 case TGSI_OPCODE_TXL
:
1552 case TGSI_OPCODE_BRK
:
1556 case TGSI_OPCODE_IF
:
1560 case TGSI_OPCODE_LOOP
:
1564 case TGSI_OPCODE_REP
:
1568 case TGSI_OPCODE_ELSE
:
1572 case TGSI_OPCODE_ENDIF
:
1576 case TGSI_OPCODE_ENDLOOP
:
1580 case TGSI_OPCODE_ENDREP
:
1584 case TGSI_OPCODE_PUSHA
:
1588 case TGSI_OPCODE_POPA
:
1592 case TGSI_OPCODE_CEIL
:
1596 case TGSI_OPCODE_I2F
:
1600 case TGSI_OPCODE_NOT
:
1604 case TGSI_OPCODE_TRUNC
:
1608 case TGSI_OPCODE_SHL
:
1612 case TGSI_OPCODE_SHR
:
1616 case TGSI_OPCODE_AND
:
1620 case TGSI_OPCODE_OR
:
1624 case TGSI_OPCODE_MOD
:
1628 case TGSI_OPCODE_XOR
:
1632 case TGSI_OPCODE_SAD
:
1636 case TGSI_OPCODE_TXF
:
1640 case TGSI_OPCODE_TXQ
:
1644 case TGSI_OPCODE_CONT
:
1648 case TGSI_OPCODE_EMIT
:
1652 case TGSI_OPCODE_ENDPRIM
:
1663 struct tgsi_token
*tokens
,
1664 struct x86_function
*func
)
1666 struct tgsi_parse_context parse
;
1668 func
->csr
= func
->store
;
1673 get_argument( 0 ) );
1677 get_argument( 1 ) );
1681 get_argument( 2 ) );
1685 get_argument( 3 ) );
1687 tgsi_parse_init( &parse
, tokens
);
1689 while( !tgsi_parse_end_of_tokens( &parse
) ) {
1690 tgsi_parse_token( &parse
);
1692 switch( parse
.FullToken
.Token
.Type
) {
1693 case TGSI_TOKEN_TYPE_DECLARATION
:
1696 case TGSI_TOKEN_TYPE_INSTRUCTION
:
1699 &parse
.FullToken
.FullInstruction
);
1707 tgsi_parse_free( &parse
);
1710 x86_retw( func
, 16 );