comparison 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
comparison
equal deleted inserted replaced
15582:52df2e7baabe 15583:0754bdfbc8fe
569 569
570 void 570 void
571 jit_convert::visit_constant (tree_constant& tc) 571 jit_convert::visit_constant (tree_constant& tc)
572 { 572 {
573 octave_value v = tc.rvalue1 (); 573 octave_value v = tc.rvalue1 ();
574 if (v.is_real_scalar () && v.is_double_type () && ! v.is_complex_type ()) 574 jit_type *ty = jit_typeinfo::type_of (v);
575
576 if (ty == jit_typeinfo::get_scalar ())
575 { 577 {
576 double dv = v.double_value (); 578 double dv = v.double_value ();
577 result = factory.create<jit_const_scalar> (dv); 579 result = factory.create<jit_const_scalar> (dv);
578 } 580 }
579 else if (v.is_range ()) 581 else if (ty == jit_typeinfo::get_range ())
580 { 582 {
581 Range rv = v.range_value (); 583 Range rv = v.range_value ();
582 result = factory.create<jit_const_range> (rv); 584 result = factory.create<jit_const_range> (rv);
583 } 585 }
584 else if (v.is_complex_scalar ()) 586 else if (ty == jit_typeinfo::get_complex ())
585 { 587 {
586 Complex cv = v.complex_value (); 588 Complex cv = v.complex_value ();
587 result = factory.create<jit_const_complex> (cv); 589 result = factory.create<jit_const_complex> (cv);
588 } 590 }
589 else 591 else
2250 %! for ii = 0:inc:1 2252 %! for ii = 0:inc:1
2251 %! # the ^ operator's result is complex 2253 %! # the ^ operator's result is complex
2252 %! result = result + inc * (1/3 * ii ^ 2); 2254 %! result = result + inc * (1/3 * ii ^ 2);
2253 %! endfor 2255 %! endfor
2254 %! assert (abs (result - 1/9) < 1e-5); 2256 %! assert (abs (result - 1/9) < 1e-5);
2257
2258 %!test
2259 %! temp = 1+1i;
2260 %! nan = NaN;
2261 %! while 1
2262 %! temp = temp - 1i;
2263 %! temp = temp * nan;
2264 %! break;
2265 %! endwhile
2266 %! assert (imag (temp), 0);
2267
2268 %!test
2269 %! temp = 1+1i;
2270 %! nan = NaN+1i;
2271 %! while 1
2272 %! nan = nan - 1i;
2273 %! temp = temp - 1i;
2274 %! temp = temp * nan;
2275 %! break;
2276 %! endwhile
2277 %! assert (imag (temp), 0);
2278
2279 %!test
2280 %! temp = 1+1i;
2281 %! while 1
2282 %! temp = temp * 5;
2283 %! break;
2284 %! endwhile
2285 %! assert (temp, 5+5i);
2255 2286
2256 %!test 2287 %!test
2257 %! nr = 1001; 2288 %! nr = 1001;
2258 %! mat = zeros (1, nr); 2289 %! mat = zeros (1, nr);
2259 %! for i = 1:nr 2290 %! for i = 1:nr