OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "arm64/lithium-codegen-arm64.h" | 7 #include "arm64/lithium-codegen-arm64.h" |
8 #include "arm64/lithium-gap-resolver-arm64.h" | 8 #include "arm64/lithium-gap-resolver-arm64.h" |
9 #include "code-stubs.h" | 9 #include "code-stubs.h" |
10 #include "stub-cache.h" | 10 #include "stub-cache.h" |
(...skipping 3852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3863 __ Fccmp(input, input, NoFlag, eq); | 3863 __ Fccmp(input, input, NoFlag, eq); |
3864 DeoptimizeIf(ne, instr->environment()); | 3864 DeoptimizeIf(ne, instr->environment()); |
3865 } | 3865 } |
3866 | 3866 |
3867 | 3867 |
3868 void LCodeGen::DoFlooringDivByPowerOf2I(LFlooringDivByPowerOf2I* instr) { | 3868 void LCodeGen::DoFlooringDivByPowerOf2I(LFlooringDivByPowerOf2I* instr) { |
3869 Register dividend = ToRegister32(instr->dividend()); | 3869 Register dividend = ToRegister32(instr->dividend()); |
3870 Register result = ToRegister32(instr->result()); | 3870 Register result = ToRegister32(instr->result()); |
3871 int32_t divisor = instr->divisor(); | 3871 int32_t divisor = instr->divisor(); |
3872 | 3872 |
| 3873 // If the divisor is 1, return the dividend. |
| 3874 if (divisor == 1) { |
| 3875 __ Mov(result, dividend, kDiscardForSameWReg); |
| 3876 return; |
| 3877 } |
| 3878 |
3873 // If the divisor is positive, things are easy: There can be no deopts and we | 3879 // If the divisor is positive, things are easy: There can be no deopts and we |
3874 // can simply do an arithmetic right shift. | 3880 // can simply do an arithmetic right shift. |
3875 if (divisor == 1) return; | |
3876 int32_t shift = WhichPowerOf2Abs(divisor); | 3881 int32_t shift = WhichPowerOf2Abs(divisor); |
3877 if (divisor > 1) { | 3882 if (divisor > 1) { |
3878 __ Mov(result, Operand(dividend, ASR, shift)); | 3883 __ Mov(result, Operand(dividend, ASR, shift)); |
3879 return; | 3884 return; |
3880 } | 3885 } |
3881 | 3886 |
3882 // If the divisor is negative, we have to negate and handle edge cases. | 3887 // If the divisor is negative, we have to negate and handle edge cases. |
3883 __ Negs(result, dividend); | 3888 __ Negs(result, dividend); |
3884 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { | 3889 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
3885 DeoptimizeIf(eq, instr->environment()); | 3890 DeoptimizeIf(eq, instr->environment()); |
3886 } | 3891 } |
3887 | 3892 |
3888 // If the negation could not overflow, simply shifting is OK. | 3893 // If the negation could not overflow, simply shifting is OK. |
3889 if (!instr->hydrogen()->CheckFlag(HValue::kLeftCanBeMinInt)) { | 3894 if (!instr->hydrogen()->CheckFlag(HValue::kLeftCanBeMinInt)) { |
3890 __ Mov(result, Operand(dividend, ASR, shift)); | 3895 __ Mov(result, Operand(dividend, ASR, shift)); |
3891 return; | 3896 return; |
3892 } | 3897 } |
3893 | 3898 |
3894 // Dividing by -1 is basically negation, unless we overflow. | 3899 // Dividing by -1 is basically negation, unless we overflow. |
3895 if (divisor == -1) { | 3900 if (divisor == -1) { |
3896 DeoptimizeIf(vs, instr->environment()); | 3901 DeoptimizeIf(vs, instr->environment()); |
3897 return; | 3902 return; |
3898 } | 3903 } |
3899 | 3904 |
3900 // Using a conditional data processing instruction would need 1 more register. | 3905 __ Asr(result, dividend, shift); |
3901 Label not_kmin_int, done; | 3906 __ Csel(result, result, kMinInt / divisor, vc); |
3902 __ B(vc, ¬_kmin_int); | |
3903 __ Mov(result, kMinInt / divisor); | |
3904 __ B(&done); | |
3905 __ bind(¬_kmin_int); | |
3906 __ Mov(result, Operand(dividend, ASR, shift)); | |
3907 __ bind(&done); | |
3908 } | 3907 } |
3909 | 3908 |
3910 | 3909 |
3911 void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) { | 3910 void LCodeGen::DoFlooringDivByConstI(LFlooringDivByConstI* instr) { |
3912 Register dividend = ToRegister32(instr->dividend()); | 3911 Register dividend = ToRegister32(instr->dividend()); |
3913 int32_t divisor = instr->divisor(); | 3912 int32_t divisor = instr->divisor(); |
3914 Register result = ToRegister32(instr->result()); | 3913 Register result = ToRegister32(instr->result()); |
3915 ASSERT(!AreAliased(dividend, result)); | 3914 ASSERT(!AreAliased(dividend, result)); |
3916 | 3915 |
3917 if (divisor == 0) { | 3916 if (divisor == 0) { |
(...skipping 2083 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6001 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 6000 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
6002 // Index is equal to negated out of object property index plus 1. | 6001 // Index is equal to negated out of object property index plus 1. |
6003 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 6002 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
6004 __ Ldr(result, FieldMemOperand(result, | 6003 __ Ldr(result, FieldMemOperand(result, |
6005 FixedArray::kHeaderSize - kPointerSize)); | 6004 FixedArray::kHeaderSize - kPointerSize)); |
6006 __ Bind(deferred->exit()); | 6005 __ Bind(deferred->exit()); |
6007 __ Bind(&done); | 6006 __ Bind(&done); |
6008 } | 6007 } |
6009 | 6008 |
6010 } } // namespace v8::internal | 6009 } } // namespace v8::internal |
OLD | NEW |