OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include <math.h> // for isnan. | |
6 #include <setjmp.h> | 5 #include <setjmp.h> |
7 #include <stdlib.h> | 6 #include <stdlib.h> |
8 | 7 |
9 #include "vm/globals.h" | 8 #include "vm/globals.h" |
10 #if defined(TARGET_ARCH_MIPS) | 9 #if defined(TARGET_ARCH_MIPS) |
11 | 10 |
12 // Only build the simulator if not compiling for real MIPS hardware. | 11 // Only build the simulator if not compiling for real MIPS hardware. |
13 #if !defined(HOST_ARCH_MIPS) | 12 #if !defined(HOST_ARCH_MIPS) |
14 | 13 |
15 #include "vm/simulator.h" | 14 #include "vm/simulator.h" |
(...skipping 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1586 } | 1585 } |
1587 case COP1_C_F: { | 1586 case COP1_C_F: { |
1588 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1587 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1589 ASSERT(instr->FdField() == F0); | 1588 ASSERT(instr->FdField() == F0); |
1590 set_fcsr_bit(fcsr_cc, false); | 1589 set_fcsr_bit(fcsr_cc, false); |
1591 break; | 1590 break; |
1592 } | 1591 } |
1593 case COP1_C_UN: { | 1592 case COP1_C_UN: { |
1594 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1593 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1595 ASSERT(instr->FdField() == F0); | 1594 ASSERT(instr->FdField() == F0); |
1596 set_fcsr_bit(fcsr_cc, isnan(fs_val) || isnan(ft_val)); | 1595 set_fcsr_bit(fcsr_cc, std::isnan(fs_val) || std::isnan(ft_val)); |
1597 break; | 1596 break; |
1598 } | 1597 } |
1599 case COP1_C_EQ: { | 1598 case COP1_C_EQ: { |
1600 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1599 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1601 ASSERT(instr->FdField() == F0); | 1600 ASSERT(instr->FdField() == F0); |
1602 set_fcsr_bit(fcsr_cc, (fs_val == ft_val)); | 1601 set_fcsr_bit(fcsr_cc, (fs_val == ft_val)); |
1603 break; | 1602 break; |
1604 } | 1603 } |
1605 case COP1_C_UEQ: { | 1604 case COP1_C_UEQ: { |
1606 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1605 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1607 ASSERT(instr->FdField() == F0); | 1606 ASSERT(instr->FdField() == F0); |
1608 set_fcsr_bit(fcsr_cc, | 1607 set_fcsr_bit(fcsr_cc, |
1609 (fs_val == ft_val) || isnan(fs_val) || isnan(ft_val)); | 1608 (fs_val == ft_val) || std::isnan(fs_val) || std::isnan(ft_val)); |
1610 break; | 1609 break; |
1611 } | 1610 } |
1612 case COP1_C_OLT: { | 1611 case COP1_C_OLT: { |
1613 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1612 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1614 ASSERT(instr->FdField() == F0); | 1613 ASSERT(instr->FdField() == F0); |
1615 set_fcsr_bit(fcsr_cc, (fs_val < ft_val)); | 1614 set_fcsr_bit(fcsr_cc, (fs_val < ft_val)); |
1616 break; | 1615 break; |
1617 } | 1616 } |
1618 case COP1_C_ULT: { | 1617 case COP1_C_ULT: { |
1619 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1618 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1620 ASSERT(instr->FdField() == F0); | 1619 ASSERT(instr->FdField() == F0); |
1621 set_fcsr_bit(fcsr_cc, | 1620 set_fcsr_bit(fcsr_cc, |
1622 (fs_val < ft_val) || isnan(fs_val) || isnan(ft_val)); | 1621 (fs_val < ft_val) || std::isnan(fs_val) || std::isnan(ft_val)); |
1623 break; | 1622 break; |
1624 } | 1623 } |
1625 case COP1_C_OLE: { | 1624 case COP1_C_OLE: { |
1626 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1625 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1627 ASSERT(instr->FdField() == F0); | 1626 ASSERT(instr->FdField() == F0); |
1628 set_fcsr_bit(fcsr_cc, (fs_val <= ft_val)); | 1627 set_fcsr_bit(fcsr_cc, (fs_val <= ft_val)); |
1629 break; | 1628 break; |
1630 } | 1629 } |
1631 case COP1_C_ULE: { | 1630 case COP1_C_ULE: { |
1632 ASSERT(instr->FormatField() == FMT_D); // Only D supported. | 1631 ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
1633 ASSERT(instr->FdField() == F0); | 1632 ASSERT(instr->FdField() == F0); |
1634 set_fcsr_bit(fcsr_cc, | 1633 set_fcsr_bit(fcsr_cc, |
1635 (fs_val <= ft_val) || isnan(fs_val) || isnan(ft_val)); | 1634 (fs_val <= ft_val) || std::isnan(fs_val) || std::isnan(ft_val)); |
1636 break; | 1635 break; |
1637 } | 1636 } |
1638 case COP1_CVT_D: { | 1637 case COP1_CVT_D: { |
1639 switch (instr->FormatField()) { | 1638 switch (instr->FormatField()) { |
1640 case FMT_W: { | 1639 case FMT_W: { |
1641 int32_t fs_int = get_fregister(instr->FsField()); | 1640 int32_t fs_int = get_fregister(instr->FsField()); |
1642 double fs_dbl = static_cast<double>(fs_int); | 1641 double fs_dbl = static_cast<double>(fs_int); |
1643 set_fregister_double(instr->FdField(), fs_dbl); | 1642 set_fregister_double(instr->FdField(), fs_dbl); |
1644 break; | 1643 break; |
1645 } | 1644 } |
(...skipping 15 matching lines...) Expand all Loading... |
1661 break; | 1660 break; |
1662 } | 1661 } |
1663 } | 1662 } |
1664 break; | 1663 break; |
1665 } | 1664 } |
1666 case COP1_CVT_W: { | 1665 case COP1_CVT_W: { |
1667 switch (instr->FormatField()) { | 1666 switch (instr->FormatField()) { |
1668 case FMT_D: { | 1667 case FMT_D: { |
1669 double fs_dbl = get_fregister_double(instr->FsField()); | 1668 double fs_dbl = get_fregister_double(instr->FsField()); |
1670 int32_t fs_int; | 1669 int32_t fs_int; |
1671 if (isnan(fs_dbl) || isinf(fs_dbl) || (fs_dbl > INT_MAX) || | 1670 if (std::isnan(fs_dbl) || std::isinf(fs_dbl) || |
1672 (fs_dbl < INT_MIN)) { | 1671 (fs_dbl > INT_MAX) || (fs_dbl < INT_MIN)) { |
1673 fs_int = INT_MIN; | 1672 fs_int = INT_MIN; |
1674 } else { | 1673 } else { |
1675 fs_int = static_cast<int32_t>(fs_dbl); | 1674 fs_int = static_cast<int32_t>(fs_dbl); |
1676 } | 1675 } |
1677 set_fregister(instr->FdField(), fs_int); | 1676 set_fregister(instr->FdField(), fs_int); |
1678 break; | 1677 break; |
1679 } | 1678 } |
1680 default: { | 1679 default: { |
1681 OS::PrintErr("DecodeCop1: 0x%x\n", instr->InstructionBits()); | 1680 OS::PrintErr("DecodeCop1: 0x%x\n", instr->InstructionBits()); |
1682 UnimplementedInstruction(instr); | 1681 UnimplementedInstruction(instr); |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2245 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); | 2244 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); |
2246 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); | 2245 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); |
2247 buf->Longjmp(); | 2246 buf->Longjmp(); |
2248 } | 2247 } |
2249 | 2248 |
2250 } // namespace dart | 2249 } // namespace dart |
2251 | 2250 |
2252 #endif // !defined(HOST_ARCH_MIPS) | 2251 #endif // !defined(HOST_ARCH_MIPS) |
2253 | 2252 |
2254 #endif // defined TARGET_ARCH_MIPS | 2253 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |