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

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

Issue 1265603002: MIPS64: Fix the integer division in crankshaft. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 4 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 | « src/mips64/lithium-codegen-mips64.cc ('k') | 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 #include "src/v8.h" 10 #include "src/v8.h"
(...skipping 3776 matching lines...) Expand 10 before | Expand all | Expand 10 after
3787 } 3787 }
3788 break; 3788 break;
3789 case DMULTU: 3789 case DMULTU:
3790 UNIMPLEMENTED_MIPS(); 3790 UNIMPLEMENTED_MIPS();
3791 break; 3791 break;
3792 case DSLL: 3792 case DSLL:
3793 set_register(rd_reg, alu_out); 3793 set_register(rd_reg, alu_out);
3794 TraceRegWr(alu_out); 3794 TraceRegWr(alu_out);
3795 break; 3795 break;
3796 case DIV: 3796 case DIV:
3797 case DDIV: 3797 case DDIV: {
3798 const int64_t int_min_value =
3799 instr->FunctionFieldRaw() == DIV ? INT_MIN : LONG_MIN;
3798 switch (kArchVariant) { 3800 switch (kArchVariant) {
3799 case kMips64r2: 3801 case kMips64r2:
3800 // Divide by zero and overflow was not checked in the 3802 // Divide by zero and overflow was not checked in the
3801 // configuration step - div and divu do not raise exceptions. On 3803 // configuration step - div and divu do not raise exceptions. On
3802 // division by 0 the result will be UNPREDICTABLE. On overflow 3804 // division by 0 the result will be UNPREDICTABLE. On overflow
3803 // (INT_MIN/-1), return INT_MIN which is what the hardware does. 3805 // (INT_MIN/-1), return INT_MIN which is what the hardware does.
3804 if (rs == INT_MIN && rt == -1) { 3806 if (rs == int_min_value && rt == -1) {
3805 set_register(LO, INT_MIN); 3807 set_register(LO, int_min_value);
3806 set_register(HI, 0); 3808 set_register(HI, 0);
3807 } else if (rt != 0) { 3809 } else if (rt != 0) {
3808 set_register(LO, rs / rt); 3810 set_register(LO, rs / rt);
3809 set_register(HI, rs % rt); 3811 set_register(HI, rs % rt);
3810 } 3812 }
3811 break; 3813 break;
3812 case kMips64r6: 3814 case kMips64r6:
3813 switch (instr->SaValue()) { 3815 switch (instr->SaValue()) {
3814 case DIV_OP: 3816 case DIV_OP:
3815 if (rs == INT_MIN && rt == -1) { 3817 if (rs == int_min_value && rt == -1) {
3816 set_register(rd_reg, INT_MIN); 3818 set_register(rd_reg, int_min_value);
3817 } else if (rt != 0) { 3819 } else if (rt != 0) {
3818 set_register(rd_reg, rs / rt); 3820 set_register(rd_reg, rs / rt);
3819 } 3821 }
3820 break; 3822 break;
3821 case MOD_OP: 3823 case MOD_OP:
3822 if (rs == INT_MIN && rt == -1) { 3824 if (rs == int_min_value && rt == -1) {
3823 set_register(rd_reg, 0); 3825 set_register(rd_reg, 0);
3824 } else if (rt != 0) { 3826 } else if (rt != 0) {
3825 set_register(rd_reg, rs % rt); 3827 set_register(rd_reg, rs % rt);
3826 } 3828 }
3827 break; 3829 break;
3828 default: 3830 default:
3829 UNIMPLEMENTED_MIPS(); 3831 UNIMPLEMENTED_MIPS();
3830 break; 3832 break;
3831 } 3833 }
3832 break; 3834 break;
3833 default: 3835 default:
3834 break; 3836 break;
3835 } 3837 }
3836 break; 3838 break;
3839 }
3837 case DIVU: 3840 case DIVU:
3838 if (rt_u != 0) { 3841 if (rt_u != 0) {
3839 set_register(LO, rs_u / rt_u); 3842 set_register(LO, rs_u / rt_u);
3840 set_register(HI, rs_u % rt_u); 3843 set_register(HI, rs_u % rt_u);
3841 } 3844 }
3842 break; 3845 break;
3843 // Break and trap instructions. 3846 // Break and trap instructions.
3844 case BREAK: 3847 case BREAK:
3845 case TGE: 3848 case TGE:
3846 case TGEU: 3849 case TGEU:
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after
4778 } 4781 }
4779 4782
4780 4783
4781 #undef UNSUPPORTED 4784 #undef UNSUPPORTED
4782 } // namespace internal 4785 } // namespace internal
4783 } // namespace v8 4786 } // namespace v8
4784 4787
4785 #endif // USE_SIMULATOR 4788 #endif // USE_SIMULATOR
4786 4789
4787 #endif // V8_TARGET_ARCH_MIPS64 4790 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips64/lithium-codegen-mips64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698