summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Krol <michal@tungstengraphics.com>2008-11-26 12:56:23 +0100
committerMichal Krol <michal@tungstengraphics.com>2008-11-26 17:15:36 +0100
commit972922b1bf28346568bedfadc2198ed93230f5d7 (patch)
tree6270f5f00fed1a3266fe0870dff854c048f026f1
parent1347439a87a26f261ab07c914ea4e69965703ee2 (diff)
tgsi: Implement OPCODE_ROUND for SSE2 backend.
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_sse2.c29
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 499d865542..31480c40da 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: