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

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

Issue 10641018: - Remove extra jumps from store barrier on x64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 6 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/assembler_x64.h ('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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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/heap.h" 9 #include "vm/heap.h"
10 #include "vm/memory_region.h" 10 #include "vm/memory_region.h"
(...skipping 861 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 872
873 873
874 void Assembler::addq(const Address& address, Register reg) { 874 void Assembler::addq(const Address& address, Register reg) {
875 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 875 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
876 EmitOperandREX(reg, address, REX_W); 876 EmitOperandREX(reg, address, REX_W);
877 EmitUint8(0x01); 877 EmitUint8(0x01);
878 EmitOperand(reg & 7, address); 878 EmitOperand(reg & 7, address);
879 } 879 }
880 880
881 881
882 void Assembler::adcl(Register dst, Register src) {
Vyacheslav Egorov (Google) 2012/06/22 10:36:28 please add a test for this instruction in assemble
883 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
884 Operand operand(src);
885 EmitOperandREX(dst, operand, REX_NONE);
886 EmitUint8(0x13);
887 EmitOperand(dst & 7, operand);
888 }
889
890
882 void Assembler::subl(Register dst, Register src) { 891 void Assembler::subl(Register dst, Register src) {
883 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 892 AssemblerBuffer::EnsureCapacity ensured(&buffer_);
884 Operand operand(src); 893 Operand operand(src);
885 EmitOperandREX(dst, operand, REX_NONE); 894 EmitOperandREX(dst, operand, REX_NONE);
886 EmitUint8(0x2B); 895 EmitUint8(0x2B);
887 EmitOperand(dst & 7, operand); 896 EmitOperand(dst & 7, operand);
888 } 897 }
889 898
890 899
891 void Assembler::cdq() { 900 void Assembler::cdq() {
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 ASSERT(reg != TMP); 1407 ASSERT(reg != TMP);
1399 LoadObject(TMP, object); 1408 LoadObject(TMP, object);
1400 cmpq(reg, TMP); 1409 cmpq(reg, TMP);
1401 } 1410 }
1402 } 1411 }
1403 1412
1404 1413
1405 void Assembler::StoreIntoObjectFilter(Register object, 1414 void Assembler::StoreIntoObjectFilter(Register object,
1406 Register value, 1415 Register value,
1407 Label* no_update) { 1416 Label* no_update) {
1408 // Check that 'value' is a new object. Store buffer updates are not 1417 andl(value, Immediate(0x5));
1409 // required when storing a smi or an old object. 1418 shrl(value, Immediate(1));
1410 testl(value, Immediate(kNewObjectAlignmentOffset | kHeapObjectTag)); 1419 adcl(value, object);
1411 j(PARITY_ODD, no_update, Assembler::kNearJump); 1420 andl(value, Immediate(0x7));
1412 j(ZERO, no_update, Assembler::kNearJump); 1421 cmpl(value, Immediate(0x4));
1413 // Check that 'object' is an old object. A store buffer update is
1414 // not required when storing into a new object.
1415 testl(object, Immediate(kNewObjectAlignmentOffset));
1416 j(NOT_ZERO, no_update, Assembler::kNearJump); 1422 j(NOT_ZERO, no_update, Assembler::kNearJump);
1417 } 1423 }
1418 1424
1419 1425
1420 void Assembler::StoreIntoObject(Register object, 1426 void Assembler::StoreIntoObject(Register object,
1421 const FieldAddress& dest, 1427 const FieldAddress& dest,
1422 Register value) { 1428 Register value) {
1423 movq(dest, value); 1429 movq(dest, value);
1424 1430
1425 Label done; 1431 Label done;
1432 pushq(value);
1426 StoreIntoObjectFilter(object, value, &done); 1433 StoreIntoObjectFilter(object, value, &done);
1427 // A store buffer update is required. 1434 // A store buffer update is required.
1428 pushq(RAX); 1435 if (value != RAX) pushq(RAX);
1429 leaq(RAX, dest); 1436 leaq(RAX, dest);
1430 call(&StubCode::UpdateStoreBufferLabel()); 1437 call(&StubCode::UpdateStoreBufferLabel());
1431 popq(RAX); 1438 if (value != RAX) popq(RAX);
1432 Bind(&done); 1439 Bind(&done);
1440 popq(value);
1433 } 1441 }
1434 1442
1435 1443
1436 void Assembler::StoreIntoObjectNoBarrier(Register object, 1444 void Assembler::StoreIntoObjectNoBarrier(Register object,
1437 const FieldAddress& dest, 1445 const FieldAddress& dest,
1438 Register value) { 1446 Register value) {
1439 movq(dest, value); 1447 movq(dest, value);
1440 #if defined(DEBUG) 1448 #if defined(DEBUG)
1441 Label done; 1449 Label done;
1450 pushq(value);
1442 StoreIntoObjectFilter(object, value, &done); 1451 StoreIntoObjectFilter(object, value, &done);
1443 Stop("Store buffer update is required"); 1452 Stop("Store buffer update is required");
1444 Bind(&done); 1453 Bind(&done);
1454 popq(value);
1445 #endif // defined(DEBUG) 1455 #endif // defined(DEBUG)
1446 // No store buffer update. 1456 // No store buffer update.
1447 } 1457 }
1448 1458
1449 1459
1450 void Assembler::DoubleNegate(XmmRegister d) { 1460 void Assembler::DoubleNegate(XmmRegister d) {
1451 static const struct ALIGN16 { 1461 static const struct ALIGN16 {
1452 uint64_t a; 1462 uint64_t a;
1453 uint64_t b; 1463 uint64_t b;
1454 } double_negate_constant = 1464 } double_negate_constant =
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 comments.SetCommentAt(i, comments_[i]->comment()); 1731 comments.SetCommentAt(i, comments_[i]->comment());
1722 } 1732 }
1723 1733
1724 return comments; 1734 return comments;
1725 } 1735 }
1726 1736
1727 1737
1728 } // namespace dart 1738 } // namespace dart
1729 1739
1730 #endif // defined TARGET_ARCH_X64 1740 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/assembler_x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698