[Mono-bugs] [Bug 79087][Wis] New - Right shift of UInt64 incorrect for certain values

bugzilla-daemon at bugzilla.ximian.com bugzilla-daemon at bugzilla.ximian.com
Wed Aug 16 14:54:01 EDT 2006


Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by peter.dettman at iinet.net.au.

http://bugzilla.ximian.com/show_bug.cgi?id=79087

--- shadow/79087	2006-08-16 14:54:01.000000000 -0400
+++ shadow/79087.tmp.17356	2006-08-16 14:54:01.000000000 -0400
@@ -0,0 +1,83 @@
+Bug#: 79087
+Product: Mono: Runtime
+Version: 1.1
+OS: GNU/Linux [Other]
+OS Details: Ubuntu 6.06
+Status: NEW   
+Resolution: 
+Severity: 
+Priority: Wishlist
+Component: JIT
+AssignedTo: lupus at ximian.com                            
+ReportedBy: peter.dettman at iinet.net.au               
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL: 
+Cc: 
+Summary: Right shift of UInt64 incorrect for certain values
+
+Description of Problem:
+
+Attempting to right shift by 32 bits any UInt64 value with
+most-significant-bit set (e.g. ulong.MaxValue in C#).
+
+Problem does NOT occur if the shift size of 32 is known at compile-time, as
+the code generation seems to be handled differently in that case.
+
+I have confirmed this against very recent SVN source (63800).
+
+Here is a short C# program that can reproduce the problem;
+
+---- ShortTest.cs ----
+using System;
+namespace ShortTest
+{
+    class MainClass
+    {
+        public static void Main(string[] args)
+        {
+            ulong ur = ulong.Parse(args[0],
+System.Globalization.NumberStyles.HexNumber);
+	    int shift = int.Parse(args[1]);
+	    Console.WriteLine((ur >> shift).ToString("X"));
+        }
+    }
+}
+----------------------
+
+To reproduce the bug, try e.g.;
+
+    > mcs ShortTest.cs
+    > mono ShortTest.exe ffffffffffffffff 32
+
+Actual Results:
+
+The above example prints the answer 1FFFFFFFF
+
+Expected Results:
+
+The answer should be FFFFFFFF
+
+How often does this happen? 
+
+Consistently for UInt64 with most-significant-bit set, right shift of 32
+(dynamically determined)
+
+
+Additional Information:
+
+I include a patch to mini-x86.c which seems like a fix to me;
+
+Index: mini-x86.c
+===================================================================
+--- mini-x86.c	(revision 63800)
++++ mini-x86.c	(working copy)
+@@ -2053,7 +2053,7 @@
+ 
+ 			/* handle shifts over 31 bits */
+ 			x86_mov_reg_reg (code, ins->sreg1, ins->unused, 4);
+-			x86_shift_reg_imm (code, X86_SHR, ins->unused, 31);
++			x86_clear_reg (code, ins->unused);
+ 			
+ 			x86_patch (jump_to_end, code);
+ 			}


More information about the mono-bugs mailing list