Fix alignment problems.
authormichal <michal@michal-laptop.(none)>
Fri, 26 Oct 2007 17:00:35 +0000 (18:00 +0100)
committermichal <michal@michal-laptop.(none)>
Sat, 27 Oct 2007 18:01:11 +0000 (19:01 +0100)
Remove NOP opcode.
TEX opcode returns solid white (a hack for D3D state tracker).

src/mesa/pipe/tgsi/exec/tgsi_sse2.c
src/mesa/pipe/tgsi/exec/tgsi_sse2.h

index 77ba7bb..1e1002f 100755 (executable)
@@ -2,8 +2,6 @@
 #include "tgsi_core.h"
 #include "x86/rtasm/x86sse.h"
 
-#if defined(__i386__) || defined(__386__)
-
 #define FOR_EACH_CHANNEL( CHAN )\
    for( CHAN = 0; CHAN < 4; CHAN++ )
 
 #define CHAN_Z 2
 #define CHAN_W 3
 
-#define ALIGN16( ADDR ) (((ADDR) + 15) & ~15)
+static unsigned
+p2u( void *p )
+{
+   union {
+      void     *p;
+      unsigned u;
+   } pu;
+
+   pu.p = p;
+   return pu.u;
+}
 
 static struct x86_reg
 get_argument(
@@ -482,7 +490,7 @@ static float g_cos_storage[4 + 3];
 static void
 cos4f( void )
 {
-   float *store = (float *) ALIGN16( (unsigned) g_cos_storage );
+   float *store = (float *) tgsi_align_128bit( g_cos_storage );
 
 #ifdef WIN32
    store[0] = (float) cos( (double) store[0] );
@@ -505,7 +513,7 @@ emit_cos(
    emit_func_call1(
       func,
       xmm_dst,
-      ALIGN16( (unsigned) g_cos_storage ),
+      p2u( tgsi_align_128bit( g_cos_storage ) ),
       cos4f );
 }
 
@@ -515,7 +523,7 @@ static float g_sin_storage[4 + 3];
 static void
 sin4f( void )
 {
-   float *store = (float *) ALIGN16( (unsigned) g_sin_storage );
+   float *store = (float *) tgsi_align_128bit( g_sin_storage );
 
 #ifdef WIN32
    store[0] = (float) sin( (double) store[0] );
@@ -537,7 +545,7 @@ emit_sin (struct x86_function *func,
    emit_func_call1(
       func,
       xmm_dst,
-      ALIGN16( (unsigned) g_sin_storage ),
+      p2u( tgsi_align_128bit( g_sin_storage ) ),
       sin4f );
 }
 
@@ -570,7 +578,7 @@ static float g_pow_storage[4 + 4 + 3];
 static void
 pow4f( void )
 {
-   float *store = (float *) ALIGN16( (unsigned) g_pow_storage );
+   float *store = (float *) tgsi_align_128bit( g_pow_storage );
 
 #ifdef WIN32
    store[0] = (float) pow( (double) store[0], (double) store[4] );
@@ -595,7 +603,7 @@ emit_pow(
       func,
       xmm_dst,
       xmm_src,
-      ALIGN16( (unsigned) g_pow_storage ),
+      p2u( tgsi_align_128bit( g_pow_storage ) ),
       pow4f );
 }
 
@@ -605,7 +613,7 @@ static float g_ex2_storage[4 + 3];
 static void
 ex24f( void )
 {
-   float *store = (float *) ALIGN16( (unsigned) g_ex2_storage );
+   float *store = (float *) tgsi_align_128bit( g_ex2_storage );
 
 #ifdef WIN32
    store[0] = (float) pow( 2.0, (double) store[0] );
@@ -628,7 +636,7 @@ emit_ex2(
    emit_func_call1(
       func,
       xmm_dst,
-      ALIGN16( (unsigned) g_ex2_storage ),
+      p2u( tgsi_align_128bit( g_ex2_storage ) ),
       ex24f );
 }
 
@@ -638,7 +646,7 @@ static float g_lg2_storage[4 + 3];
 static void
 lg24f( void )
 {
-   float *store = (float *) ALIGN16( (unsigned) g_lg2_storage );
+   float *store = (float *) tgsi_align_128bit( g_lg2_storage );
 
    store[0] = LOG2( store[0] );
    store[1] = LOG2( store[1] );
@@ -654,7 +662,7 @@ emit_lg2(
    emit_func_call1(
       func,
       xmm_dst,
-      ALIGN16( (unsigned) g_lg2_storage ),
+      p2u( tgsi_align_128bit( g_lg2_storage ) ),
       lg24f );
 }
 
@@ -664,7 +672,7 @@ static float g_flr_storage[4 + 3];
 static void
 flr4f( void )
 {
-   float *store = (float *) ALIGN16( (unsigned) g_flr_storage );
+   float *store = (float *) tgsi_align_128bit( g_flr_storage );
 
    store[0] = (float) floor( (double) store[0] );
    store[1] = (float) floor( (double) store[1] );
@@ -680,7 +688,7 @@ emit_flr(
    emit_func_call1(
       func,
       xmm_dst,
-      ALIGN16( (unsigned) g_flr_storage ),
+      p2u( tgsi_align_128bit( g_flr_storage ) ),
       flr4f );
 }
 
@@ -690,7 +698,7 @@ static float g_frc_storage[4 + 3];
 static void
 frc4f( void )
 {
-   float *store = (float *) ALIGN16( (unsigned) g_frc_storage );
+   float *store = (float *) tgsi_align_128bit( g_frc_storage );
 
    store[0] -= (float) floor( (double) store[0] );
    store[1] -= (float) floor( (double) store[1] );
@@ -706,7 +714,7 @@ emit_frc(
    emit_func_call1(
       func,
       xmm_dst,
-      ALIGN16( (unsigned) g_frc_storage ),
+      p2u( tgsi_align_128bit( g_frc_storage ) ),
       frc4f );
 }
 
@@ -1547,7 +1555,14 @@ emit_instruction(
       break;
 
    case TGSI_OPCODE_TEX:
-      assert( 0 );
+      emit_tempf(
+         func,
+         0,
+         TGSI_EXEC_TEMP_ONE_I,
+         TGSI_EXEC_TEMP_ONE_C );
+      FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) {
+         STORE( func, *inst, 0, 0, chan_index );
+      }
       break;
 
    case TGSI_OPCODE_TXD:
@@ -1747,10 +1762,6 @@ emit_instruction(
       assert( 0 );
       break;
 
-   case TGSI_OPCODE_END:
-      /* nothing */
-      break;
-
    default:
       assert( 0 );
    }
@@ -1828,7 +1839,7 @@ emit_declaration(
 
 unsigned
 tgsi_emit_sse2(
-   const struct tgsi_token *tokens,
+   struct tgsi_token *tokens,
    struct x86_function *func )
 {
    struct tgsi_parse_context parse;
@@ -1893,7 +1904,7 @@ tgsi_emit_sse2(
  */
 unsigned
 tgsi_emit_sse2_fs(
-   const struct tgsi_token *tokens,
+   struct tgsi_token *tokens,
    struct x86_function *func )
 {
    struct tgsi_parse_context parse;
@@ -1960,5 +1971,3 @@ tgsi_emit_sse2_fs(
 
    return 1;
 }
-
-#endif
index 60fdd5f..9bee371 100755 (executable)
@@ -10,12 +10,12 @@ struct x86_function;
 
 unsigned
 tgsi_emit_sse2(
-   const struct tgsi_token *tokens,
+   struct tgsi_token *tokens,
    struct x86_function *function );
 
 unsigned
 tgsi_emit_sse2_fs(
-   const struct tgsi_token *tokens,
+   struct tgsi_token *tokens,
    struct x86_function *function );
 
 #if defined __cplusplus