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