@@ -185,6 +185,7 @@ void dppc_interpreter::ppc_fadd() {
185
185
ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
186
186
}
187
187
}
188
+
188
189
if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
189
190
ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
190
191
}
@@ -254,6 +255,10 @@ void dppc_interpreter::ppc_fdiv() {
254
255
}
255
256
}
256
257
258
+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
259
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
260
+ }
261
+
257
262
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
258
263
fpresult_update (ppc_dblresult64_d);
259
264
@@ -280,6 +285,10 @@ void dppc_interpreter::ppc_fmul() {
280
285
}
281
286
}
282
287
288
+ if (std::isnan (val_reg_a) || std::isnan (val_reg_c)) {
289
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
290
+ }
291
+
283
292
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
284
293
fpresult_update (ppc_dblresult64_d);
285
294
@@ -301,8 +310,13 @@ void dppc_interpreter::ppc_fmadd() {
301
310
double ppc_dblresult64_d = std::fma (val_reg_a, val_reg_c, val_reg_b);
302
311
303
312
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))) {
305
315
ppc_state.fpscr |= VXISI;
316
+ if (std::isnan (ppc_dblresult64_d)) {
317
+ ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
318
+ }
319
+ }
306
320
307
321
if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
308
322
(std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
@@ -312,6 +326,10 @@ void dppc_interpreter::ppc_fmadd() {
312
326
}
313
327
}
314
328
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
+
315
333
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
316
334
fpresult_update (ppc_dblresult64_d);
317
335
@@ -348,6 +366,10 @@ void dppc_interpreter::ppc_fmsub() {
348
366
}
349
367
}
350
368
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
+
351
373
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
352
374
fpresult_update (ppc_dblresult64_d);
353
375
@@ -387,6 +409,10 @@ void dppc_interpreter::ppc_fnmadd() {
387
409
}
388
410
}
389
411
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
+
390
416
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
391
417
fpresult_update (ppc_dblresult64_d);
392
418
@@ -423,6 +449,10 @@ void dppc_interpreter::ppc_fnmsub() {
423
449
}
424
450
}
425
451
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
+
426
456
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
427
457
fpresult_update (ppc_dblresult64_d);
428
458
@@ -438,6 +468,7 @@ void dppc_interpreter::ppc_fadds() {
438
468
ppc_grab_regsfpdab (ppc_cur_instruction);
439
469
440
470
snan_double_check (reg_a, reg_b);
471
+ max_double_check (val_reg_a, val_reg_b);
441
472
442
473
double ppc_dblresult64_d = (float )(val_reg_a + val_reg_b);
443
474
@@ -449,6 +480,10 @@ void dppc_interpreter::ppc_fadds() {
449
480
}
450
481
}
451
482
483
+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
484
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
485
+ }
486
+
452
487
ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
453
488
fpresult_update (ppc_dblresult64_d);
454
489
@@ -512,6 +547,10 @@ void dppc_interpreter::ppc_fdivs() {
512
547
}
513
548
}
514
549
550
+ if (std::isnan (val_reg_a) || std::isnan (val_reg_b)) {
551
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
552
+ }
553
+
515
554
ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
516
555
fpresult_update (ppc_dblresult64_d);
517
556
@@ -538,6 +577,10 @@ void dppc_interpreter::ppc_fmuls() {
538
577
}
539
578
}
540
579
580
+ if (std::isnan (val_reg_a) || std::isnan (val_reg_c)) {
581
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
582
+ }
583
+
541
584
ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
542
585
fpresult_update (ppc_dblresult64_d);
543
586
@@ -570,9 +613,9 @@ void dppc_interpreter::ppc_fmadds() {
570
613
}
571
614
}
572
615
573
- if (std::isnan (val_reg_b)) {
616
+ if (std::isnan (val_reg_a) || std::isnan ( val_reg_b) || std::isnan (val_reg_c )) {
574
617
ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
575
- }
618
+ }
576
619
577
620
ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
578
621
fpresult_update (ppc_dblresult64_d);
@@ -593,9 +636,6 @@ void dppc_interpreter::ppc_fmsubs() {
593
636
594
637
595
638
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
- }
599
639
600
640
if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
601
641
(std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
@@ -609,6 +649,10 @@ void dppc_interpreter::ppc_fmsubs() {
609
649
if ((val_reg_a == inf) && (val_reg_b == inf))
610
650
ppc_state.fpscr |= VXISI;
611
651
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
+
612
656
ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
613
657
fpresult_update (ppc_dblresult64_d);
614
658
@@ -643,6 +687,10 @@ void dppc_interpreter::ppc_fnmadds() {
643
687
}
644
688
}
645
689
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
+
646
694
ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
647
695
fpresult_update (ppc_dblresult64_d);
648
696
@@ -674,6 +722,10 @@ void dppc_interpreter::ppc_fnmsubs() {
674
722
if ((val_reg_a == inf) && (val_reg_b == inf))
675
723
ppc_state.fpscr |= VXISI;
676
724
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
+
677
729
ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
678
730
fpresult_update (ppc_dblresult64_d);
679
731
@@ -692,6 +744,10 @@ void dppc_interpreter::ppc_fabs() {
692
744
693
745
double ppc_dblresult64_d = abs (GET_FPR (reg_b));
694
746
747
+ if (std::isnan (GET_FPR (reg_b))) {
748
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
749
+ }
750
+
695
751
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
696
752
697
753
if (rec)
@@ -710,6 +766,10 @@ void dppc_interpreter::ppc_fnabs() {
710
766
double ppc_dblresult64_d = abs (GET_FPR (reg_b));
711
767
ppc_dblresult64_d = -ppc_dblresult64_d;
712
768
769
+ if (std::isnan (GET_FPR (reg_b))) {
770
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
771
+ }
772
+
713
773
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
714
774
715
775
if (rec)
@@ -727,6 +787,10 @@ void dppc_interpreter::ppc_fneg() {
727
787
728
788
double ppc_dblresult64_d = -(GET_FPR (reg_b));
729
789
790
+ if (std::isnan (GET_FPR (reg_b))) {
791
+ ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
792
+ }
793
+
730
794
ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
731
795
732
796
if (rec)
0 commit comments