OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |