Fix OP_LCONV_TO_R_UN_2 on x86+aot. Fixes #9186.
authorZoltan Varga <vargaz@gmail.com>
Thu, 3 Jan 2013 17:53:29 +0000 (18:53 +0100)
committerZoltan Varga <vargaz@gmail.com>
Thu, 3 Jan 2013 17:53:44 +0000 (18:53 +0100)
mono/mini/basic-float.cs
mono/mini/cpu-x86.md
mono/mini/mini-x86.c

index 96f1ef5f317996fc5b84a5e91c57331616bd99fb..df8f6666f0d4b2c3144cd7730a74f52a09851393 100644 (file)
@@ -207,6 +207,10 @@ class Tests {
                ulong b = (ulong)d;
                if (b != 1000)
                        return 0;
+               a = 0xffffffffffffffff;
+               float f = (float)a;
+               if (!(f > 0f))
+                       return 1;
                return 4;
        }
 
index e77cc4d78133c707c8d00f2b3090bb03ffa8a405..ff241b62ed3e58529aa78f5d9d9626b2ce85b31b 100644 (file)
@@ -379,7 +379,7 @@ cmov_ilt_un: dest:i src1:i src2:i len:16 clob:1
 long_conv_to_ovf_i4_2: dest:i src1:i src2:i len:30
 long_conv_to_r8_2: dest:f src1:i src2:i len:14 
 long_conv_to_r4_2: dest:f src1:i src2:i len:14
-long_conv_to_r_un_2: dest:f src1:i src2:i len:26 
+long_conv_to_r_un_2: dest:f src1:i src2:i len:40
 
 fmove: dest:f src1:f
 float_conv_to_r4: dest:f src1:f  len:12
index 766121678464e4c1be18501fe75d2da5e37b14bf..110671e3051c0385c8d3ed5072abbccf58d5a716 100644 (file)
@@ -3640,7 +3640,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        br = code; x86_branch8 (code, X86_CC_GEZ, 0, TRUE);
        
                        /* add correction constant mn */
-                       x86_fld80_mem (code, mn);
+                       if (cfg->compile_aot) {
+                               x86_push_imm (code, (((guint32)mn [9]) << 24) | ((guint32)mn [8] << 16) | ((guint32)mn [7] << 8) | ((guint32)mn [6]));
+                               x86_push_imm (code, (((guint32)mn [5]) << 24) | ((guint32)mn [4] << 16) | ((guint32)mn [3] << 8) | ((guint32)mn [2]));
+                               x86_push_imm (code, (((guint32)mn [1]) << 24) | ((guint32)mn [0] << 16));
+                               x86_fld80_membase (code, X86_ESP, 2);
+                               x86_alu_reg_imm (code, X86_ADD, X86_ESP, 12);
+                       } else {
+                               x86_fld80_mem (code, mn);
+                       }
                        x86_fp_op_reg (code, X86_FADD, 1, TRUE);
 
                        x86_patch (br, code);