This one took most of the weekend to track down.  Attached is a test-case.

The cast to float doesn't seem to be necessary, but I haven't run 
regression tests so it might be possible this one breaks things.

Vince

# HG changeset patch
# User Vince Weaver <[email protected]>
# Date 1257722640 18000
# Node ID 83559f926d629056a408ebdcd5a591340fc2b8ea
# Parent  fb4a3a61bc745c49975c552927ae9a35405f02dd
X86: Remove double-cast in Cvtf2i micro-op

This double cast led to rounding errors which caused
some benchmarks to get the wrong values, most notably lucas
from spec2k which failed spectacularly when CVTTSD2SI
returned an off-by-one value.

diff -r fb4a3a61bc74 -r 83559f926d62 src/arch/x86/isa/microops/mediaop.isa
--- a/src/arch/x86/isa/microops/mediaop.isa     Wed Nov 04 13:22:15 2009 -0500
+++ b/src/arch/x86/isa/microops/mediaop.isa     Sun Nov 08 18:24:00 2009 -0500
@@ -1237,7 +1237,7 @@
                 }
 
                 if (destSize == 4) {
-                    argBits = (uint32_t)(float)arg;
+                    argBits = (uint32_t)arg;
                 } else {
                     argBits = (uint64_t)arg;
                 }

Attachment: lucas_problem
Description: Binary data

_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to