OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits.h> | 5 #include <limits.h> |
6 #include <stdarg.h> | 6 #include <stdarg.h> |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <cmath> | 8 #include <cmath> |
9 | 9 |
10 #include "src/v8.h" | 10 #include "src/v8.h" |
11 | 11 |
12 #if V8_TARGET_ARCH_MIPS | 12 #if V8_TARGET_ARCH_MIPS |
13 | 13 |
14 #include "src/assembler.h" | 14 #include "src/assembler.h" |
| 15 #include "src/base/bits.h" |
15 #include "src/disasm.h" | 16 #include "src/disasm.h" |
16 #include "src/globals.h" // Need the BitCast. | 17 #include "src/globals.h" // Need the BitCast. |
17 #include "src/mips/constants-mips.h" | 18 #include "src/mips/constants-mips.h" |
18 #include "src/mips/simulator-mips.h" | 19 #include "src/mips/simulator-mips.h" |
19 #include "src/ostreams.h" | 20 #include "src/ostreams.h" |
20 | 21 |
21 | 22 |
22 // Only build the simulator if not compiling for real MIPS hardware. | 23 // Only build the simulator if not compiling for real MIPS hardware. |
23 #if defined(USE_SIMULATOR) | 24 #if defined(USE_SIMULATOR) |
24 | 25 |
(...skipping 1934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1959 case SRAV: | 1960 case SRAV: |
1960 *alu_out = rt >> rs; | 1961 *alu_out = rt >> rs; |
1961 break; | 1962 break; |
1962 case MFHI: // MFHI == CLZ on R6. | 1963 case MFHI: // MFHI == CLZ on R6. |
1963 if (!IsMipsArchVariant(kMips32r6)) { | 1964 if (!IsMipsArchVariant(kMips32r6)) { |
1964 DCHECK(instr->SaValue() == 0); | 1965 DCHECK(instr->SaValue() == 0); |
1965 *alu_out = get_register(HI); | 1966 *alu_out = get_register(HI); |
1966 } else { | 1967 } else { |
1967 // MIPS spec: If no bits were set in GPR rs, the result written to | 1968 // MIPS spec: If no bits were set in GPR rs, the result written to |
1968 // GPR rd is 32. | 1969 // GPR rd is 32. |
1969 // GCC __builtin_clz: If input is 0, the result is undefined. | |
1970 DCHECK(instr->SaValue() == 1); | 1970 DCHECK(instr->SaValue() == 1); |
1971 *alu_out = | 1971 *alu_out = base::bits::CountLeadingZeros32(rs_u); |
1972 rs_u == 0 ? 32 : CompilerIntrinsics::CountLeadingZeros(rs_u); | |
1973 } | 1972 } |
1974 break; | 1973 break; |
1975 case MFLO: | 1974 case MFLO: |
1976 *alu_out = get_register(LO); | 1975 *alu_out = get_register(LO); |
1977 break; | 1976 break; |
1978 case MULT: // MULT == MUL_MUH. | 1977 case MULT: // MULT == MUL_MUH. |
1979 if (!IsMipsArchVariant(kMips32r6)) { | 1978 if (!IsMipsArchVariant(kMips32r6)) { |
1980 *i64hilo = static_cast<int64_t>(rs) * static_cast<int64_t>(rt); | 1979 *i64hilo = static_cast<int64_t>(rs) * static_cast<int64_t>(rt); |
1981 } else { | 1980 } else { |
1982 switch (instr->SaValue()) { | 1981 switch (instr->SaValue()) { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2087 } | 2086 } |
2088 break; | 2087 break; |
2089 case SPECIAL2: | 2088 case SPECIAL2: |
2090 switch (instr->FunctionFieldRaw()) { | 2089 switch (instr->FunctionFieldRaw()) { |
2091 case MUL: | 2090 case MUL: |
2092 *alu_out = rs_u * rt_u; // Only the lower 32 bits are kept. | 2091 *alu_out = rs_u * rt_u; // Only the lower 32 bits are kept. |
2093 break; | 2092 break; |
2094 case CLZ: | 2093 case CLZ: |
2095 // MIPS32 spec: If no bits were set in GPR rs, the result written to | 2094 // MIPS32 spec: If no bits were set in GPR rs, the result written to |
2096 // GPR rd is 32. | 2095 // GPR rd is 32. |
2097 // GCC __builtin_clz: If input is 0, the result is undefined. | 2096 *alu_out = base::bits::CountLeadingZeros32(rs_u); |
2098 *alu_out = | |
2099 rs_u == 0 ? 32 : CompilerIntrinsics::CountLeadingZeros(rs_u); | |
2100 break; | 2097 break; |
2101 default: | 2098 default: |
2102 UNREACHABLE(); | 2099 UNREACHABLE(); |
2103 } | 2100 } |
2104 break; | 2101 break; |
2105 case SPECIAL3: | 2102 case SPECIAL3: |
2106 switch (instr->FunctionFieldRaw()) { | 2103 switch (instr->FunctionFieldRaw()) { |
2107 case INS: { // Mips32r2 instruction. | 2104 case INS: { // Mips32r2 instruction. |
2108 // Interpret rd field as 5-bit msb of insert. | 2105 // Interpret rd field as 5-bit msb of insert. |
2109 uint16_t msb = rd_reg; | 2106 uint16_t msb = rd_reg; |
(...skipping 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3264 } | 3261 } |
3265 | 3262 |
3266 | 3263 |
3267 #undef UNSUPPORTED | 3264 #undef UNSUPPORTED |
3268 | 3265 |
3269 } } // namespace v8::internal | 3266 } } // namespace v8::internal |
3270 | 3267 |
3271 #endif // USE_SIMULATOR | 3268 #endif // USE_SIMULATOR |
3272 | 3269 |
3273 #endif // V8_TARGET_ARCH_MIPS | 3270 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |