Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(477)

Side by Side Diff: src/mips64/simulator-mips64.cc

Issue 1785923011: MIPS64: Followup 'MIPS64: Use BOVC/BNVC for overflow checking on r6.' (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 11
12 #include "src/assembler.h" 12 #include "src/assembler.h"
13 #include "src/base/bits.h" 13 #include "src/base/bits.h"
14 #include "src/codegen.h" 14 #include "src/codegen.h"
15 #include "src/disasm.h" 15 #include "src/disasm.h"
16 #include "src/mips64/constants-mips64.h" 16 #include "src/mips64/constants-mips64.h"
17 #include "src/mips64/simulator-mips64.h" 17 #include "src/mips64/simulator-mips64.h"
18 #include "src/ostreams.h" 18 #include "src/ostreams.h"
19 #include "src/runtime/runtime-utils.h" 19 #include "src/runtime/runtime-utils.h"
20 20
21 // Only build the simulator if not compiling for real MIPS hardware. 21 // Only build the simulator if not compiling for real MIPS hardware.
22 #if defined(USE_SIMULATOR) 22 #if defined(USE_SIMULATOR)
23 23
24 namespace v8 { 24 namespace v8 {
25 namespace internal { 25 namespace internal {
26 26
27 // Utils functions. 27 // Util functions.
28 bool HaveSameSign(int64_t a, int64_t b) { 28 inline bool HaveSameSign(int64_t a, int64_t b) { return ((a ^ b) >= 0); }
29 return ((a ^ b) >= 0);
30 }
31
32 29
33 uint32_t get_fcsr_condition_bit(uint32_t cc) { 30 uint32_t get_fcsr_condition_bit(uint32_t cc) {
34 if (cc == 0) { 31 if (cc == 0) {
35 return 23; 32 return 23;
36 } else { 33 } else {
37 return 24 + cc; 34 return 24 + cc;
38 } 35 }
39 } 36 }
40 37
41 38
(...skipping 4280 matching lines...) Expand 10 before | Expand all | Expand 10 after
4322 break; 4319 break;
4323 case BC: 4320 case BC:
4324 BranchCompactHelper(true, 26); 4321 BranchCompactHelper(true, 26);
4325 break; 4322 break;
4326 case BALC: 4323 case BALC:
4327 BranchAndLinkCompactHelper(true, 26); 4324 BranchAndLinkCompactHelper(true, 26);
4328 break; 4325 break;
4329 case POP10: // BOVC, BEQZALC, BEQC / ADDI (pre-r6) 4326 case POP10: // BOVC, BEQZALC, BEQC / ADDI (pre-r6)
4330 if (kArchVariant == kMips64r6) { 4327 if (kArchVariant == kMips64r6) {
4331 if (rs_reg >= rt_reg) { // BOVC 4328 if (rs_reg >= rt_reg) { // BOVC
4332 if (HaveSameSign(rs, rt)) { 4329 bool condition = !is_int32(rs) || !is_int32(rt) || !is_int32(rs + rt);
4333 int64_t sum = rs + rt; 4330 BranchCompactHelper(condition, 16);
4334 BranchCompactHelper(sum < INT32_MIN || sum > INT32_MAX, 16);
4335 }
4336 } else { 4331 } else {
4337 if (rs_reg == 0) { // BEQZALC 4332 if (rs_reg == 0) { // BEQZALC
4338 BranchAndLinkCompactHelper(rt == 0, 16); 4333 BranchAndLinkCompactHelper(rt == 0, 16);
4339 } else { // BEQC 4334 } else { // BEQC
4340 BranchCompactHelper(rt == rs, 16); 4335 BranchCompactHelper(rt == rs, 16);
4341 } 4336 }
4342 } 4337 }
4343 } else { // ADDI 4338 } else { // ADDI
4344 if (HaveSameSign(rs, se_imm16)) { 4339 if (HaveSameSign(rs, se_imm16)) {
4345 if (rs > 0) { 4340 if (rs > 0) {
4346 if (rs <= Registers::kMaxValue - se_imm16) { 4341 if (rs <= Registers::kMaxValue - se_imm16) {
4347 SignalException(kIntegerOverflow); 4342 SignalException(kIntegerOverflow);
4348 } 4343 }
4349 } else if (rs < 0) { 4344 } else if (rs < 0) {
4350 if (rs >= Registers::kMinValue - se_imm16) { 4345 if (rs >= Registers::kMinValue - se_imm16) {
4351 SignalException(kIntegerUnderflow); 4346 SignalException(kIntegerUnderflow);
4352 } 4347 }
4353 } 4348 }
4354 } 4349 }
4355 SetResult(rt_reg, rs + se_imm16); 4350 SetResult(rt_reg, rs + se_imm16);
4356 } 4351 }
4357 break; 4352 break;
4358 case POP30: // BNVC, BNEZALC, BNEC / DADDI (pre-r6) 4353 case POP30: // BNVC, BNEZALC, BNEC / DADDI (pre-r6)
4359 if (kArchVariant == kMips64r6) { 4354 if (kArchVariant == kMips64r6) {
4360 if (rs_reg >= rt_reg) { // BNVC 4355 if (rs_reg >= rt_reg) { // BNVC
4361 if (!HaveSameSign(rs, rt) || rs == 0 || rt == 0) { 4356 bool condition = is_int32(rs) && is_int32(rt) && is_int32(rs + rt);
4362 BranchCompactHelper(true, 16); 4357 BranchCompactHelper(condition, 16);
4363 } else {
4364 int64_t sum = rs + rt;
4365 BranchCompactHelper(sum >= INT32_MIN && sum <= INT32_MAX, 16);
4366 }
4367 } else { 4358 } else {
4368 if (rs_reg == 0) { // BNEZALC 4359 if (rs_reg == 0) { // BNEZALC
4369 BranchAndLinkCompactHelper(rt != 0, 16); 4360 BranchAndLinkCompactHelper(rt != 0, 16);
4370 } else { // BNEC 4361 } else { // BNEC
4371 BranchCompactHelper(rt != rs, 16); 4362 BranchCompactHelper(rt != rs, 16);
4372 } 4363 }
4373 } 4364 }
4374 } 4365 }
4375 break; 4366 break;
4376 // ------------- Arithmetic instructions. 4367 // ------------- Arithmetic instructions.
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
4855 } 4846 }
4856 4847
4857 4848
4858 #undef UNSUPPORTED 4849 #undef UNSUPPORTED
4859 } // namespace internal 4850 } // namespace internal
4860 } // namespace v8 4851 } // namespace v8
4861 4852
4862 #endif // USE_SIMULATOR 4853 #endif // USE_SIMULATOR
4863 4854
4864 #endif // V8_TARGET_ARCH_MIPS64 4855 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698