@@ -185,6 +185,7 @@ void dppc_interpreter::ppc_fadd() {
185185 ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
186186 }
187187 }
188+
188189 if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
189190 ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
190191 }
@@ -254,6 +255,10 @@ void dppc_interpreter::ppc_fdiv() {
254255 }
255256 }
256257
258+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
259+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
260+ }
261+
257262 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
258263 fpresult_update (ppc_dblresult64_d);
259264
@@ -280,6 +285,10 @@ void dppc_interpreter::ppc_fmul() {
280285 }
281286 }
282287
288+ if (std::isnan (val_reg_a) || std::isnan (val_reg_c)) {
289+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
290+ }
291+
283292 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
284293 fpresult_update (ppc_dblresult64_d);
285294
@@ -301,8 +310,13 @@ void dppc_interpreter::ppc_fmadd() {
301310 double ppc_dblresult64_d = std::fma (val_reg_a, val_reg_c, val_reg_b);
302311
303312 double inf = std::numeric_limits<double >::infinity ();
304- if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf)))
313+ if (((val_reg_a == inf) && (val_reg_b == -inf)) || \
314+ ((val_reg_a == -inf) && (val_reg_b == inf))) {
305315 ppc_state.fpscr |= VXISI;
316+ if (std::isnan (ppc_dblresult64_d)) {
317+ ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
318+ }
319+ }
306320
307321 if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
308322 (std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
@@ -312,6 +326,10 @@ void dppc_interpreter::ppc_fmadd() {
312326 }
313327 }
314328
329+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b) || std::isnan (val_reg_c)) {
330+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
331+ }
332+
315333 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
316334 fpresult_update (ppc_dblresult64_d);
317335
@@ -348,6 +366,10 @@ void dppc_interpreter::ppc_fmsub() {
348366 }
349367 }
350368
369+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b) || std::isnan (val_reg_c)) {
370+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
371+ }
372+
351373 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
352374 fpresult_update (ppc_dblresult64_d);
353375
@@ -387,6 +409,10 @@ void dppc_interpreter::ppc_fnmadd() {
387409 }
388410 }
389411
412+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b) || std::isnan (val_reg_c)) {
413+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
414+ }
415+
390416 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
391417 fpresult_update (ppc_dblresult64_d);
392418
@@ -423,6 +449,10 @@ void dppc_interpreter::ppc_fnmsub() {
423449 }
424450 }
425451
452+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b) || std::isnan (val_reg_c)) {
453+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
454+ }
455+
426456 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
427457 fpresult_update (ppc_dblresult64_d);
428458
@@ -438,6 +468,7 @@ void dppc_interpreter::ppc_fadds() {
438468 ppc_grab_regsfpdab (ppc_cur_instruction);
439469
440470 snan_double_check (reg_a, reg_b);
471+ max_double_check (val_reg_a, val_reg_b);
441472
442473 double ppc_dblresult64_d = (float )(val_reg_a + val_reg_b);
443474
@@ -449,6 +480,10 @@ void dppc_interpreter::ppc_fadds() {
449480 }
450481 }
451482
483+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
484+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
485+ }
486+
452487 ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
453488 fpresult_update (ppc_dblresult64_d);
454489
@@ -512,6 +547,10 @@ void dppc_interpreter::ppc_fdivs() {
512547 }
513548 }
514549
550+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
551+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
552+ }
553+
515554 ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
516555 fpresult_update (ppc_dblresult64_d);
517556
@@ -538,6 +577,10 @@ void dppc_interpreter::ppc_fmuls() {
538577 }
539578 }
540579
580+ if (std::isnan (val_reg_a) || std::isnan (val_reg_c)) {
581+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
582+ }
583+
541584 ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
542585 fpresult_update (ppc_dblresult64_d);
543586
@@ -570,9 +613,9 @@ void dppc_interpreter::ppc_fmadds() {
570613 }
571614 }
572615
573- if (std::isnan (val_reg_b)) {
616+ if (std::isnan (val_reg_a) || std::isnan ( val_reg_b) || std::isnan (val_reg_c )) {
574617 ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
575- }
618+ }
576619
577620 ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
578621 fpresult_update (ppc_dblresult64_d);
@@ -593,9 +636,6 @@ void dppc_interpreter::ppc_fmsubs() {
593636
594637
595638 double ppc_dblresult64_d = (float )std::fma (val_reg_a, val_reg_c, -val_reg_b);
596- if (std::isnan (ppc_dblresult64_d)) {
597- ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
598- }
599639
600640 if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
601641 (std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
@@ -609,6 +649,10 @@ void dppc_interpreter::ppc_fmsubs() {
609649 if ((val_reg_a == inf) && (val_reg_b == inf))
610650 ppc_state.fpscr |= VXISI;
611651
652+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b) || std::isnan (val_reg_c)) {
653+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
654+ }
655+
612656 ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
613657 fpresult_update (ppc_dblresult64_d);
614658
@@ -643,6 +687,10 @@ void dppc_interpreter::ppc_fnmadds() {
643687 }
644688 }
645689
690+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b) || std::isnan (val_reg_c)) {
691+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
692+ }
693+
646694 ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
647695 fpresult_update (ppc_dblresult64_d);
648696
@@ -674,6 +722,10 @@ void dppc_interpreter::ppc_fnmsubs() {
674722 if ((val_reg_a == inf) && (val_reg_b == inf))
675723 ppc_state.fpscr |= VXISI;
676724
725+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b) || std::isnan (val_reg_c)) {
726+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
727+ }
728+
677729 ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
678730 fpresult_update (ppc_dblresult64_d);
679731
@@ -692,6 +744,10 @@ void dppc_interpreter::ppc_fabs() {
692744
693745 double ppc_dblresult64_d = abs (GET_FPR (reg_b));
694746
747+ if (std::isnan (GET_FPR (reg_b))) {
748+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
749+ }
750+
695751 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
696752
697753 if (rec)
@@ -710,6 +766,10 @@ void dppc_interpreter::ppc_fnabs() {
710766 double ppc_dblresult64_d = abs (GET_FPR (reg_b));
711767 ppc_dblresult64_d = -ppc_dblresult64_d;
712768
769+ if (std::isnan (GET_FPR (reg_b))) {
770+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
771+ }
772+
713773 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
714774
715775 if (rec)
@@ -727,6 +787,10 @@ void dppc_interpreter::ppc_fneg() {
727787
728788 double ppc_dblresult64_d = -(GET_FPR (reg_b));
729789
790+ if (std::isnan (GET_FPR (reg_b))) {
791+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
792+ }
793+
730794 ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
731795
732796 if (rec)
0 commit comments