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

Side by Side Diff: src/arm64/lithium-codegen-arm64.cc

Issue 528993002: First step to cleanup the power-of-2 mess. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: clang-format Created 6 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « src/arm64/lithium-arm64.cc ('k') | src/arm64/macro-assembler-arm64.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/arm64/lithium-codegen-arm64.h" 7 #include "src/arm64/lithium-codegen-arm64.h"
8 #include "src/arm64/lithium-gap-resolver-arm64.h" 8 #include "src/arm64/lithium-gap-resolver-arm64.h"
9 #include "src/base/bits.h"
9 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
10 #include "src/hydrogen-osr.h" 11 #include "src/hydrogen-osr.h"
11 12
12 namespace v8 { 13 namespace v8 {
13 namespace internal { 14 namespace internal {
14 15
15 16
16 class SafepointGenerator FINAL : public CallWrapper { 17 class SafepointGenerator FINAL : public CallWrapper {
17 public: 18 public:
18 SafepointGenerator(LCodeGen* codegen, 19 SafepointGenerator(LCodeGen* codegen,
(...skipping 2210 matching lines...) Expand 10 before | Expand all | Expand 10 after
2229 // If we are below the lower bound, set the C flag and clear the Z flag 2230 // If we are below the lower bound, set the C flag and clear the Z flag
2230 // to force a deopt. 2231 // to force a deopt.
2231 __ Ccmp(scratch, last, CFlag, hs); 2232 __ Ccmp(scratch, last, CFlag, hs);
2232 DeoptimizeIf(hi, instr->environment()); 2233 DeoptimizeIf(hi, instr->environment());
2233 } 2234 }
2234 } else { 2235 } else {
2235 uint8_t mask; 2236 uint8_t mask;
2236 uint8_t tag; 2237 uint8_t tag;
2237 instr->hydrogen()->GetCheckMaskAndTag(&mask, &tag); 2238 instr->hydrogen()->GetCheckMaskAndTag(&mask, &tag);
2238 2239
2239 if (IsPowerOf2(mask)) { 2240 if (base::bits::IsPowerOfTwo32(mask)) {
2240 DCHECK((tag == 0) || (tag == mask)); 2241 DCHECK((tag == 0) || (tag == mask));
2241 if (tag == 0) { 2242 if (tag == 0) {
2242 DeoptimizeIfBitSet(scratch, MaskToBit(mask), instr->environment()); 2243 DeoptimizeIfBitSet(scratch, MaskToBit(mask), instr->environment());
2243 } else { 2244 } else {
2244 DeoptimizeIfBitClear(scratch, MaskToBit(mask), instr->environment()); 2245 DeoptimizeIfBitClear(scratch, MaskToBit(mask), instr->environment());
2245 } 2246 }
2246 } else { 2247 } else {
2247 if (tag == 0) { 2248 if (tag == 0) {
2248 __ Tst(scratch, mask); 2249 __ Tst(scratch, mask);
2249 } else { 2250 } else {
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
2662 2663
2663 Comment(";;; deoptimize: %s", instr->hydrogen()->reason()); 2664 Comment(";;; deoptimize: %s", instr->hydrogen()->reason());
2664 Deoptimize(instr->environment(), &type); 2665 Deoptimize(instr->environment(), &type);
2665 } 2666 }
2666 2667
2667 2668
2668 void LCodeGen::DoDivByPowerOf2I(LDivByPowerOf2I* instr) { 2669 void LCodeGen::DoDivByPowerOf2I(LDivByPowerOf2I* instr) {
2669 Register dividend = ToRegister32(instr->dividend()); 2670 Register dividend = ToRegister32(instr->dividend());
2670 int32_t divisor = instr->divisor(); 2671 int32_t divisor = instr->divisor();
2671 Register result = ToRegister32(instr->result()); 2672 Register result = ToRegister32(instr->result());
2672 DCHECK(divisor == kMinInt || IsPowerOf2(Abs(divisor))); 2673 DCHECK(divisor == kMinInt || base::bits::IsPowerOfTwo32(Abs(divisor)));
2673 DCHECK(!result.is(dividend)); 2674 DCHECK(!result.is(dividend));
2674 2675
2675 // Check for (0 / -x) that will produce negative zero. 2676 // Check for (0 / -x) that will produce negative zero.
2676 HDiv* hdiv = instr->hydrogen(); 2677 HDiv* hdiv = instr->hydrogen();
2677 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) { 2678 if (hdiv->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) {
2678 DeoptimizeIfZero(dividend, instr->environment()); 2679 DeoptimizeIfZero(dividend, instr->environment());
2679 } 2680 }
2680 // Check for (kMinInt / -1). 2681 // Check for (kMinInt / -1).
2681 if (hdiv->CheckFlag(HValue::kCanOverflow) && divisor == -1) { 2682 if (hdiv->CheckFlag(HValue::kCanOverflow) && divisor == -1) {
2682 // Test dividend for kMinInt by subtracting one (cmp) and checking for 2683 // Test dividend for kMinInt by subtracting one (cmp) and checking for
(...skipping 1670 matching lines...) Expand 10 before | Expand all | Expand 10 after
4353 } else { 4354 } else {
4354 __ Add(result, left, left); 4355 __ Add(result, left, left);
4355 } 4356 }
4356 break; 4357 break;
4357 4358
4358 default: 4359 default:
4359 // Multiplication by constant powers of two (and some related values) 4360 // Multiplication by constant powers of two (and some related values)
4360 // can be done efficiently with shifted operands. 4361 // can be done efficiently with shifted operands.
4361 int32_t right_abs = Abs(right); 4362 int32_t right_abs = Abs(right);
4362 4363
4363 if (IsPowerOf2(right_abs)) { 4364 if (base::bits::IsPowerOfTwo32(right_abs)) {
4364 int right_log2 = WhichPowerOf2(right_abs); 4365 int right_log2 = WhichPowerOf2(right_abs);
4365 4366
4366 if (can_overflow) { 4367 if (can_overflow) {
4367 Register scratch = result; 4368 Register scratch = result;
4368 DCHECK(!AreAliased(scratch, left)); 4369 DCHECK(!AreAliased(scratch, left));
4369 __ Cls(scratch, left); 4370 __ Cls(scratch, left);
4370 __ Cmp(scratch, right_log2); 4371 __ Cmp(scratch, right_log2);
4371 DeoptimizeIf(lt, instr->environment()); 4372 DeoptimizeIf(lt, instr->environment());
4372 } 4373 }
4373 4374
(...skipping 12 matching lines...) Expand all
4386 return; 4387 return;
4387 } 4388 }
4388 4389
4389 4390
4390 // For the following cases, we could perform a conservative overflow check 4391 // For the following cases, we could perform a conservative overflow check
4391 // with CLS as above. However the few cycles saved are likely not worth 4392 // with CLS as above. However the few cycles saved are likely not worth
4392 // the risk of deoptimizing more often than required. 4393 // the risk of deoptimizing more often than required.
4393 DCHECK(!can_overflow); 4394 DCHECK(!can_overflow);
4394 4395
4395 if (right >= 0) { 4396 if (right >= 0) {
4396 if (IsPowerOf2(right - 1)) { 4397 if (base::bits::IsPowerOfTwo32(right - 1)) {
4397 // result = left + left << log2(right - 1) 4398 // result = left + left << log2(right - 1)
4398 __ Add(result, left, Operand(left, LSL, WhichPowerOf2(right - 1))); 4399 __ Add(result, left, Operand(left, LSL, WhichPowerOf2(right - 1)));
4399 } else if (IsPowerOf2(right + 1)) { 4400 } else if (base::bits::IsPowerOfTwo32(right + 1)) {
4400 // result = -left + left << log2(right + 1) 4401 // result = -left + left << log2(right + 1)
4401 __ Sub(result, left, Operand(left, LSL, WhichPowerOf2(right + 1))); 4402 __ Sub(result, left, Operand(left, LSL, WhichPowerOf2(right + 1)));
4402 __ Neg(result, result); 4403 __ Neg(result, result);
4403 } else { 4404 } else {
4404 UNREACHABLE(); 4405 UNREACHABLE();
4405 } 4406 }
4406 } else { 4407 } else {
4407 if (IsPowerOf2(-right + 1)) { 4408 if (base::bits::IsPowerOfTwo32(-right + 1)) {
4408 // result = left - left << log2(-right + 1) 4409 // result = left - left << log2(-right + 1)
4409 __ Sub(result, left, Operand(left, LSL, WhichPowerOf2(-right + 1))); 4410 __ Sub(result, left, Operand(left, LSL, WhichPowerOf2(-right + 1)));
4410 } else if (IsPowerOf2(-right - 1)) { 4411 } else if (base::bits::IsPowerOfTwo32(-right - 1)) {
4411 // result = -left - left << log2(-right - 1) 4412 // result = -left - left << log2(-right - 1)
4412 __ Add(result, left, Operand(left, LSL, WhichPowerOf2(-right - 1))); 4413 __ Add(result, left, Operand(left, LSL, WhichPowerOf2(-right - 1)));
4413 __ Neg(result, result); 4414 __ Neg(result, result);
4414 } else { 4415 } else {
4415 UNREACHABLE(); 4416 UNREACHABLE();
4416 } 4417 }
4417 } 4418 }
4418 } 4419 }
4419 } 4420 }
4420 4421
(...skipping 1600 matching lines...) Expand 10 before | Expand all | Expand 10 after
6021 Handle<ScopeInfo> scope_info = instr->scope_info(); 6022 Handle<ScopeInfo> scope_info = instr->scope_info();
6022 __ Push(scope_info); 6023 __ Push(scope_info);
6023 __ Push(ToRegister(instr->function())); 6024 __ Push(ToRegister(instr->function()));
6024 CallRuntime(Runtime::kPushBlockContext, 2, instr); 6025 CallRuntime(Runtime::kPushBlockContext, 2, instr);
6025 RecordSafepoint(Safepoint::kNoLazyDeopt); 6026 RecordSafepoint(Safepoint::kNoLazyDeopt);
6026 } 6027 }
6027 6028
6028 6029
6029 6030
6030 } } // namespace v8::internal 6031 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm64/lithium-arm64.cc ('k') | src/arm64/macro-assembler-arm64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698