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