Skip to content

Commit 5f826d6

Browse files
committed
More floating point fixes
Down to 752 failing tests
1 parent 873f863 commit 5f826d6

File tree

1 file changed

+44
-31
lines changed

1 file changed

+44
-31
lines changed

cpu/ppc/ppcfpopcodes.cpp

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,11 @@ void dppc_interpreter::ppc_fdiv() {
237237
snan_double_check(reg_a, reg_b);
238238

239239
double ppc_dblresult64_d = val_reg_a / val_reg_b;
240+
240241
if (val_reg_b == 0.0) {
241-
ppc_state.fpscr |= FX + VX;
242+
ppc_state.fpscr |= 0xa0000000;
243+
ppc_dblresult64_d = -ppc_dblresult64_d;
242244
}
243-
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
244-
fpresult_update(ppc_dblresult64_d);
245245

246246
if (std::isinf(val_reg_a) && std::isinf(val_reg_b)) {
247247
ppc_state.fpscr |= VXIDI;
@@ -254,6 +254,9 @@ void dppc_interpreter::ppc_fdiv() {
254254
}
255255
}
256256

257+
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
258+
fpresult_update(ppc_dblresult64_d);
259+
257260
if (rec)
258261
ppc_update_cr1();
259262
}
@@ -268,8 +271,6 @@ void dppc_interpreter::ppc_fmul() {
268271
snan_double_check(reg_a, reg_c);
269272

270273
double ppc_dblresult64_d = val_reg_a * val_reg_c;
271-
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
272-
fpresult_update(ppc_dblresult64_d);
273274

274275
if ((std::isinf(val_reg_a) && (val_reg_c == 0.0)) ||
275276
(std::isinf(val_reg_c) && (val_reg_a == 0.0))) {
@@ -279,6 +280,10 @@ void dppc_interpreter::ppc_fmul() {
279280
}
280281
}
281282

283+
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
284+
fpresult_update(ppc_dblresult64_d);
285+
286+
282287
if (rec)
283288
ppc_update_cr1();
284289
}
@@ -294,8 +299,6 @@ void dppc_interpreter::ppc_fmadd() {
294299
snan_single_check(reg_b);
295300

296301
double ppc_dblresult64_d = std::fma(val_reg_a, val_reg_c, val_reg_b);
297-
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
298-
fpresult_update(ppc_dblresult64_d);
299302

300303
double inf = std::numeric_limits<double>::infinity();
301304
if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf)))
@@ -309,6 +312,10 @@ void dppc_interpreter::ppc_fmadd() {
309312
}
310313
}
311314

315+
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
316+
fpresult_update(ppc_dblresult64_d);
317+
318+
312319
if (rec)
313320
ppc_update_cr1();
314321
}
@@ -324,27 +331,26 @@ void dppc_interpreter::ppc_fmsub() {
324331
snan_single_check(reg_b);
325332

326333
double ppc_dblresult64_d = std::fma(val_reg_a, val_reg_c, -val_reg_b);
327-
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
328-
fpresult_update(ppc_dblresult64_d);
329334

330335
if ((std::isinf(val_reg_a) && (val_reg_c == 0.0)) ||
331336
(std::isinf(val_reg_c) && (val_reg_a == 0.0))) {
332337
ppc_state.fpscr |= VXIMZ;
333338
if (std::isnan(ppc_dblresult64_d)) {
334339
ppc_dblresult64_d = set_endresult_nan(ppc_dblresult64_d);
335340
}
336-
337341
}
338342

339343
double inf = std::numeric_limits<double>::infinity();
340-
if (((val_reg_a == inf) && (val_reg_b == -inf)) || \
341-
((val_reg_a == -inf) && (val_reg_b == inf))) {
344+
if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf))) {
342345
ppc_state.fpscr |= VXISI;
343346
if (std::isnan(ppc_dblresult64_d)) {
344347
ppc_dblresult64_d = set_endresult_nan(ppc_dblresult64_d);
345348
}
346349
}
347350

351+
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
352+
fpresult_update(ppc_dblresult64_d);
353+
348354
if (rec)
349355
ppc_update_cr1();
350356
}
@@ -360,15 +366,13 @@ void dppc_interpreter::ppc_fnmadd() {
360366
snan_single_check(reg_b);
361367

362368
double ppc_dblresult64_d = -std::fma(val_reg_a, val_reg_c, val_reg_b);
369+
363370
if (std::isnan(ppc_dblresult64_d)) {
364371
ppc_dblresult64_d = std::numeric_limits<double>::quiet_NaN();
365372
}
366-
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
367-
fpresult_update(ppc_dblresult64_d);
368373

369374
double inf = std::numeric_limits<double>::infinity();
370-
if (((val_reg_a == inf) && (val_reg_b == -inf)) || \
371-
((val_reg_a == -inf) && (val_reg_b == inf))) {
375+
if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf))) {
372376
ppc_state.fpscr |= VXISI;
373377
if (std::isnan(ppc_dblresult64_d)) {
374378
ppc_dblresult64_d = set_endresult_nan(ppc_dblresult64_d);
@@ -383,6 +387,10 @@ void dppc_interpreter::ppc_fnmadd() {
383387
}
384388
}
385389

390+
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
391+
fpresult_update(ppc_dblresult64_d);
392+
393+
386394
if (rec)
387395
ppc_update_cr1();
388396
}
@@ -398,10 +406,8 @@ void dppc_interpreter::ppc_fnmsub() {
398406
snan_single_check(reg_b);
399407

400408
double ppc_dblresult64_d = -std::fma(val_reg_a, val_reg_c, -val_reg_b);
401-
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
402-
fpresult_update(ppc_dblresult64_d);
403409

404-
if ((std::isinf(val_reg_a) && (val_reg_c == 0.0)) || \
410+
if ((std::isinf(val_reg_a) && (val_reg_c == 0.0)) ||
405411
(std::isinf(val_reg_c) && (val_reg_a == 0.0))) {
406412
ppc_state.fpscr |= VXIMZ;
407413
if (std::isnan(ppc_dblresult64_d)) {
@@ -410,14 +416,16 @@ void dppc_interpreter::ppc_fnmsub() {
410416
}
411417

412418
double inf = std::numeric_limits<double>::infinity();
413-
if (((val_reg_a == inf) && (val_reg_b == -inf)) || \
414-
((val_reg_a == -inf) && (val_reg_b == inf))) {
419+
if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf))) {
415420
ppc_state.fpscr |= VXISI;
416421
if (std::isnan(ppc_dblresult64_d)) {
417422
ppc_dblresult64_d = set_endresult_nan(ppc_dblresult64_d);
418423
}
419424
}
420425

426+
ppc_store_dfpresult_flt(reg_d, ppc_dblresult64_d);
427+
fpresult_update(ppc_dblresult64_d);
428+
421429
if (rec)
422430
ppc_update_cr1();
423431
}
@@ -432,7 +440,6 @@ void dppc_interpreter::ppc_fadds() {
432440
snan_double_check(reg_a, reg_b);
433441

434442
double ppc_dblresult64_d = (float)(val_reg_a + val_reg_b);
435-
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
436443

437444
double inf = std::numeric_limits<double>::infinity();
438445
if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf))) {
@@ -442,6 +449,7 @@ void dppc_interpreter::ppc_fadds() {
442449
}
443450
}
444451

452+
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
445453
fpresult_update(ppc_dblresult64_d);
446454

447455
if (rec)
@@ -489,7 +497,8 @@ void dppc_interpreter::ppc_fdivs() {
489497

490498
double ppc_dblresult64_d = (float)(val_reg_a / val_reg_b);
491499
if (val_reg_b == 0.0) {
492-
ppc_state.fpscr |= FX + VX;
500+
ppc_state.fpscr |= 0xa0000000;
501+
ppc_dblresult64_d = -ppc_dblresult64_d;
493502
}
494503

495504
if (std::isinf(val_reg_a) && std::isinf(val_reg_b)) {
@@ -548,8 +557,6 @@ void dppc_interpreter::ppc_fmadds() {
548557
snan_single_check(reg_b);
549558

550559
double ppc_dblresult64_d = (float)std::fma(val_reg_a, val_reg_c, val_reg_b);
551-
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
552-
fpresult_update(ppc_dblresult64_d);
553560

554561
double inf = std::numeric_limits<double>::infinity();
555562
if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf)))
@@ -567,6 +574,9 @@ void dppc_interpreter::ppc_fmadds() {
567574
ppc_dblresult64_d = std::numeric_limits<double>::quiet_NaN();
568575
}
569576

577+
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
578+
fpresult_update(ppc_dblresult64_d);
579+
570580
if (rec)
571581
ppc_update_cr1();
572582
}
@@ -586,8 +596,6 @@ void dppc_interpreter::ppc_fmsubs() {
586596
if (std::isnan(ppc_dblresult64_d)) {
587597
ppc_dblresult64_d = std::numeric_limits<double>::quiet_NaN();
588598
}
589-
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
590-
fpresult_update(ppc_dblresult64_d);
591599

592600
if ((std::isinf(val_reg_a) && (val_reg_c == 0.0)) ||
593601
(std::isinf(val_reg_c) && (val_reg_a == 0.0))) {
@@ -601,6 +609,9 @@ void dppc_interpreter::ppc_fmsubs() {
601609
if ((val_reg_a == inf) && (val_reg_b == inf))
602610
ppc_state.fpscr |= VXISI;
603611

612+
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
613+
fpresult_update(ppc_dblresult64_d);
614+
604615
if (rec)
605616
ppc_update_cr1();
606617
}
@@ -619,8 +630,6 @@ void dppc_interpreter::ppc_fnmadds() {
619630
if (std::isnan(ppc_dblresult64_d)) {
620631
ppc_dblresult64_d = std::numeric_limits<double>::quiet_NaN();
621632
}
622-
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
623-
fpresult_update(ppc_dblresult64_d);
624633

625634
double inf = std::numeric_limits<double>::infinity();
626635
if (((val_reg_a == inf) && (val_reg_b == -inf)) || ((val_reg_a == -inf) && (val_reg_b == inf)))
@@ -634,6 +643,9 @@ void dppc_interpreter::ppc_fnmadds() {
634643
}
635644
}
636645

646+
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
647+
fpresult_update(ppc_dblresult64_d);
648+
637649
if (rec)
638650
ppc_update_cr1();
639651
}
@@ -649,8 +661,6 @@ void dppc_interpreter::ppc_fnmsubs() {
649661
snan_single_check(reg_b);
650662

651663
double ppc_dblresult64_d = -(float)std::fma(val_reg_a, val_reg_c, -val_reg_b);
652-
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
653-
fpresult_update(ppc_dblresult64_d);
654664

655665
if ((std::isinf(val_reg_a) && (val_reg_c == 0.0)) ||
656666
(std::isinf(val_reg_c) && (val_reg_a == 0.0))) {
@@ -664,6 +674,9 @@ void dppc_interpreter::ppc_fnmsubs() {
664674
if ((val_reg_a == inf) && (val_reg_b == inf))
665675
ppc_state.fpscr |= VXISI;
666676

677+
ppc_store_sfpresult_flt(reg_d, ppc_dblresult64_d);
678+
fpresult_update(ppc_dblresult64_d);
679+
667680
if (rec)
668681
ppc_update_cr1();
669682
}

0 commit comments

Comments
 (0)