diff options
author | Michal Krol <[email protected]> | 2008-11-26 12:56:23 +0100 |
---|---|---|
committer | Michal Krol <[email protected]> | 2008-11-26 17:15:36 +0100 |
commit | 972922b1bf28346568bedfadc2198ed93230f5d7 (patch) | |
tree | 6270f5f00fed1a3266fe0870dff854c048f026f1 | |
parent | 1347439a87a26f261ab07c914ea4e69965703ee2 (diff) |
tgsi: Implement OPCODE_ROUND for SSE2 backend.
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_sse2.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_sse2.c b/src/gallium/auxiliary/tgsi/tgsi_sse2.c index 499d8655421..31480c40da0 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_sse2.c +++ b/src/gallium/auxiliary/tgsi/tgsi_sse2.c @@ -842,6 +842,29 @@ emit_rcp ( make_xmm( xmm_src ) ); } +static void PIPE_CDECL +rnd4f( + float *store ) +{ + store[0] = floorf( store[0] + 0.5f ); + store[1] = floorf( store[1] + 0.5f ); + store[2] = floorf( store[2] + 0.5f ); + store[3] = floorf( store[3] + 0.5f ); +} + +static void +emit_rnd( + struct x86_function *func, + unsigned xmm_save, + unsigned xmm_dst ) +{ + emit_func_call_dst( + func, + xmm_save, + xmm_dst, + rnd4f ); +} + static void emit_rsqrt( struct x86_function *func, @@ -1662,7 +1685,11 @@ emit_instruction( break; case TGSI_OPCODE_ROUND: - return 0; + FOR_EACH_DST0_ENABLED_CHANNEL( *inst, chan_index ) { + FETCH( func, *inst, 0, 0, chan_index ); + emit_rnd( func, 0, 0 ); + STORE( func, *inst, 0, 0, chan_index ); + } break; case TGSI_OPCODE_EXPBASE2: |