Mercurial > octave-nkf
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