2009-02-20 Rodrigo Kumpera <rkumpera@novell.com>
authorRodrigo Kumpera <kumpera@gmail.com>
Fri, 20 Feb 2009 19:52:35 +0000 (19:52 -0000)
committerRodrigo Kumpera <kumpera@gmail.com>
Fri, 20 Feb 2009 19:52:35 +0000 (19:52 -0000)
Extracted from a patch by Kornél Pál <kornelpal@gmail.com>.

* mini-x86.c (mono_arch_output_basic_block): Adjust precision of int to float
conversion to 32 bits.

* cpu-x86.md: Increase the size of int_conv_to_r4.

* basic-float.cs: Add a test for this.

Fixed part of #467201.

svn path=/trunk/mono/; revision=127560

mono/mini/ChangeLog
mono/mini/basic-float.cs
mono/mini/cpu-x86.md
mono/mini/mini-x86.c

index 95fb02449825da1677a6e66462419e5316e218ab..7dd40be5a5fe3862710e5055d51aacc76c0f2658 100644 (file)
@@ -2,7 +2,20 @@
 
        Extracted from a patch by Kornél Pál <kornelpal@gmail.com>.
 
-       * mini-x86.c (emono_arch_output_basic_block): Adjust precision of long to double
+       * mini-x86.c (mono_arch_output_basic_block): Adjust precision of int to float
+       conversion to 32 bits.
+
+       * cpu-x86.md: Increase the size of int_conv_to_r4.
+
+       * basic-float.cs: Add a test for this.
+
+       Fixed part of #467201.
+
+2009-02-20 Rodrigo Kumpera  <rkumpera@novell.com>
+
+       Extracted from a patch by Kornél Pál <kornelpal@gmail.com>.
+
+       * mini-x86.c (mono_arch_output_basic_block): Adjust precision of long to double
        conversion to 64 bits.
 
        * basic-float.cs: Add a test for this.
index 47aa26da2eb6f3003f85235606607a6e1cee4080..4e69077f27a52a9b4aed0deb3cabc87cdd8524fe 100644 (file)
@@ -617,5 +617,15 @@ class Tests {
                return 0;
     }
 
+       static int INT_VAL = 0x13456799;
+
+       static int test_0_int4_to_float_convertion ()
+    {
+               double d = (double)(float)INT_VAL;
+
+               if (d != 323315616)
+                       return 1;
+               return 0;
+       }
 }
 
index fa8aaeeb97846a1a2ce35236da8a96503156fbe6..69872360ea5a44d5947c63509d350966553e3049 100644 (file)
@@ -96,7 +96,7 @@ int_not: dest:i src1:i len:2 clob:1
 int_conv_to_i1: dest:i src1:y len:3
 int_conv_to_i2: dest:i src1:i len:3
 int_conv_to_i4: dest:i src1:i len:2
-int_conv_to_r4: dest:f src1:i len:7
+int_conv_to_r4: dest:f src1:i len:13
 int_conv_to_r8: dest:f src1:i len:7
 int_conv_to_u4: dest:i src1:i
 int_conv_to_u2: dest:i src1:i len:3
index 53677ec9ce0201f9a1e3cd35837131c387c2362f..d8d7d16de60c5db764b07a246e6ac9083630d0eb 100644 (file)
@@ -3010,7 +3010,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_LOADR4_MEMBASE:
                        x86_fld_membase (code, ins->inst_basereg, ins->inst_offset, FALSE);
                        break;
-               case OP_ICONV_TO_R4: /* FIXME: change precision */
+               case OP_ICONV_TO_R4:
+                       x86_push_reg (code, ins->sreg1);
+                       x86_fild_membase (code, X86_ESP, 0, FALSE);
+                       /* Change precision */
+                       x86_fst_membase (code, X86_ESP, 0, FALSE, TRUE);
+                       x86_fld_membase (code, X86_ESP, 0, FALSE);
+                       x86_alu_reg_imm (code, X86_ADD, X86_ESP, 4);
+                       break;
                case OP_ICONV_TO_R8:
                        x86_push_reg (code, ins->sreg1);
                        x86_fild_membase (code, X86_ESP, 0, FALSE);