2005-10-08 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Sat, 8 Oct 2005 19:32:12 +0000 (19:32 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sat, 8 Oct 2005 19:32:12 +0000 (19:32 -0000)
* basic-float.cs: Add test for precision of float arithmetic.

* mini-ia64.c (mono_arch_output_basic_block): Convert to/from doubles
when loading/storing single values from/to memory.

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

mono/mini/ChangeLog
mono/mini/basic-float.cs
mono/mini/mini-ia64.c

index f66a67c8dd6f2e5d8139709f37ad15625711f14a..cb8ca8a137d83d8c72a4546f73e3f04246e37fe2 100644 (file)
@@ -1,5 +1,10 @@
 2005-10-08  Zoltan Varga  <vargaz@gmail.com>
 
+       * basic-float.cs: Add test for precision of float arithmetic.
+
+       * mini-ia64.c (mono_arch_output_basic_block): Convert to/from doubles
+       when loading/storing single values from/to memory.
+
        * mini.c (mono_jit_compile_method_with_opt): Create the function
        pointers in the correct domain.
 
index 6dadc5aaef0141211a6f8557ee50e3a5d8468c09..9eb81b6be5b0b3365c38f125e1cc0d613860e4ee 100644 (file)
@@ -534,5 +534,13 @@ class Tests {
                return result;
        }
 
+       static int test_0_float_precision () {
+               float f1 = 3.40282346638528859E+38f;
+               float f2 = 3.40282346638528859E+38f;            
+               float PositiveInfinity =  1.0f / 0.0f;
+               float f = f1 + f2;
+
+               return f == PositiveInfinity ? 0 : 1;
+       }
 }
 
index 98d2114e0e94968ffaabe8c82306873c8f87b209..ff1979ff2bfc3d892a48aeb679b44e4b5d3e2310 100644 (file)
@@ -2801,13 +2801,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        ia64_stfd_hint (code, ins->inst_destbasereg, ins->sreg1, 0);
                        break;
                case OP_STORER4_MEMBASE_REG:
-                       ia64_stfs_hint (code, ins->inst_destbasereg, ins->sreg1, 0);
+                       ia64_fnorm_s_sf (code, FP_SCRATCH_REG, ins->sreg1, 0);
+                       ia64_stfs_hint (code, ins->inst_destbasereg, FP_SCRATCH_REG, 0);
                        break;
                case OP_LOADR8_MEMBASE:
                        ia64_ldfd (code, ins->dreg, ins->inst_basereg);
                        break;
                case OP_LOADR4_MEMBASE:
                        ia64_ldfs (code, ins->dreg, ins->inst_basereg);
+                       ia64_fnorm_d_sf (code, ins->dreg, ins->dreg, 0);
                        break;
                case CEE_CONV_R4:
                        ia64_setf_sig (code, ins->dreg, ins->sreg1);