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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/base/division-by-constant.h" |
10 #include "src/bootstrapper.h" | 11 #include "src/bootstrapper.h" |
11 #include "src/codegen.h" | 12 #include "src/codegen.h" |
12 #include "src/cpu-profiler.h" | 13 #include "src/cpu-profiler.h" |
13 #include "src/debug.h" | 14 #include "src/debug.h" |
14 #include "src/isolate-inl.h" | 15 #include "src/isolate-inl.h" |
15 #include "src/runtime.h" | 16 #include "src/runtime.h" |
16 | 17 |
17 namespace v8 { | 18 namespace v8 { |
18 namespace internal { | 19 namespace internal { |
19 | 20 |
(...skipping 5305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5325 isolate->code_aging_helper()->IsOld(sequence)); | 5326 isolate->code_aging_helper()->IsOld(sequence)); |
5326 return is_young; | 5327 return is_young; |
5327 } | 5328 } |
5328 | 5329 |
5329 | 5330 |
5330 void MacroAssembler::TruncatingDiv(Register result, | 5331 void MacroAssembler::TruncatingDiv(Register result, |
5331 Register dividend, | 5332 Register dividend, |
5332 int32_t divisor) { | 5333 int32_t divisor) { |
5333 DCHECK(!AreAliased(result, dividend)); | 5334 DCHECK(!AreAliased(result, dividend)); |
5334 DCHECK(result.Is32Bits() && dividend.Is32Bits()); | 5335 DCHECK(result.Is32Bits() && dividend.Is32Bits()); |
5335 MultiplierAndShift ms(divisor); | 5336 base::MagicNumbersForDivision<uint32_t> mag = |
5336 Mov(result, ms.multiplier()); | 5337 base::SignedDivisionByConstant(static_cast<uint32_t>(divisor)); |
| 5338 Mov(result, mag.multiplier); |
5337 Smull(result.X(), dividend, result); | 5339 Smull(result.X(), dividend, result); |
5338 Asr(result.X(), result.X(), 32); | 5340 Asr(result.X(), result.X(), 32); |
5339 if (divisor > 0 && ms.multiplier() < 0) Add(result, result, dividend); | 5341 bool neg = (mag.multiplier & (static_cast<uint32_t>(1) << 31)) != 0; |
5340 if (divisor < 0 && ms.multiplier() > 0) Sub(result, result, dividend); | 5342 if (divisor > 0 && neg) Add(result, result, dividend); |
5341 if (ms.shift() > 0) Asr(result, result, ms.shift()); | 5343 if (divisor < 0 && !neg && mag.multiplier > 0) Sub(result, result, dividend); |
| 5344 if (mag.shift > 0) Asr(result, result, mag.shift); |
5342 Add(result, result, Operand(dividend, LSR, 31)); | 5345 Add(result, result, Operand(dividend, LSR, 31)); |
5343 } | 5346 } |
5344 | 5347 |
5345 | 5348 |
5346 #undef __ | 5349 #undef __ |
5347 | 5350 |
5348 | 5351 |
5349 UseScratchRegisterScope::~UseScratchRegisterScope() { | 5352 UseScratchRegisterScope::~UseScratchRegisterScope() { |
5350 available_->set_list(old_available_); | 5353 available_->set_list(old_available_); |
5351 availablefp_->set_list(old_availablefp_); | 5354 availablefp_->set_list(old_availablefp_); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5425 } | 5428 } |
5426 } | 5429 } |
5427 | 5430 |
5428 | 5431 |
5429 #undef __ | 5432 #undef __ |
5430 | 5433 |
5431 | 5434 |
5432 } } // namespace v8::internal | 5435 } } // namespace v8::internal |
5433 | 5436 |
5434 #endif // V8_TARGET_ARCH_ARM64 | 5437 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |