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

Side by Side Diff: src/code-stub-assembler.cc

Issue 2560663002: [stubs] Fix issues found by the machine graph verifier in load/store IC stubs. (Closed)
Patch Set: Created 4 years 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
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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 #include "src/code-stub-assembler.h" 4 #include "src/code-stub-assembler.h"
5 #include "src/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/frames-inl.h" 6 #include "src/frames-inl.h"
7 #include "src/frames.h" 7 #include "src/frames.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 } 424 }
425 return BitcastWordToTaggedSigned(WordShl(value, SmiShiftBitsConstant())); 425 return BitcastWordToTaggedSigned(WordShl(value, SmiShiftBitsConstant()));
426 } 426 }
427 427
428 Node* CodeStubAssembler::SmiUntag(Node* value) { 428 Node* CodeStubAssembler::SmiUntag(Node* value) {
429 return WordSar(BitcastTaggedToWord(value), SmiShiftBitsConstant()); 429 return WordSar(BitcastTaggedToWord(value), SmiShiftBitsConstant());
430 } 430 }
431 431
432 Node* CodeStubAssembler::SmiToWord32(Node* value) { 432 Node* CodeStubAssembler::SmiToWord32(Node* value) {
433 Node* result = SmiUntag(value); 433 Node* result = SmiUntag(value);
434 if (Is64()) { 434 return TruncateWordToWord32(result);
435 result = TruncateInt64ToInt32(result);
436 }
437 return result;
438 } 435 }
439 436
440 Node* CodeStubAssembler::SmiToFloat64(Node* value) { 437 Node* CodeStubAssembler::SmiToFloat64(Node* value) {
441 return ChangeInt32ToFloat64(SmiToWord32(value)); 438 return ChangeInt32ToFloat64(SmiToWord32(value));
442 } 439 }
443 440
444 Node* CodeStubAssembler::SmiAdd(Node* a, Node* b) { 441 Node* CodeStubAssembler::SmiAdd(Node* a, Node* b) {
445 return BitcastWordToTaggedSigned( 442 return BitcastWordToTaggedSigned(
446 IntPtrAdd(BitcastTaggedToWord(a), BitcastTaggedToWord(b))); 443 IntPtrAdd(BitcastTaggedToWord(a), BitcastTaggedToWord(b)));
447 } 444 }
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 Node* value = Float64Mul(var_lhs_float64.value(), var_rhs_float64.value()); 598 Node* value = Float64Mul(var_lhs_float64.value(), var_rhs_float64.value());
602 Node* result = AllocateHeapNumberWithValue(value); 599 Node* result = AllocateHeapNumberWithValue(value);
603 var_result.Bind(result); 600 var_result.Bind(result);
604 Goto(&return_result); 601 Goto(&return_result);
605 } 602 }
606 603
607 Bind(&return_result); 604 Bind(&return_result);
608 return var_result.value(); 605 return var_result.value();
609 } 606 }
610 607
608 Node* CodeStubAssembler::TruncateWordToWord32(Node* value) {
609 if (Is64()) {
610 return TruncateInt64ToInt32(value);
611 }
612 return value;
613 }
614
611 Node* CodeStubAssembler::TaggedIsSmi(Node* a) { 615 Node* CodeStubAssembler::TaggedIsSmi(Node* a) {
612 return WordEqual(WordAnd(BitcastTaggedToWord(a), IntPtrConstant(kSmiTagMask)), 616 return WordEqual(WordAnd(BitcastTaggedToWord(a), IntPtrConstant(kSmiTagMask)),
613 IntPtrConstant(0)); 617 IntPtrConstant(0));
614 } 618 }
615 619
616 Node* CodeStubAssembler::TaggedIsNotSmi(Node* a) { 620 Node* CodeStubAssembler::TaggedIsNotSmi(Node* a) {
617 return WordNotEqual( 621 return WordNotEqual(
618 WordAnd(BitcastTaggedToWord(a), IntPtrConstant(kSmiTagMask)), 622 WordAnd(BitcastTaggedToWord(a), IntPtrConstant(kSmiTagMask)),
619 IntPtrConstant(0)); 623 IntPtrConstant(0));
620 } 624 }
(...skipping 2001 matching lines...) Expand 10 before | Expand all | Expand 10 after
2622 Branch(overflow, &if_overflow, &if_notoverflow); 2626 Branch(overflow, &if_overflow, &if_notoverflow);
2623 Bind(&if_overflow); 2627 Bind(&if_overflow);
2624 { 2628 {
2625 Node* value64 = ChangeInt32ToFloat64(value); 2629 Node* value64 = ChangeInt32ToFloat64(value);
2626 Node* result = AllocateHeapNumberWithValue(value64); 2630 Node* result = AllocateHeapNumberWithValue(value64);
2627 var_result.Bind(result); 2631 var_result.Bind(result);
2628 } 2632 }
2629 Goto(&if_join); 2633 Goto(&if_join);
2630 Bind(&if_notoverflow); 2634 Bind(&if_notoverflow);
2631 { 2635 {
2632 Node* result = Projection(0, pair); 2636 Node* result = BitcastWordToTaggedSigned(Projection(0, pair));
2633 var_result.Bind(result); 2637 var_result.Bind(result);
2634 } 2638 }
2635 Goto(&if_join); 2639 Goto(&if_join);
2636 Bind(&if_join); 2640 Bind(&if_join);
2637 return var_result.value(); 2641 return var_result.value();
2638 } 2642 }
2639 2643
2640 Node* CodeStubAssembler::ChangeUint32ToTagged(Node* value) { 2644 Node* CodeStubAssembler::ChangeUint32ToTagged(Node* value) {
2641 Label if_overflow(this, Label::kDeferred), if_not_overflow(this), 2645 Label if_overflow(this, Label::kDeferred), if_not_overflow(this),
2642 if_join(this); 2646 if_join(this);
2643 Variable var_result(this, MachineRepresentation::kTagged); 2647 Variable var_result(this, MachineRepresentation::kTagged);
2644 // If {value} > 2^31 - 1, we need to store it in a HeapNumber. 2648 // If {value} > 2^31 - 1, we need to store it in a HeapNumber.
2645 Branch(Uint32LessThan(Int32Constant(Smi::kMaxValue), value), &if_overflow, 2649 Branch(Uint32LessThan(Int32Constant(Smi::kMaxValue), value), &if_overflow,
2646 &if_not_overflow); 2650 &if_not_overflow);
2647 2651
2648 Bind(&if_not_overflow); 2652 Bind(&if_not_overflow);
2649 { 2653 {
2650 if (Is64()) { 2654 if (Is64()) {
2651 var_result.Bind(SmiTag(ChangeUint32ToUint64(value))); 2655 var_result.Bind(SmiTag(ChangeUint32ToUint64(value)));
2652 } else { 2656 } else {
2653 // If tagging {value} results in an overflow, we need to use a HeapNumber 2657 // If tagging {value} results in an overflow, we need to use a HeapNumber
2654 // to represent it. 2658 // to represent it.
2655 Node* pair = Int32AddWithOverflow(value, value); 2659 Node* pair = Int32AddWithOverflow(value, value);
2656 Node* overflow = Projection(1, pair); 2660 Node* overflow = Projection(1, pair);
2657 GotoIf(overflow, &if_overflow); 2661 GotoIf(overflow, &if_overflow);
2658 2662
2659 Node* result = Projection(0, pair); 2663 Node* result = BitcastWordToTaggedSigned(Projection(0, pair));
2660 var_result.Bind(result); 2664 var_result.Bind(result);
2661 } 2665 }
2662 } 2666 }
2663 Goto(&if_join); 2667 Goto(&if_join);
2664 2668
2665 Bind(&if_overflow); 2669 Bind(&if_overflow);
2666 { 2670 {
2667 Node* float64_value = ChangeUint32ToFloat64(value); 2671 Node* float64_value = ChangeUint32ToFloat64(value);
2668 var_result.Bind(AllocateHeapNumberWithValue(float64_value)); 2672 var_result.Bind(AllocateHeapNumberWithValue(float64_value));
2669 } 2673 }
(...skipping 1785 matching lines...) Expand 10 before | Expand all | Expand 10 after
4455 } 4459 }
4456 4460
4457 // Instantiate template methods to workaround GCC compilation issue. 4461 // Instantiate template methods to workaround GCC compilation issue.
4458 template void CodeStubAssembler::NameDictionaryLookup<NameDictionary>( 4462 template void CodeStubAssembler::NameDictionaryLookup<NameDictionary>(
4459 Node*, Node*, Label*, Variable*, Label*, int, LookupMode); 4463 Node*, Node*, Label*, Variable*, Label*, int, LookupMode);
4460 template void CodeStubAssembler::NameDictionaryLookup<GlobalDictionary>( 4464 template void CodeStubAssembler::NameDictionaryLookup<GlobalDictionary>(
4461 Node*, Node*, Label*, Variable*, Label*, int, LookupMode); 4465 Node*, Node*, Label*, Variable*, Label*, int, LookupMode);
4462 4466
4463 Node* CodeStubAssembler::ComputeIntegerHash(Node* key, Node* seed) { 4467 Node* CodeStubAssembler::ComputeIntegerHash(Node* key, Node* seed) {
4464 // See v8::internal::ComputeIntegerHash() 4468 // See v8::internal::ComputeIntegerHash()
4465 Node* hash = key; 4469 Node* hash = TruncateWordToWord32(key);
4466 hash = Word32Xor(hash, seed); 4470 hash = Word32Xor(hash, seed);
4467 hash = Int32Add(Word32Xor(hash, Int32Constant(0xffffffff)), 4471 hash = Int32Add(Word32Xor(hash, Int32Constant(0xffffffff)),
4468 Word32Shl(hash, Int32Constant(15))); 4472 Word32Shl(hash, Int32Constant(15)));
4469 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(12))); 4473 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(12)));
4470 hash = Int32Add(hash, Word32Shl(hash, Int32Constant(2))); 4474 hash = Int32Add(hash, Word32Shl(hash, Int32Constant(2)));
4471 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(4))); 4475 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(4)));
4472 hash = Int32Mul(hash, Int32Constant(2057)); 4476 hash = Int32Mul(hash, Int32Constant(2057));
4473 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(16))); 4477 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(16)));
4474 return Word32And(hash, Int32Constant(0x3fffffff)); 4478 return Word32And(hash, Int32Constant(0x3fffffff));
4475 } 4479 }
(...skipping 3746 matching lines...) Expand 10 before | Expand all | Expand 10 after
8222 8226
8223 Node* CodeStubAssembler::IsDebugActive() { 8227 Node* CodeStubAssembler::IsDebugActive() {
8224 Node* is_debug_active = Load( 8228 Node* is_debug_active = Load(
8225 MachineType::Uint8(), 8229 MachineType::Uint8(),
8226 ExternalConstant(ExternalReference::debug_is_active_address(isolate()))); 8230 ExternalConstant(ExternalReference::debug_is_active_address(isolate())));
8227 return WordNotEqual(is_debug_active, Int32Constant(0)); 8231 return WordNotEqual(is_debug_active, Int32Constant(0));
8228 } 8232 }
8229 8233
8230 } // namespace internal 8234 } // namespace internal
8231 } // namespace v8 8235 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698