@@ -237,11 +237,11 @@ void dppc_interpreter::ppc_fdiv() {
237
237
snan_double_check (reg_a, reg_b);
238
238
239
239
double ppc_dblresult64_d = val_reg_a / val_reg_b;
240
+
240
241
if (val_reg_b == 0.0 ) {
241
- ppc_state.fpscr |= FX + VX;
242
+ ppc_state.fpscr |= 0xa0000000 ;
243
+ ppc_dblresult64_d = -ppc_dblresult64_d;
242
244
}
243
- ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
244
- fpresult_update (ppc_dblresult64_d);
245
245
246
246
if (std::isinf (val_reg_a) && std::isinf (val_reg_b)) {
247
247
ppc_state.fpscr |= VXIDI;
@@ -254,6 +254,9 @@ void dppc_interpreter::ppc_fdiv() {
254
254
}
255
255
}
256
256
257
+ ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
258
+ fpresult_update (ppc_dblresult64_d);
259
+
257
260
if (rec)
258
261
ppc_update_cr1 ();
259
262
}
@@ -268,8 +271,6 @@ void dppc_interpreter::ppc_fmul() {
268
271
snan_double_check (reg_a, reg_c);
269
272
270
273
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);
273
274
274
275
if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
275
276
(std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
@@ -279,6 +280,10 @@ void dppc_interpreter::ppc_fmul() {
279
280
}
280
281
}
281
282
283
+ ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
284
+ fpresult_update (ppc_dblresult64_d);
285
+
286
+
282
287
if (rec)
283
288
ppc_update_cr1 ();
284
289
}
@@ -294,8 +299,6 @@ void dppc_interpreter::ppc_fmadd() {
294
299
snan_single_check (reg_b);
295
300
296
301
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);
299
302
300
303
double inf = std::numeric_limits<double >::infinity ();
301
304
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() {
309
312
}
310
313
}
311
314
315
+ ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
316
+ fpresult_update (ppc_dblresult64_d);
317
+
318
+
312
319
if (rec)
313
320
ppc_update_cr1 ();
314
321
}
@@ -324,27 +331,26 @@ void dppc_interpreter::ppc_fmsub() {
324
331
snan_single_check (reg_b);
325
332
326
333
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);
329
334
330
335
if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
331
336
(std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
332
337
ppc_state.fpscr |= VXIMZ;
333
338
if (std::isnan (ppc_dblresult64_d)) {
334
339
ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
335
340
}
336
-
337
341
}
338
342
339
343
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))) {
342
345
ppc_state.fpscr |= VXISI;
343
346
if (std::isnan (ppc_dblresult64_d)) {
344
347
ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
345
348
}
346
349
}
347
350
351
+ ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
352
+ fpresult_update (ppc_dblresult64_d);
353
+
348
354
if (rec)
349
355
ppc_update_cr1 ();
350
356
}
@@ -360,15 +366,13 @@ void dppc_interpreter::ppc_fnmadd() {
360
366
snan_single_check (reg_b);
361
367
362
368
double ppc_dblresult64_d = -std::fma (val_reg_a, val_reg_c, val_reg_b);
369
+
363
370
if (std::isnan (ppc_dblresult64_d)) {
364
371
ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
365
372
}
366
- ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
367
- fpresult_update (ppc_dblresult64_d);
368
373
369
374
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))) {
372
376
ppc_state.fpscr |= VXISI;
373
377
if (std::isnan (ppc_dblresult64_d)) {
374
378
ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
@@ -383,6 +387,10 @@ void dppc_interpreter::ppc_fnmadd() {
383
387
}
384
388
}
385
389
390
+ ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
391
+ fpresult_update (ppc_dblresult64_d);
392
+
393
+
386
394
if (rec)
387
395
ppc_update_cr1 ();
388
396
}
@@ -398,10 +406,8 @@ void dppc_interpreter::ppc_fnmsub() {
398
406
snan_single_check (reg_b);
399
407
400
408
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);
403
409
404
- if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) || \
410
+ if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
405
411
(std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
406
412
ppc_state.fpscr |= VXIMZ;
407
413
if (std::isnan (ppc_dblresult64_d)) {
@@ -410,14 +416,16 @@ void dppc_interpreter::ppc_fnmsub() {
410
416
}
411
417
412
418
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))) {
415
420
ppc_state.fpscr |= VXISI;
416
421
if (std::isnan (ppc_dblresult64_d)) {
417
422
ppc_dblresult64_d = set_endresult_nan (ppc_dblresult64_d);
418
423
}
419
424
}
420
425
426
+ ppc_store_dfpresult_flt (reg_d, ppc_dblresult64_d);
427
+ fpresult_update (ppc_dblresult64_d);
428
+
421
429
if (rec)
422
430
ppc_update_cr1 ();
423
431
}
@@ -432,7 +440,6 @@ void dppc_interpreter::ppc_fadds() {
432
440
snan_double_check (reg_a, reg_b);
433
441
434
442
double ppc_dblresult64_d = (float )(val_reg_a + val_reg_b);
435
- ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
436
443
437
444
double inf = std::numeric_limits<double >::infinity ();
438
445
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() {
442
449
}
443
450
}
444
451
452
+ ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
445
453
fpresult_update (ppc_dblresult64_d);
446
454
447
455
if (rec)
@@ -489,7 +497,8 @@ void dppc_interpreter::ppc_fdivs() {
489
497
490
498
double ppc_dblresult64_d = (float )(val_reg_a / val_reg_b);
491
499
if (val_reg_b == 0.0 ) {
492
- ppc_state.fpscr |= FX + VX;
500
+ ppc_state.fpscr |= 0xa0000000 ;
501
+ ppc_dblresult64_d = -ppc_dblresult64_d;
493
502
}
494
503
495
504
if (std::isinf (val_reg_a) && std::isinf (val_reg_b)) {
@@ -548,8 +557,6 @@ void dppc_interpreter::ppc_fmadds() {
548
557
snan_single_check (reg_b);
549
558
550
559
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);
553
560
554
561
double inf = std::numeric_limits<double >::infinity ();
555
562
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() {
567
574
ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
568
575
}
569
576
577
+ ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
578
+ fpresult_update (ppc_dblresult64_d);
579
+
570
580
if (rec)
571
581
ppc_update_cr1 ();
572
582
}
@@ -586,8 +596,6 @@ void dppc_interpreter::ppc_fmsubs() {
586
596
if (std::isnan (ppc_dblresult64_d)) {
587
597
ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
588
598
}
589
- ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
590
- fpresult_update (ppc_dblresult64_d);
591
599
592
600
if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
593
601
(std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
@@ -601,6 +609,9 @@ void dppc_interpreter::ppc_fmsubs() {
601
609
if ((val_reg_a == inf) && (val_reg_b == inf))
602
610
ppc_state.fpscr |= VXISI;
603
611
612
+ ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
613
+ fpresult_update (ppc_dblresult64_d);
614
+
604
615
if (rec)
605
616
ppc_update_cr1 ();
606
617
}
@@ -619,8 +630,6 @@ void dppc_interpreter::ppc_fnmadds() {
619
630
if (std::isnan (ppc_dblresult64_d)) {
620
631
ppc_dblresult64_d = std::numeric_limits<double >::quiet_NaN ();
621
632
}
622
- ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
623
- fpresult_update (ppc_dblresult64_d);
624
633
625
634
double inf = std::numeric_limits<double >::infinity ();
626
635
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() {
634
643
}
635
644
}
636
645
646
+ ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
647
+ fpresult_update (ppc_dblresult64_d);
648
+
637
649
if (rec)
638
650
ppc_update_cr1 ();
639
651
}
@@ -649,8 +661,6 @@ void dppc_interpreter::ppc_fnmsubs() {
649
661
snan_single_check (reg_b);
650
662
651
663
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);
654
664
655
665
if ((std::isinf (val_reg_a) && (val_reg_c == 0.0 )) ||
656
666
(std::isinf (val_reg_c) && (val_reg_a == 0.0 ))) {
@@ -664,6 +674,9 @@ void dppc_interpreter::ppc_fnmsubs() {
664
674
if ((val_reg_a == inf) && (val_reg_b == inf))
665
675
ppc_state.fpscr |= VXISI;
666
676
677
+ ppc_store_sfpresult_flt (reg_d, ppc_dblresult64_d);
678
+ fpresult_update (ppc_dblresult64_d);
679
+
667
680
if (rec)
668
681
ppc_update_cr1 ();
669
682
}
0 commit comments