Author: zoltan
Date: 2007-01-25 09:44:45 -0500 (Thu, 25 Jan 2007)
New Revision: 71666

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/iltests.il
   trunk/mono/mono/mini/mini-amd64.c
Log:
2007-01-25  Zoltan Varga  <[EMAIL PROTECTED]>

        * mini-amd64.c (mono_arch_output_basic_block): Fix #80507 for amd64.

        * iltests.il: Add new test for bug #80507.


Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2007-01-25 13:15:08 UTC (rev 71665)
+++ trunk/mono/mono/mini/ChangeLog      2007-01-25 14:44:45 UTC (rev 71666)
@@ -1,4 +1,9 @@
+2007-01-25  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * mini-amd64.c (mono_arch_output_basic_block): Fix #80507 for amd64.
+
+       * iltests.il: Add new test for bug #80507.
+
 Wed Jan 24 19:10:28 CET 2007 Paolo Molaro <[EMAIL PROTECTED]>
 
        * mini-arm.h: use soft-float also on vfp for now.

Modified: trunk/mono/mono/mini/iltests.il
===================================================================
--- trunk/mono/mono/mini/iltests.il     2007-01-25 13:15:08 UTC (rev 71665)
+++ trunk/mono/mono/mini/iltests.il     2007-01-25 14:44:45 UTC (rev 71666)
@@ -1124,4 +1124,72 @@
                ldc.i4.0
         ret
     }
+
+       // This belongs to basic-float.cs, but its hard to tell mcs/csc to
+       // generate the non .un version of the opcodes
+    .method private static  hidebysig 
+           default int32 test_4_float_branch_nan ()  cil managed 
+    {
+        // Method begins at RVA 0x27a4
+       // Code size 74 (0x4a)
+       .maxstack 2
+       .locals init (
+               float64 V_0,
+               float64 V_1,
+               int32   V_2)
+       IL_0000:  ldc.r8 (00 00 00 00 00 00 f8 ff)
+       IL_0009:  stloc.0 
+       IL_000a:  ldc.r8 1.
+       IL_0013:  stloc.1 
+       IL_0014:  ldc.i4.0 
+       IL_0015:  stloc.2 
+       IL_0016:  ldloc.0 
+       IL_0017:  ldloc.1 
+       IL_0018:  bge.s IL_001a
+
+                               br L1
+       IL_001a:  ldloc.2 
+       IL_001b:  ret 
+       L1:
+       IL_001c:  ldloc.2 
+       IL_001d:  ldc.i4.1 
+       IL_001e:  add 
+       IL_001f:  stloc.2 
+       IL_0020:  ldloc.0 
+       IL_0021:  ldloc.1 
+       IL_0022:  ble.s IL_002e
+                               br L2
+       IL_002e:  ldloc.2 
+       IL_002f:  ret 
+       L2:
+       IL_0030:  ldloc.2 
+       IL_0031:  ldc.i4.1 
+       IL_0032:  add 
+       IL_0033:  stloc.2 
+       IL_0034:  ldloc.0 
+       IL_0035:  ldloc.1 
+       IL_0036:  blt.s IL_0038
+                               br L3           
+       IL_0038:  ldloc.2 
+       IL_0039:  ret 
+       L3:
+       IL_003a:  ldloc.2 
+       IL_003b:  ldc.i4.1 
+       IL_003c:  add 
+       IL_003d:  stloc.2 
+       IL_003e:  ldloc.0 
+       IL_003f:  ldloc.1 
+       IL_0040:  bgt.s IL_0042
+                               br L4
+       IL_0042:  ldloc.2 
+       IL_0043:  ret 
+       L4:
+       IL_0044:  ldloc.2 
+       IL_0045:  ldc.i4.1 
+       IL_0046:  add 
+       IL_0047:  stloc.2 
+       IL_0048:  ldloc.2 
+       IL_0049:  ret 
+    } // end of method Tests::test_5_float_branch_nan
+
 }

Modified: trunk/mono/mono/mini/mini-amd64.c
===================================================================
--- trunk/mono/mono/mini/mini-amd64.c   2007-01-25 13:15:08 UTC (rev 71665)
+++ trunk/mono/mono/mini/mini-amd64.c   2007-01-25 14:44:45 UTC (rev 71666)
@@ -3743,7 +3743,19 @@
                case OP_FBGT:
                case OP_FBGT_UN:
                        if (use_sse2 || (cfg->opt & MONO_OPT_FCMOV)) {
-                               EMIT_COND_BRANCH (ins, X86_CC_LT, FALSE);
+                               if (ins->opcode == OP_FBGT) {
+                                       guchar *br1;
+
+                                       /* skip branch if C1=1 */
+                                       br1 = code;
+                                       x86_branch8 (code, X86_CC_P, 0, FALSE);
+                                       /* branch if (C0 | C3) = 1 */
+                                       EMIT_COND_BRANCH (ins, X86_CC_LT, 
FALSE);
+                                       amd64_patch (br1, code);
+                                       break;
+                               } else {
+                                       EMIT_COND_BRANCH (ins, X86_CC_LT, 
FALSE);
+                               }
                                break;
                        }
                        amd64_alu_reg_imm (code, X86_CMP, AMD64_RAX, X86_FP_C0);

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to