OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "src/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
6 #include "src/compiler/code-generator.h" | 6 #include "src/compiler/code-generator.h" |
7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/osr.h" | 10 #include "src/compiler/osr.h" |
(...skipping 1476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1487 case kMips64RoundWS: { | 1487 case kMips64RoundWS: { |
1488 FPURegister scratch = kScratchDoubleReg; | 1488 FPURegister scratch = kScratchDoubleReg; |
1489 __ round_w_s(scratch, i.InputDoubleRegister(0)); | 1489 __ round_w_s(scratch, i.InputDoubleRegister(0)); |
1490 __ mfc1(i.OutputRegister(), scratch); | 1490 __ mfc1(i.OutputRegister(), scratch); |
1491 break; | 1491 break; |
1492 } | 1492 } |
1493 case kMips64TruncWS: { | 1493 case kMips64TruncWS: { |
1494 FPURegister scratch = kScratchDoubleReg; | 1494 FPURegister scratch = kScratchDoubleReg; |
1495 __ trunc_w_s(scratch, i.InputDoubleRegister(0)); | 1495 __ trunc_w_s(scratch, i.InputDoubleRegister(0)); |
1496 __ mfc1(i.OutputRegister(), scratch); | 1496 __ mfc1(i.OutputRegister(), scratch); |
| 1497 // Avoid INT32_MAX as an overflow indicator and use INT32_MIN instead, |
| 1498 // because INT32_MIN allows easier out-of-bounds detection. |
| 1499 __ addiu(kScratchReg, i.OutputRegister(), 1); |
| 1500 __ slt(kScratchReg2, kScratchReg, i.OutputRegister()); |
| 1501 __ Movn(i.OutputRegister(), kScratchReg, kScratchReg2); |
1497 break; | 1502 break; |
1498 } | 1503 } |
1499 case kMips64TruncLS: { | 1504 case kMips64TruncLS: { |
1500 FPURegister scratch = kScratchDoubleReg; | 1505 FPURegister scratch = kScratchDoubleReg; |
1501 Register tmp_fcsr = kScratchReg; | 1506 Register tmp_fcsr = kScratchReg; |
1502 Register result = kScratchReg2; | 1507 Register result = kScratchReg2; |
1503 | 1508 |
1504 bool load_status = instr->OutputCount() > 1; | 1509 bool load_status = instr->OutputCount() > 1; |
1505 if (load_status) { | 1510 if (load_status) { |
1506 // Save FCSR. | 1511 // Save FCSR. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 case kMips64TruncUwD: { | 1560 case kMips64TruncUwD: { |
1556 FPURegister scratch = kScratchDoubleReg; | 1561 FPURegister scratch = kScratchDoubleReg; |
1557 // TODO(plind): Fix wrong param order of Trunc_uw_d() macro-asm function. | 1562 // TODO(plind): Fix wrong param order of Trunc_uw_d() macro-asm function. |
1558 __ Trunc_uw_d(i.InputDoubleRegister(0), i.OutputRegister(), scratch); | 1563 __ Trunc_uw_d(i.InputDoubleRegister(0), i.OutputRegister(), scratch); |
1559 break; | 1564 break; |
1560 } | 1565 } |
1561 case kMips64TruncUwS: { | 1566 case kMips64TruncUwS: { |
1562 FPURegister scratch = kScratchDoubleReg; | 1567 FPURegister scratch = kScratchDoubleReg; |
1563 // TODO(plind): Fix wrong param order of Trunc_uw_d() macro-asm function. | 1568 // TODO(plind): Fix wrong param order of Trunc_uw_d() macro-asm function. |
1564 __ Trunc_uw_s(i.InputDoubleRegister(0), i.OutputRegister(), scratch); | 1569 __ Trunc_uw_s(i.InputDoubleRegister(0), i.OutputRegister(), scratch); |
| 1570 // Avoid UINT32_MAX as an overflow indicator and use 0 instead, |
| 1571 // because 0 allows easier out-of-bounds detection. |
| 1572 __ addiu(kScratchReg, i.OutputRegister(), 1); |
| 1573 __ Movz(i.OutputRegister(), zero_reg, kScratchReg); |
1565 break; | 1574 break; |
1566 } | 1575 } |
1567 case kMips64TruncUlS: { | 1576 case kMips64TruncUlS: { |
1568 FPURegister scratch = kScratchDoubleReg; | 1577 FPURegister scratch = kScratchDoubleReg; |
1569 Register result = instr->OutputCount() > 1 ? i.OutputRegister(1) : no_reg; | 1578 Register result = instr->OutputCount() > 1 ? i.OutputRegister(1) : no_reg; |
1570 // TODO(plind): Fix wrong param order of Trunc_ul_s() macro-asm function. | 1579 // TODO(plind): Fix wrong param order of Trunc_ul_s() macro-asm function. |
1571 __ Trunc_ul_s(i.InputDoubleRegister(0), i.OutputRegister(), scratch, | 1580 __ Trunc_ul_s(i.InputDoubleRegister(0), i.OutputRegister(), scratch, |
1572 result); | 1581 result); |
1573 break; | 1582 break; |
1574 } | 1583 } |
(...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2383 padding_size -= v8::internal::Assembler::kInstrSize; | 2392 padding_size -= v8::internal::Assembler::kInstrSize; |
2384 } | 2393 } |
2385 } | 2394 } |
2386 } | 2395 } |
2387 | 2396 |
2388 #undef __ | 2397 #undef __ |
2389 | 2398 |
2390 } // namespace compiler | 2399 } // namespace compiler |
2391 } // namespace internal | 2400 } // namespace internal |
2392 } // namespace v8 | 2401 } // namespace v8 |
OLD | NEW |