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

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

Issue 2895183002: More compact string representation on 64 bit. (Closed)
Patch Set: Created 3 years, 7 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
« no previous file with comments | « runtime/vm/stub_code_mips.cc ('k') | no next file » | 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/globals.h" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_X64) 6 #if defined(TARGET_ARCH_X64)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 // Check for maximum allowed length. 648 // Check for maximum allowed length.
649 const Immediate& max_len = 649 const Immediate& max_len =
650 Immediate(reinterpret_cast<int64_t>(Smi::New(Array::kMaxElements))); 650 Immediate(reinterpret_cast<int64_t>(Smi::New(Array::kMaxElements)));
651 __ cmpq(RDI, max_len); 651 __ cmpq(RDI, max_len);
652 __ j(GREATER, &slow_case); 652 __ j(GREATER, &slow_case);
653 653
654 // Check for allocation tracing. 654 // Check for allocation tracing.
655 NOT_IN_PRODUCT( 655 NOT_IN_PRODUCT(
656 __ MaybeTraceAllocation(kArrayCid, &slow_case, Assembler::kFarJump)); 656 __ MaybeTraceAllocation(kArrayCid, &slow_case, Assembler::kFarJump));
657 657
658 const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1; 658 const intptr_t fixed_size_plus_alignment_padding =
659 __ leaq(RDI, Address(RDI, TIMES_4, fixed_size)); // RDI is a Smi. 659 sizeof(RawArray) + kObjectAlignment - 1;
660 // RDI is a Smi.
661 __ leaq(RDI, Address(RDI, TIMES_4, fixed_size_plus_alignment_padding));
660 ASSERT(kSmiTagShift == 1); 662 ASSERT(kSmiTagShift == 1);
661 __ andq(RDI, Immediate(-kObjectAlignment)); 663 __ andq(RDI, Immediate(-kObjectAlignment));
662 664
663 const intptr_t cid = kArrayCid; 665 const intptr_t cid = kArrayCid;
664 Heap::Space space = Heap::kNew; 666 Heap::Space space = Heap::kNew;
665 __ movq(R13, Address(THR, Thread::heap_offset())); 667 __ movq(R13, Address(THR, Thread::heap_offset()));
666 __ movq(RAX, Address(R13, Heap::TopOffset(space))); 668 __ movq(RAX, Address(R13, Heap::TopOffset(space)));
667 669
668 // RDI: allocation size. 670 // RDI: allocation size.
669 __ movq(RCX, RAX); 671 __ movq(RCX, RAX);
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 // Input: 892 // Input:
891 // R10: number of context variables. 893 // R10: number of context variables.
892 // Output: 894 // Output:
893 // RAX: new allocated RawContext object. 895 // RAX: new allocated RawContext object.
894 void StubCode::GenerateAllocateContextStub(Assembler* assembler) { 896 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
895 __ LoadObject(R9, Object::null_object()); 897 __ LoadObject(R9, Object::null_object());
896 if (FLAG_inline_alloc) { 898 if (FLAG_inline_alloc) {
897 Label slow_case; 899 Label slow_case;
898 // First compute the rounded instance size. 900 // First compute the rounded instance size.
899 // R10: number of context variables. 901 // R10: number of context variables.
900 intptr_t fixed_size = (sizeof(RawContext) + kObjectAlignment - 1); 902 intptr_t fixed_size_plus_alignment_padding =
901 __ leaq(R13, Address(R10, TIMES_8, fixed_size)); 903 (sizeof(RawContext) + kObjectAlignment - 1);
904 __ leaq(R13, Address(R10, TIMES_8, fixed_size_plus_alignment_padding));
902 __ andq(R13, Immediate(-kObjectAlignment)); 905 __ andq(R13, Immediate(-kObjectAlignment));
903 906
904 // Check for allocation tracing. 907 // Check for allocation tracing.
905 NOT_IN_PRODUCT( 908 NOT_IN_PRODUCT(
906 __ MaybeTraceAllocation(kContextCid, &slow_case, Assembler::kFarJump)); 909 __ MaybeTraceAllocation(kContextCid, &slow_case, Assembler::kFarJump));
907 910
908 // Now allocate the object. 911 // Now allocate the object.
909 // R10: number of context variables. 912 // R10: number of context variables.
910 const intptr_t cid = kContextCid; 913 const intptr_t cid = kContextCid;
911 Heap::Space space = Heap::kNew; 914 Heap::Space space = Heap::kNew;
(...skipping 23 matching lines...) Expand all
935 __ subq(R13, RAX); 938 __ subq(R13, RAX);
936 __ addq(RAX, Immediate(kHeapObjectTag)); 939 __ addq(RAX, Immediate(kHeapObjectTag));
937 // Generate isolate-independent code to allow sharing between isolates. 940 // Generate isolate-independent code to allow sharing between isolates.
938 NOT_IN_PRODUCT(__ UpdateAllocationStatsWithSize(cid, R13, space)); 941 NOT_IN_PRODUCT(__ UpdateAllocationStatsWithSize(cid, R13, space));
939 942
940 // Calculate the size tag. 943 // Calculate the size tag.
941 // RAX: new object. 944 // RAX: new object.
942 // R10: number of context variables. 945 // R10: number of context variables.
943 { 946 {
944 Label size_tag_overflow, done; 947 Label size_tag_overflow, done;
945 __ leaq(R13, Address(R10, TIMES_8, fixed_size)); 948 __ leaq(R13, Address(R10, TIMES_8, fixed_size_plus_alignment_padding));
946 __ andq(R13, Immediate(-kObjectAlignment)); 949 __ andq(R13, Immediate(-kObjectAlignment));
947 __ cmpq(R13, Immediate(RawObject::SizeTag::kMaxSizeTag)); 950 __ cmpq(R13, Immediate(RawObject::SizeTag::kMaxSizeTag));
948 __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump); 951 __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
949 __ shlq(R13, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2)); 952 __ shlq(R13, Immediate(RawObject::kSizeTagPos - kObjectAlignmentLog2));
950 __ jmp(&done); 953 __ jmp(&done);
951 954
952 __ Bind(&size_tag_overflow); 955 __ Bind(&size_tag_overflow);
953 // Set overflow size tag value. 956 // Set overflow size tag value.
954 __ movq(R13, Immediate(0)); 957 __ movq(R13, Immediate(0));
955 958
(...skipping 1297 matching lines...) Expand 10 before | Expand all | Expand 10 after
2253 2256
2254 2257
2255 // Called from switchable IC calls. 2258 // Called from switchable IC calls.
2256 // RDI: receiver 2259 // RDI: receiver
2257 // RBX: SingleTargetCache 2260 // RBX: SingleTargetCache
2258 // Passed to target:: 2261 // Passed to target::
2259 // CODE_REG: target Code object 2262 // CODE_REG: target Code object
2260 void StubCode::GenerateSingleTargetCallStub(Assembler* assembler) { 2263 void StubCode::GenerateSingleTargetCallStub(Assembler* assembler) {
2261 Label miss; 2264 Label miss;
2262 __ LoadClassIdMayBeSmi(RAX, RDI); 2265 __ LoadClassIdMayBeSmi(RAX, RDI);
2263 __ movl(R9, FieldAddress(RBX, SingleTargetCache::lower_limit_offset())); 2266 __ movzxw(R9, FieldAddress(RBX, SingleTargetCache::lower_limit_offset()));
2264 __ movl(R10, FieldAddress(RBX, SingleTargetCache::upper_limit_offset())); 2267 __ movzxw(R10, FieldAddress(RBX, SingleTargetCache::upper_limit_offset()));
2265 __ cmpq(RAX, R9); 2268 __ cmpq(RAX, R9);
2266 __ j(LESS, &miss, Assembler::kNearJump); 2269 __ j(LESS, &miss, Assembler::kNearJump);
2267 __ cmpq(RAX, R10); 2270 __ cmpq(RAX, R10);
2268 __ j(GREATER, &miss, Assembler::kNearJump); 2271 __ j(GREATER, &miss, Assembler::kNearJump);
2269 __ movq(RCX, FieldAddress(RBX, SingleTargetCache::entry_point_offset())); 2272 __ movq(RCX, FieldAddress(RBX, SingleTargetCache::entry_point_offset()));
2270 __ movq(CODE_REG, FieldAddress(RBX, SingleTargetCache::target_offset())); 2273 __ movq(CODE_REG, FieldAddress(RBX, SingleTargetCache::target_offset()));
2271 __ jmp(RCX); 2274 __ jmp(RCX);
2272 2275
2273 __ Bind(&miss); 2276 __ Bind(&miss);
2274 __ EnterStubFrame(); 2277 __ EnterStubFrame();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2316 } 2319 }
2317 2320
2318 2321
2319 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) { 2322 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) {
2320 __ int3(); 2323 __ int3();
2321 } 2324 }
2322 2325
2323 } // namespace dart 2326 } // namespace dart
2324 2327
2325 #endif // defined TARGET_ARCH_X64 2328 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698