1411 switch (r.type) {
1412 case fex_int:
1413 *(float *)ea = (float) r.val.i;
1414 break;
1415
1416 case fex_llong:
1417 *(float *)ea = (float) r.val.l;
1418 break;
1419
1420 case fex_float:
1421 *(float *)ea = r.val.f;
1422 break;
1423
1424 case fex_double:
1425 *(float *)ea = (float) r.val.d;
1426 break;
1427
1428 case fex_ldouble:
1429 *(float *)ea = (float) r.val.q;
1430 break;
1431 }
1432 if (ex != FPE_FLTRES && (op & 8) != 0)
1433 pop(uap);
1434 return;
1435
1436 case 0x310:
1437 case 0x318:
1438 case 0x350:
1439 case 0x358:
1440 case 0x390:
1441 case 0x398:
1442 if (!ea)
1443 return;
1444 switch (r.type) {
1445 case fex_int:
1446 *(int *)ea = r.val.i;
1447 break;
1448
1449 case fex_llong:
1450 *(int *)ea = (int) r.val.l;
1451 break;
1452
1453 case fex_float:
1454 *(int *)ea = (int) r.val.f;
1455 break;
1456
1457 case fex_double:
1458 *(int *)ea = (int) r.val.d;
1459 break;
1460
1461 case fex_ldouble:
1462 *(int *)ea = (int) r.val.q;
1463 break;
1464 }
1465 if (ex != FPE_FLTRES && (op & 8) != 0)
1466 pop(uap);
1467 return;
1468
1469 case 0x510:
1470 case 0x518:
1471 case 0x550:
1472 case 0x558:
1473 case 0x590:
1474 case 0x598:
1475 if (!ea)
1476 return;
1477 switch (r.type) {
1478 case fex_int:
1479 *(double *)ea = (double) r.val.i;
1480 break;
1481
1482 case fex_llong:
1483 *(double *)ea = (double) r.val.l;
1484 break;
1485
1486 case fex_float:
1487 *(double *)ea = (double) r.val.f;
1488 break;
1489
1490 case fex_double:
1491 *(double *)ea = r.val.d;
1492 break;
1493
1494 case fex_ldouble:
1495 *(double *)ea = (double) r.val.q;
1496 break;
1497 }
1498 if (ex != FPE_FLTRES && (op & 8) != 0)
1499 pop(uap);
1500 return;
1501
1502 case 0x710:
1503 case 0x718:
1504 case 0x750:
1505 case 0x758:
1506 case 0x790:
1507 case 0x798:
1508 if (!ea)
1509 return;
1510 switch (r.type) {
1511 case fex_int:
1512 *(short *)ea = (short) r.val.i;
1513 break;
1514
1515 case fex_llong:
1516 *(short *)ea = (short) r.val.l;
1517 break;
1518
1519 case fex_float:
1520 *(short *)ea = (short) r.val.f;
1521 break;
1522
1523 case fex_double:
1524 *(short *)ea = (short) r.val.d;
1525 break;
1526
1527 case fex_ldouble:
1528 *(short *)ea = (short) r.val.q;
1529 break;
1530 }
1531 if (ex != FPE_FLTRES && (op & 8) != 0)
1532 pop(uap);
1533 return;
1534
1535 case 0x730:
1536 case 0x770:
1537 case 0x7b0:
1538 /* fbstp; don't bother */
1539 if (ea && ex != FPE_FLTRES)
1540 pop(uap);
1541 return;
1542
1543 case 0x738:
1544 case 0x778:
1545 case 0x7b8:
1546 if (!ea)
1547 return;
1548 switch (r.type) {
1549 case fex_int:
1550 *(long long *)ea = (long long) r.val.i;
1551 break;
1552
1553 case fex_llong:
1554 *(long long *)ea = r.val.l;
1555 break;
1556
1557 case fex_float:
1558 *(long long *)ea = (long long) r.val.f;
1559 break;
1560
1561 case fex_double:
1562 *(long long *)ea = (long long) r.val.d;
1563 break;
1564
1565 case fex_ldouble:
1566 *(long long *)ea = (long long) r.val.q;
1567 break;
1568 }
1569 if (ex != FPE_FLTRES)
1570 pop(uap);
1571 return;
1572 }
1573
1574 /* for all other instructions, the result goes into a register */
1575 switch (r.type) {
1576 case fex_int:
1577 r.val.q = (long double) r.val.i;
1578 break;
1579
1580 case fex_llong:
1581 r.val.q = (long double) r.val.l;
1582 break;
1583
1584 case fex_float:
1585 r.val.q = (long double) r.val.f;
1586 break;
1587
1588 case fex_double:
1589 r.val.q = (long double) r.val.d;
1590 break;
1591 }
1592
1593 /* for load instructions, push the result onto the stack */
1594 switch (op & 0x7f8) {
1595 case 0x100:
1596 case 0x140:
1597 case 0x180:
1598 case 0x500:
1599 case 0x540:
1600 case 0x580:
1601 if (ea)
1602 push(r.val.q, uap);
1603 return;
1604 }
1605
1606 /* for all other instructions, if the exception is overflow,
1607 underflow, or inexact, the stack has already been updated */
1608 stack = (ex == FPE_FLTOVF || ex == FPE_FLTUND || ex == FPE_FLTRES);
1609 switch (op & 0x7f8) {
|
1411 switch (r.type) {
1412 case fex_int:
1413 *(float *)ea = (float) r.val.i;
1414 break;
1415
1416 case fex_llong:
1417 *(float *)ea = (float) r.val.l;
1418 break;
1419
1420 case fex_float:
1421 *(float *)ea = r.val.f;
1422 break;
1423
1424 case fex_double:
1425 *(float *)ea = (float) r.val.d;
1426 break;
1427
1428 case fex_ldouble:
1429 *(float *)ea = (float) r.val.q;
1430 break;
1431
1432 default:
1433 break;
1434 }
1435 if (ex != FPE_FLTRES && (op & 8) != 0)
1436 pop(uap);
1437 return;
1438
1439 case 0x310:
1440 case 0x318:
1441 case 0x350:
1442 case 0x358:
1443 case 0x390:
1444 case 0x398:
1445 if (!ea)
1446 return;
1447 switch (r.type) {
1448 case fex_int:
1449 *(int *)ea = r.val.i;
1450 break;
1451
1452 case fex_llong:
1453 *(int *)ea = (int) r.val.l;
1454 break;
1455
1456 case fex_float:
1457 *(int *)ea = (int) r.val.f;
1458 break;
1459
1460 case fex_double:
1461 *(int *)ea = (int) r.val.d;
1462 break;
1463
1464 case fex_ldouble:
1465 *(int *)ea = (int) r.val.q;
1466 break;
1467
1468 default:
1469 break;
1470 }
1471 if (ex != FPE_FLTRES && (op & 8) != 0)
1472 pop(uap);
1473 return;
1474
1475 case 0x510:
1476 case 0x518:
1477 case 0x550:
1478 case 0x558:
1479 case 0x590:
1480 case 0x598:
1481 if (!ea)
1482 return;
1483 switch (r.type) {
1484 case fex_int:
1485 *(double *)ea = (double) r.val.i;
1486 break;
1487
1488 case fex_llong:
1489 *(double *)ea = (double) r.val.l;
1490 break;
1491
1492 case fex_float:
1493 *(double *)ea = (double) r.val.f;
1494 break;
1495
1496 case fex_double:
1497 *(double *)ea = r.val.d;
1498 break;
1499
1500 case fex_ldouble:
1501 *(double *)ea = (double) r.val.q;
1502 break;
1503
1504 default:
1505 break;
1506 }
1507 if (ex != FPE_FLTRES && (op & 8) != 0)
1508 pop(uap);
1509 return;
1510
1511 case 0x710:
1512 case 0x718:
1513 case 0x750:
1514 case 0x758:
1515 case 0x790:
1516 case 0x798:
1517 if (!ea)
1518 return;
1519 switch (r.type) {
1520 case fex_int:
1521 *(short *)ea = (short) r.val.i;
1522 break;
1523
1524 case fex_llong:
1525 *(short *)ea = (short) r.val.l;
1526 break;
1527
1528 case fex_float:
1529 *(short *)ea = (short) r.val.f;
1530 break;
1531
1532 case fex_double:
1533 *(short *)ea = (short) r.val.d;
1534 break;
1535
1536 case fex_ldouble:
1537 *(short *)ea = (short) r.val.q;
1538 break;
1539
1540 default:
1541 break;
1542 }
1543 if (ex != FPE_FLTRES && (op & 8) != 0)
1544 pop(uap);
1545 return;
1546
1547 case 0x730:
1548 case 0x770:
1549 case 0x7b0:
1550 /* fbstp; don't bother */
1551 if (ea && ex != FPE_FLTRES)
1552 pop(uap);
1553 return;
1554
1555 case 0x738:
1556 case 0x778:
1557 case 0x7b8:
1558 if (!ea)
1559 return;
1560 switch (r.type) {
1561 case fex_int:
1562 *(long long *)ea = (long long) r.val.i;
1563 break;
1564
1565 case fex_llong:
1566 *(long long *)ea = r.val.l;
1567 break;
1568
1569 case fex_float:
1570 *(long long *)ea = (long long) r.val.f;
1571 break;
1572
1573 case fex_double:
1574 *(long long *)ea = (long long) r.val.d;
1575 break;
1576
1577 case fex_ldouble:
1578 *(long long *)ea = (long long) r.val.q;
1579 break;
1580
1581 default:
1582 break;
1583 }
1584 if (ex != FPE_FLTRES)
1585 pop(uap);
1586 return;
1587 }
1588
1589 /* for all other instructions, the result goes into a register */
1590 switch (r.type) {
1591 case fex_int:
1592 r.val.q = (long double) r.val.i;
1593 break;
1594
1595 case fex_llong:
1596 r.val.q = (long double) r.val.l;
1597 break;
1598
1599 case fex_float:
1600 r.val.q = (long double) r.val.f;
1601 break;
1602
1603 case fex_double:
1604 r.val.q = (long double) r.val.d;
1605 break;
1606
1607 default:
1608 break;
1609 }
1610
1611 /* for load instructions, push the result onto the stack */
1612 switch (op & 0x7f8) {
1613 case 0x100:
1614 case 0x140:
1615 case 0x180:
1616 case 0x500:
1617 case 0x540:
1618 case 0x580:
1619 if (ea)
1620 push(r.val.q, uap);
1621 return;
1622 }
1623
1624 /* for all other instructions, if the exception is overflow,
1625 underflow, or inexact, the stack has already been updated */
1626 stack = (ex == FPE_FLTOVF || ex == FPE_FLTUND || ex == FPE_FLTRES);
1627 switch (op & 0x7f8) {
|