OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
11 // with the distribution. | 11 // with the distribution. |
12 // * Neither the name of Google Inc. nor the names of its | 12 // * Neither the name of Google Inc. nor the names of its |
13 // contributors may be used to endorse or promote products derived | 13 // contributors may be used to endorse or promote products derived |
14 // from this software without specific prior written permission. | 14 // from this software without specific prior written permission. |
15 // | 15 // |
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 #include <stdlib.h> | 28 #include <stdlib.h> |
29 #include <math.h> | |
30 #include <limits.h> | 29 #include <limits.h> |
| 30 #include <cmath> |
31 #include <cstdarg> | 31 #include <cstdarg> |
32 #include "v8.h" | 32 #include "v8.h" |
33 | 33 |
34 #if defined(V8_TARGET_ARCH_MIPS) | 34 #if defined(V8_TARGET_ARCH_MIPS) |
35 | 35 |
36 #include "cpu.h" | 36 #include "cpu.h" |
37 #include "disasm.h" | 37 #include "disasm.h" |
38 #include "assembler.h" | 38 #include "assembler.h" |
39 #include "globals.h" // Need the BitCast. | 39 #include "globals.h" // Need the BitCast. |
40 #include "mips/constants-mips.h" | 40 #include "mips/constants-mips.h" |
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1148 bool Simulator::test_fcsr_bit(uint32_t cc) { | 1148 bool Simulator::test_fcsr_bit(uint32_t cc) { |
1149 return FCSR_ & (1 << cc); | 1149 return FCSR_ & (1 << cc); |
1150 } | 1150 } |
1151 | 1151 |
1152 | 1152 |
1153 // Sets the rounding error codes in FCSR based on the result of the rounding. | 1153 // Sets the rounding error codes in FCSR based on the result of the rounding. |
1154 // Returns true if the operation was invalid. | 1154 // Returns true if the operation was invalid. |
1155 bool Simulator::set_fcsr_round_error(double original, double rounded) { | 1155 bool Simulator::set_fcsr_round_error(double original, double rounded) { |
1156 bool ret = false; | 1156 bool ret = false; |
1157 | 1157 |
1158 if (!isfinite(original) || !isfinite(rounded)) { | 1158 if (!std::isfinite(original) || !std::isfinite(rounded)) { |
1159 set_fcsr_bit(kFCSRInvalidOpFlagBit, true); | 1159 set_fcsr_bit(kFCSRInvalidOpFlagBit, true); |
1160 ret = true; | 1160 ret = true; |
1161 } | 1161 } |
1162 | 1162 |
1163 if (original != rounded) { | 1163 if (original != rounded) { |
1164 set_fcsr_bit(kFCSRInexactFlagBit, true); | 1164 set_fcsr_bit(kFCSRInexactFlagBit, true); |
1165 } | 1165 } |
1166 | 1166 |
1167 if (rounded < DBL_MIN && rounded > -DBL_MIN && rounded != 0) { | 1167 if (rounded < DBL_MIN && rounded > -DBL_MIN && rounded != 0) { |
1168 set_fcsr_bit(kFCSRUnderflowFlagBit, true); | 1168 set_fcsr_bit(kFCSRUnderflowFlagBit, true); |
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2060 case MOV_D: | 2060 case MOV_D: |
2061 set_fpu_register_double(fd_reg, fs); | 2061 set_fpu_register_double(fd_reg, fs); |
2062 break; | 2062 break; |
2063 case NEG_D: | 2063 case NEG_D: |
2064 set_fpu_register_double(fd_reg, -fs); | 2064 set_fpu_register_double(fd_reg, -fs); |
2065 break; | 2065 break; |
2066 case SQRT_D: | 2066 case SQRT_D: |
2067 set_fpu_register_double(fd_reg, sqrt(fs)); | 2067 set_fpu_register_double(fd_reg, sqrt(fs)); |
2068 break; | 2068 break; |
2069 case C_UN_D: | 2069 case C_UN_D: |
2070 set_fcsr_bit(fcsr_cc, isnan(fs) || isnan(ft)); | 2070 set_fcsr_bit(fcsr_cc, std::isnan(fs) || std::isnan(ft)); |
2071 break; | 2071 break; |
2072 case C_EQ_D: | 2072 case C_EQ_D: |
2073 set_fcsr_bit(fcsr_cc, (fs == ft)); | 2073 set_fcsr_bit(fcsr_cc, (fs == ft)); |
2074 break; | 2074 break; |
2075 case C_UEQ_D: | 2075 case C_UEQ_D: |
2076 set_fcsr_bit(fcsr_cc, (fs == ft) || (isnan(fs) || isnan(ft))); | 2076 set_fcsr_bit(fcsr_cc, |
| 2077 (fs == ft) || (std::isnan(fs) || std::isnan(ft))); |
2077 break; | 2078 break; |
2078 case C_OLT_D: | 2079 case C_OLT_D: |
2079 set_fcsr_bit(fcsr_cc, (fs < ft)); | 2080 set_fcsr_bit(fcsr_cc, (fs < ft)); |
2080 break; | 2081 break; |
2081 case C_ULT_D: | 2082 case C_ULT_D: |
2082 set_fcsr_bit(fcsr_cc, (fs < ft) || (isnan(fs) || isnan(ft))); | 2083 set_fcsr_bit(fcsr_cc, |
| 2084 (fs < ft) || (std::isnan(fs) || std::isnan(ft))); |
2083 break; | 2085 break; |
2084 case C_OLE_D: | 2086 case C_OLE_D: |
2085 set_fcsr_bit(fcsr_cc, (fs <= ft)); | 2087 set_fcsr_bit(fcsr_cc, (fs <= ft)); |
2086 break; | 2088 break; |
2087 case C_ULE_D: | 2089 case C_ULE_D: |
2088 set_fcsr_bit(fcsr_cc, (fs <= ft) || (isnan(fs) || isnan(ft))); | 2090 set_fcsr_bit(fcsr_cc, |
| 2091 (fs <= ft) || (std::isnan(fs) || std::isnan(ft))); |
2089 break; | 2092 break; |
2090 case CVT_W_D: // Convert double to word. | 2093 case CVT_W_D: // Convert double to word. |
2091 // Rounding modes are not yet supported. | 2094 // Rounding modes are not yet supported. |
2092 ASSERT((FCSR_ & 3) == 0); | 2095 ASSERT((FCSR_ & 3) == 0); |
2093 // In rounding mode 0 it should behave like ROUND. | 2096 // In rounding mode 0 it should behave like ROUND. |
2094 case ROUND_W_D: // Round double to word (round half to even). | 2097 case ROUND_W_D: // Round double to word (round half to even). |
2095 { | 2098 { |
2096 double rounded = floor(fs + 0.5); | 2099 double rounded = floor(fs + 0.5); |
2097 int32_t result = static_cast<int32_t>(rounded); | 2100 int32_t result = static_cast<int32_t>(rounded); |
2098 if ((result & 1) != 0 && result - fs == 0.5) { | 2101 if ((result & 1) != 0 && result - fs == 0.5) { |
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2899 } | 2902 } |
2900 | 2903 |
2901 | 2904 |
2902 #undef UNSUPPORTED | 2905 #undef UNSUPPORTED |
2903 | 2906 |
2904 } } // namespace v8::internal | 2907 } } // namespace v8::internal |
2905 | 2908 |
2906 #endif // USE_SIMULATOR | 2909 #endif // USE_SIMULATOR |
2907 | 2910 |
2908 #endif // V8_TARGET_ARCH_MIPS | 2911 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |