Skip to content

Commit f660efc

Browse files
committed
Continued FPU fixes
1 parent 5f826d6 commit f660efc

File tree

1 file changed

+70
-6
lines changed

1 file changed

+70
-6
lines changed

cpu/ppc/ppcfpopcodes.cpp

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)