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

Side by Side Diff: runtime/vm/deopt_instructions.cc

Issue 353513002: Use range information for optimizing integer boxing and fix bug in range analysis. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 5 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 | « runtime/vm/deferred_objects.cc ('k') | runtime/vm/flow_graph_type_propagator.cc » ('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 (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/deopt_instructions.h" 5 #include "vm/deopt_instructions.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/code_patcher.h" 8 #include "vm/code_patcher.h"
9 #include "vm/intermediate_language.h" 9 #include "vm/intermediate_language.h"
10 #include "vm/locations.h" 10 #include "vm/locations.h"
(...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 return Isolate::Current()->current_zone()->PrintToString( 699 return Isolate::Current()->current_zone()->PrintToString(
700 "int64 register pair: %s,%s", Assembler::RegisterName(hi_reg_), 700 "int64 register pair: %s,%s", Assembler::RegisterName(hi_reg_),
701 Assembler::RegisterName(lo_reg_)); 701 Assembler::RegisterName(lo_reg_));
702 } 702 }
703 703
704 void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) { 704 void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
705 uint32_t lo_value = deopt_context->RegisterValue(lo_reg_); 705 uint32_t lo_value = deopt_context->RegisterValue(lo_reg_);
706 int32_t hi_value = deopt_context->RegisterValue(hi_reg_); 706 int32_t hi_value = deopt_context->RegisterValue(hi_reg_);
707 int64_t value = Utils::LowHighTo64Bits(lo_value, hi_value); 707 int64_t value = Utils::LowHighTo64Bits(lo_value, hi_value);
708 *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0); 708 *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
709 if (Smi::IsValid64(value)) { 709 if (Smi::IsValid(value)) {
710 *dest_addr = reinterpret_cast<intptr_t>( 710 *dest_addr = reinterpret_cast<intptr_t>(
711 Smi::New(static_cast<intptr_t>(value))); 711 Smi::New(static_cast<intptr_t>(value)));
712 } else { 712 } else {
713 deopt_context->DeferMintMaterialization( 713 deopt_context->DeferMintMaterialization(
714 value, reinterpret_cast<RawMint**>(dest_addr)); 714 value, reinterpret_cast<RawMint**>(dest_addr));
715 } 715 }
716 } 716 }
717 717
718 static const intptr_t kFieldWidth = kBitsPerWord / 2; 718 static const intptr_t kFieldWidth = kBitsPerWord / 2;
719 class LoRegister : public BitField<intptr_t, 0, kFieldWidth> { }; 719 class LoRegister : public BitField<intptr_t, 0, kFieldWidth> { };
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 intptr_t lo_source_index = 761 intptr_t lo_source_index =
762 deopt_context->source_frame_size() - lo_slot_ - 1; 762 deopt_context->source_frame_size() - lo_slot_ - 1;
763 int32_t* lo_source_addr = reinterpret_cast<int32_t*>( 763 int32_t* lo_source_addr = reinterpret_cast<int32_t*>(
764 deopt_context->GetSourceFrameAddressAt(lo_source_index)); 764 deopt_context->GetSourceFrameAddressAt(lo_source_index));
765 intptr_t hi_source_index = 765 intptr_t hi_source_index =
766 deopt_context->source_frame_size() - hi_slot_ - 1; 766 deopt_context->source_frame_size() - hi_slot_ - 1;
767 int32_t* hi_source_addr = reinterpret_cast<int32_t*>( 767 int32_t* hi_source_addr = reinterpret_cast<int32_t*>(
768 deopt_context->GetSourceFrameAddressAt(hi_source_index)); 768 deopt_context->GetSourceFrameAddressAt(hi_source_index));
769 int64_t value = Utils::LowHighTo64Bits(*lo_source_addr, *hi_source_addr); 769 int64_t value = Utils::LowHighTo64Bits(*lo_source_addr, *hi_source_addr);
770 *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0); 770 *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
771 if (Smi::IsValid64(value)) { 771 if (Smi::IsValid(value)) {
772 *dest_addr = reinterpret_cast<intptr_t>( 772 *dest_addr = reinterpret_cast<intptr_t>(
773 Smi::New(static_cast<intptr_t>(value))); 773 Smi::New(static_cast<intptr_t>(value)));
774 } else { 774 } else {
775 deopt_context->DeferMintMaterialization( 775 deopt_context->DeferMintMaterialization(
776 value, reinterpret_cast<RawMint**>(dest_addr)); 776 value, reinterpret_cast<RawMint**>(dest_addr));
777 } 777 }
778 } 778 }
779 779
780 static const intptr_t kFieldWidth = kBitsPerWord / 2; 780 static const intptr_t kFieldWidth = kBitsPerWord / 2;
781 class LoSlot : public BitField<intptr_t, 0, kFieldWidth> { }; 781 class LoSlot : public BitField<intptr_t, 0, kFieldWidth> { };
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
840 deopt_context->GetSourceFrameAddressAt(slot_source_index)); 840 deopt_context->GetSourceFrameAddressAt(slot_source_index));
841 int32_t slot_value = *slot_source_addr; 841 int32_t slot_value = *slot_source_addr;
842 int32_t reg_value = deopt_context->RegisterValue(reg_); 842 int32_t reg_value = deopt_context->RegisterValue(reg_);
843 int64_t value; 843 int64_t value;
844 if (flip_) { 844 if (flip_) {
845 value = Utils::LowHighTo64Bits(reg_value, slot_value); 845 value = Utils::LowHighTo64Bits(reg_value, slot_value);
846 } else { 846 } else {
847 value = Utils::LowHighTo64Bits(slot_value, reg_value); 847 value = Utils::LowHighTo64Bits(slot_value, reg_value);
848 } 848 }
849 *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0); 849 *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
850 if (Smi::IsValid64(value)) { 850 if (Smi::IsValid(value)) {
851 *dest_addr = reinterpret_cast<intptr_t>( 851 *dest_addr = reinterpret_cast<intptr_t>(
852 Smi::New(static_cast<intptr_t>(value))); 852 Smi::New(static_cast<intptr_t>(value)));
853 } else { 853 } else {
854 deopt_context->DeferMintMaterialization( 854 deopt_context->DeferMintMaterialization(
855 value, reinterpret_cast<RawMint**>(dest_addr)); 855 value, reinterpret_cast<RawMint**>(dest_addr));
856 } 856 }
857 } 857 }
858 858
859 static const intptr_t kFieldWidth = kBitsPerWord / 2; 859 static const intptr_t kFieldWidth = kBitsPerWord / 2;
860 class Slot : public BitField<intptr_t, 0, kFieldWidth> { }; 860 class Slot : public BitField<intptr_t, 0, kFieldWidth> { };
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after
1667 Smi* offset, 1667 Smi* offset,
1668 DeoptInfo* info, 1668 DeoptInfo* info,
1669 Smi* reason) { 1669 Smi* reason) {
1670 intptr_t i = index * kEntrySize; 1670 intptr_t i = index * kEntrySize;
1671 *offset ^= table.At(i); 1671 *offset ^= table.At(i);
1672 *info ^= table.At(i + 1); 1672 *info ^= table.At(i + 1);
1673 *reason ^= table.At(i + 2); 1673 *reason ^= table.At(i + 2);
1674 } 1674 }
1675 1675
1676 } // namespace dart 1676 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/deferred_objects.cc ('k') | runtime/vm/flow_graph_type_propagator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698