diff libinterp/interp-core/pt-jit.cc @ 15583:0754bdfbc8fe

Correct multiplication complex multiplication with NaN in JIT * jit-typeinfo.cc (jit_function::call): Remove dead code. (jit_typeinfo::jit_typeinfo): Fix complex multiplication. (jit_typeinfo::do_type_of): Do not treat complex numbers with 0 imag as complex. * pt-jit.cc (jit_convert::visit_constant): Use jit_typeinfo::type_of.
author Max Brister <max@2bass.com>
date Fri, 02 Nov 2012 16:52:56 -0600
parents 52df2e7baabe
children 6fc163b59746
line wrap: on
line diff
--- a/libinterp/interp-core/pt-jit.cc	Fri Nov 02 14:32:22 2012 -0600
+++ b/libinterp/interp-core/pt-jit.cc	Fri Nov 02 16:52:56 2012 -0600
@@ -571,17 +571,19 @@
 jit_convert::visit_constant (tree_constant& tc)
 {
   octave_value v = tc.rvalue1 ();
-  if (v.is_real_scalar () && v.is_double_type () && ! v.is_complex_type ())
+  jit_type *ty = jit_typeinfo::type_of (v);
+
+  if (ty == jit_typeinfo::get_scalar ())
     {
       double dv = v.double_value ();
       result = factory.create<jit_const_scalar> (dv);
     }
-  else if (v.is_range ())
+  else if (ty == jit_typeinfo::get_range ())
     {
       Range rv = v.range_value ();
       result = factory.create<jit_const_range> (rv);
     }
-  else if (v.is_complex_scalar ())
+  else if (ty == jit_typeinfo::get_complex ())
     {
       Complex cv = v.complex_value ();
       result = factory.create<jit_const_complex> (cv);
@@ -2254,6 +2256,35 @@
 %! assert (abs (result - 1/9) < 1e-5);
 
 %!test
+%! temp = 1+1i;
+%! nan = NaN;
+%! while 1
+%!   temp = temp - 1i;
+%!   temp = temp * nan;
+%!   break;
+%! endwhile
+%! assert (imag (temp), 0);
+
+%!test
+%! temp = 1+1i;
+%! nan = NaN+1i;
+%! while 1
+%!   nan = nan - 1i;
+%!   temp = temp - 1i;
+%!   temp = temp * nan;
+%!   break;
+%! endwhile
+%! assert (imag (temp), 0);
+
+%!test
+%! temp = 1+1i;
+%! while 1
+%!   temp = temp * 5;
+%!   break;
+%! endwhile
+%! assert (temp, 5+5i);
+
+%!test
 %! nr = 1001;
 %! mat = zeros (1, nr);
 %! for i = 1:nr