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 #if V8_TARGET_ARCH_MIPS64 | 10 #if V8_TARGET_ARCH_MIPS64 |
(...skipping 3346 matching lines...) Loading... |
3357 DCHECK(sa() == 0); | 3357 DCHECK(sa() == 0); |
3358 alu_out = get_register(HI); | 3358 alu_out = get_register(HI); |
3359 } else { | 3359 } else { |
3360 // MIPS spec: If no bits were set in GPR rs(), the result written to | 3360 // MIPS spec: If no bits were set in GPR rs(), the result written to |
3361 // GPR rd() is 32. | 3361 // GPR rd() is 32. |
3362 DCHECK(sa() == 1); | 3362 DCHECK(sa() == 1); |
3363 alu_out = base::bits::CountLeadingZeros32(static_cast<int32_t>(rs_u())); | 3363 alu_out = base::bits::CountLeadingZeros32(static_cast<int32_t>(rs_u())); |
3364 } | 3364 } |
3365 SetResult(rd_reg(), alu_out); | 3365 SetResult(rd_reg(), alu_out); |
3366 break; | 3366 break; |
3367 case MFLO: | 3367 case MFLO: // MFLO == DCLZ on R6. |
3368 SetResult(rd_reg(), get_register(LO)); | 3368 if (kArchVariant != kMips64r6) { |
| 3369 DCHECK(sa() == 0); |
| 3370 alu_out = get_register(LO); |
| 3371 } else { |
| 3372 // MIPS spec: If no bits were set in GPR rs(), the result written to |
| 3373 // GPR rd() is 64. |
| 3374 DCHECK(sa() == 1); |
| 3375 alu_out = base::bits::CountLeadingZeros64(static_cast<int64_t>(rs_u())); |
| 3376 } |
| 3377 SetResult(rd_reg(), alu_out); |
3369 break; | 3378 break; |
3370 // Instructions using HI and LO registers. | 3379 // Instructions using HI and LO registers. |
3371 case MULT: { // MULT == D_MUL_MUH. | 3380 case MULT: { // MULT == D_MUL_MUH. |
3372 int32_t rs_lo = static_cast<int32_t>(rs()); | 3381 int32_t rs_lo = static_cast<int32_t>(rs()); |
3373 int32_t rt_lo = static_cast<int32_t>(rt()); | 3382 int32_t rt_lo = static_cast<int32_t>(rt()); |
3374 i64hilo = static_cast<int64_t>(rs_lo) * static_cast<int64_t>(rt_lo); | 3383 i64hilo = static_cast<int64_t>(rs_lo) * static_cast<int64_t>(rt_lo); |
3375 if (kArchVariant != kMips64r6) { | 3384 if (kArchVariant != kMips64r6) { |
3376 set_register(LO, static_cast<int32_t>(i64hilo & 0xffffffff)); | 3385 set_register(LO, static_cast<int32_t>(i64hilo & 0xffffffff)); |
3377 set_register(HI, static_cast<int32_t>(i64hilo >> 32)); | 3386 set_register(HI, static_cast<int32_t>(i64hilo >> 32)); |
3378 } else { | 3387 } else { |
(...skipping 279 matching lines...) Loading... |
3658 alu_out = static_cast<int32_t>(rs_u()) * static_cast<int32_t>(rt_u()); | 3667 alu_out = static_cast<int32_t>(rs_u()) * static_cast<int32_t>(rt_u()); |
3659 SetResult(rd_reg(), alu_out); | 3668 SetResult(rd_reg(), alu_out); |
3660 // HI and LO are UNPREDICTABLE after the operation. | 3669 // HI and LO are UNPREDICTABLE after the operation. |
3661 set_register(LO, Unpredictable); | 3670 set_register(LO, Unpredictable); |
3662 set_register(HI, Unpredictable); | 3671 set_register(HI, Unpredictable); |
3663 break; | 3672 break; |
3664 case CLZ: | 3673 case CLZ: |
3665 // MIPS32 spec: If no bits were set in GPR rs(), the result written to | 3674 // MIPS32 spec: If no bits were set in GPR rs(), the result written to |
3666 // GPR rd is 32. | 3675 // GPR rd is 32. |
3667 alu_out = base::bits::CountLeadingZeros32(static_cast<uint32_t>(rs_u())); | 3676 alu_out = base::bits::CountLeadingZeros32(static_cast<uint32_t>(rs_u())); |
3668 set_register(rd_reg(), alu_out); | 3677 SetResult(rd_reg(), alu_out); |
| 3678 break; |
| 3679 case DCLZ: |
| 3680 // MIPS64 spec: If no bits were set in GPR rs(), the result written to |
| 3681 // GPR rd is 64. |
| 3682 alu_out = base::bits::CountLeadingZeros64(static_cast<uint64_t>(rs_u())); |
| 3683 SetResult(rd_reg(), alu_out); |
3669 break; | 3684 break; |
3670 default: | 3685 default: |
3671 alu_out = 0x12345678; | 3686 alu_out = 0x12345678; |
3672 UNREACHABLE(); | 3687 UNREACHABLE(); |
3673 } | 3688 } |
3674 } | 3689 } |
3675 | 3690 |
3676 | 3691 |
3677 void Simulator::DecodeTypeRegisterSPECIAL3() { | 3692 void Simulator::DecodeTypeRegisterSPECIAL3() { |
3678 int64_t alu_out; | 3693 int64_t alu_out; |
(...skipping 874 matching lines...) Loading... |
4553 } | 4568 } |
4554 | 4569 |
4555 | 4570 |
4556 #undef UNSUPPORTED | 4571 #undef UNSUPPORTED |
4557 } // namespace internal | 4572 } // namespace internal |
4558 } // namespace v8 | 4573 } // namespace v8 |
4559 | 4574 |
4560 #endif // USE_SIMULATOR | 4575 #endif // USE_SIMULATOR |
4561 | 4576 |
4562 #endif // V8_TARGET_ARCH_MIPS64 | 4577 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |