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

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

Issue 1268783003: Simplify constant pool usage in x64 code generator (by removing extra argument (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: address comments Created 5 years, 4 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 | « no previous file | runtime/vm/assembler_x64.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 #ifndef VM_ASSEMBLER_X64_H_ 5 #ifndef VM_ASSEMBLER_X64_H_
6 #define VM_ASSEMBLER_X64_H_ 6 #define VM_ASSEMBLER_X64_H_
7 7
8 #ifndef VM_ASSEMBLER_H_ 8 #ifndef VM_ASSEMBLER_H_
9 #error Do not include assembler_x64.h directly; use assembler.h instead. 9 #error Do not include assembler_x64.h directly; use assembler.h instead.
10 #endif 10 #endif
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 void call(Register reg); 363 void call(Register reg);
364 void call(const Address& address); 364 void call(const Address& address);
365 void call(Label* label); 365 void call(Label* label);
366 void call(const ExternalLabel* label); 366 void call(const ExternalLabel* label);
367 367
368 static const intptr_t kCallExternalLabelSize = 7; 368 static const intptr_t kCallExternalLabelSize = 7;
369 369
370 void pushq(Register reg); 370 void pushq(Register reg);
371 void pushq(const Address& address); 371 void pushq(const Address& address);
372 void pushq(const Immediate& imm); 372 void pushq(const Immediate& imm);
373 void PushImmediate(const Immediate& imm, Register pp); 373 void PushImmediate(const Immediate& imm);
374 374
375 void popq(Register reg); 375 void popq(Register reg);
376 void popq(const Address& address); 376 void popq(const Address& address);
377 377
378 void setcc(Condition condition, ByteRegister dst); 378 void setcc(Condition condition, ByteRegister dst);
379 379
380 void movl(Register dst, Register src); 380 void movl(Register dst, Register src);
381 void movl(Register dst, const Immediate& imm); 381 void movl(Register dst, const Immediate& imm);
382 void movl(Register dst, const Address& src); 382 void movl(Register dst, const Address& src);
383 void movl(const Address& dst, Register src); 383 void movl(const Address& dst, Register src);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 void cmpl(Register reg0, Register reg1); 520 void cmpl(Register reg0, Register reg1);
521 void cmpl(Register reg, const Address& address); 521 void cmpl(Register reg, const Address& address);
522 void cmpl(const Address& address, const Immediate& imm); 522 void cmpl(const Address& address, const Immediate& imm);
523 523
524 void cmpq(Register reg, const Immediate& imm); 524 void cmpq(Register reg, const Immediate& imm);
525 void cmpq(const Address& address, Register reg); 525 void cmpq(const Address& address, Register reg);
526 void cmpq(const Address& address, const Immediate& imm); 526 void cmpq(const Address& address, const Immediate& imm);
527 void cmpq(Register reg0, Register reg1); 527 void cmpq(Register reg0, Register reg1);
528 void cmpq(Register reg, const Address& address); 528 void cmpq(Register reg, const Address& address);
529 529
530 void CompareImmediate(Register reg, const Immediate& imm, Register pp); 530 void CompareImmediate(Register reg, const Immediate& imm);
531 void CompareImmediate(const Address& address, const Immediate& imm, 531 void CompareImmediate(const Address& address, const Immediate& imm);
532 Register pp);
533 532
534 void testl(Register reg1, Register reg2); 533 void testl(Register reg1, Register reg2);
535 void testl(Register reg, const Immediate& imm); 534 void testl(Register reg, const Immediate& imm);
536 void testb(const Address& address, const Immediate& imm); 535 void testb(const Address& address, const Immediate& imm);
537 536
538 void testq(Register reg1, Register reg2); 537 void testq(Register reg1, Register reg2);
539 void testq(Register reg, const Immediate& imm); 538 void testq(Register reg, const Immediate& imm);
540 void TestImmediate(Register dst, const Immediate& imm, Register pp); 539 void TestImmediate(Register dst, const Immediate& imm);
541 540
542 void andl(Register dst, Register src); 541 void andl(Register dst, Register src);
543 void andl(Register dst, const Immediate& imm); 542 void andl(Register dst, const Immediate& imm);
544 543
545 void orl(Register dst, Register src); 544 void orl(Register dst, Register src);
546 void orl(Register dst, const Immediate& imm); 545 void orl(Register dst, const Immediate& imm);
547 void orl(const Address& dst, Register src); 546 void orl(const Address& dst, Register src);
548 547
549 void xorl(Register dst, Register src); 548 void xorl(Register dst, Register src);
550 549
551 void andq(Register dst, Register src); 550 void andq(Register dst, Register src);
552 void andq(Register dst, const Address& address); 551 void andq(Register dst, const Address& address);
553 void andq(Register dst, const Immediate& imm); 552 void andq(Register dst, const Immediate& imm);
554 void AndImmediate(Register dst, const Immediate& imm, Register pp); 553 void AndImmediate(Register dst, const Immediate& imm);
555 554
556 void orq(Register dst, Register src); 555 void orq(Register dst, Register src);
557 void orq(Register dst, const Address& address); 556 void orq(Register dst, const Address& address);
558 void orq(Register dst, const Immediate& imm); 557 void orq(Register dst, const Immediate& imm);
559 void OrImmediate(Register dst, const Immediate& imm, Register pp); 558 void OrImmediate(Register dst, const Immediate& imm);
560 559
561 void xorq(Register dst, Register src); 560 void xorq(Register dst, Register src);
562 void xorq(Register dst, const Address& address); 561 void xorq(Register dst, const Address& address);
563 void xorq(const Address& dst, Register src); 562 void xorq(const Address& dst, Register src);
564 void xorq(Register dst, const Immediate& imm); 563 void xorq(Register dst, const Immediate& imm);
565 void XorImmediate(Register dst, const Immediate& imm, Register pp); 564 void XorImmediate(Register dst, const Immediate& imm);
566 565
567 void addl(Register dst, Register src); 566 void addl(Register dst, Register src);
568 void addl(Register dst, const Immediate& imm); 567 void addl(Register dst, const Immediate& imm);
569 void addl(Register dst, const Address& address); 568 void addl(Register dst, const Address& address);
570 void addl(const Address& address, Register src); 569 void addl(const Address& address, Register src);
571 void adcl(Register dst, Register src); 570 void adcl(Register dst, Register src);
572 void adcl(Register dst, const Immediate& imm); 571 void adcl(Register dst, const Immediate& imm);
573 void adcl(Register dst, const Address& address); 572 void adcl(Register dst, const Address& address);
574 573
575 void addq(Register dst, Register src); 574 void addq(Register dst, Register src);
(...skipping 14 matching lines...) Expand all
590 void idivq(Register reg); 589 void idivq(Register reg);
591 void divq(Register reg); 590 void divq(Register reg);
592 591
593 void imull(Register dst, Register src); 592 void imull(Register dst, Register src);
594 void imull(Register reg, const Immediate& imm); 593 void imull(Register reg, const Immediate& imm);
595 void mull(Register reg); 594 void mull(Register reg);
596 595
597 void imulq(Register dst, Register src); 596 void imulq(Register dst, Register src);
598 void imulq(Register dst, const Address& address); 597 void imulq(Register dst, const Address& address);
599 void imulq(Register dst, const Immediate& imm); 598 void imulq(Register dst, const Immediate& imm);
600 void MulImmediate(Register reg, const Immediate& imm, Register pp); 599 void MulImmediate(Register reg, const Immediate& imm);
601 void mulq(Register reg); 600 void mulq(Register reg);
602 601
603 void subl(Register dst, Register src); 602 void subl(Register dst, Register src);
604 void subl(Register dst, const Immediate& imm); 603 void subl(Register dst, const Immediate& imm);
605 void subl(Register dst, const Address& address); 604 void subl(Register dst, const Address& address);
606 void sbbl(Register dst, Register src); 605 void sbbl(Register dst, Register src);
607 void sbbl(Register dst, const Immediate& imm); 606 void sbbl(Register dst, const Immediate& imm);
608 void sbbl(Register dst, const Address& address); 607 void sbbl(Register dst, const Address& address);
609 608
610 void subq(Register dst, Register src); 609 void subq(Register dst, Register src);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 /* 731 /*
733 * Macros for High-level operations and implemented on all architectures. 732 * Macros for High-level operations and implemented on all architectures.
734 */ 733 */
735 734
736 void CompareRegisters(Register a, Register b); 735 void CompareRegisters(Register a, Register b);
737 736
738 // Issues a move instruction if 'to' is not the same as 'from'. 737 // Issues a move instruction if 'to' is not the same as 'from'.
739 void MoveRegister(Register to, Register from); 738 void MoveRegister(Register to, Register from);
740 void PopRegister(Register r); 739 void PopRegister(Register r);
741 740
742 // Macros accepting a pp Register argument may attempt to load values from 741 // Macros for adding/subtracting an immediate value that may be loaded from
743 // the object pool when possible. Unless you are sure that the untagged object 742 // the constant pool.
744 // pool pointer is in another register, or that it is not available at all,
745 // PP should be passed for pp.
746 // TODO(koda): Assert that these are not used for heap objects. 743 // TODO(koda): Assert that these are not used for heap objects.
747 void AddImmediate(Register reg, const Immediate& imm, Register pp); 744 void AddImmediate(Register reg, const Immediate& imm);
748 void AddImmediate(const Address& address, const Immediate& imm, Register pp); 745 void AddImmediate(const Address& address, const Immediate& imm);
749 void SubImmediate(Register reg, const Immediate& imm, Register pp); 746 void SubImmediate(Register reg, const Immediate& imm);
750 void SubImmediate(const Address& address, const Immediate& imm, Register pp); 747 void SubImmediate(const Address& address, const Immediate& imm);
751 748
752 void Drop(intptr_t stack_elements, Register tmp = TMP); 749 void Drop(intptr_t stack_elements, Register tmp = TMP);
753 750
754 bool constant_pool_allowed() const { 751 bool constant_pool_allowed() const {
755 return constant_pool_allowed_; 752 return constant_pool_allowed_;
756 } 753 }
757 void set_constant_pool_allowed(bool b) { 754 void set_constant_pool_allowed(bool b) {
758 constant_pool_allowed_ = b; 755 constant_pool_allowed_ = b;
759 } 756 }
760 757
761 bool CanLoadImmediateFromPool(const Immediate& imm, Register pp); 758 void LoadImmediate(Register reg, const Immediate& imm);
762 void LoadImmediate(Register reg, const Immediate& imm, Register pp);
763 void LoadIsolate(Register dst); 759 void LoadIsolate(Register dst);
764 void LoadObject(Register dst, const Object& obj, Register pp); 760 void LoadObject(Register dst, const Object& obj);
765 void LoadUniqueObject(Register dst, const Object& obj, Register pp); 761 void LoadUniqueObject(Register dst, const Object& obj);
766 void LoadExternalLabel(Register dst, 762 void LoadExternalLabel(Register dst,
767 const ExternalLabel* label, 763 const ExternalLabel* label,
768 Patchability patchable, 764 Patchability patchable);
769 Register pp); 765 void LoadFunctionFromCalleePool(Register dst,
766 const Function& function,
767 Register new_pp);
770 void JmpPatchable(const ExternalLabel* label, Register pp); 768 void JmpPatchable(const ExternalLabel* label, Register pp);
771 void Jmp(const ExternalLabel* label, Register pp); 769 void Jmp(const ExternalLabel* label, Register pp);
772 void J(Condition condition, const ExternalLabel* label, Register pp); 770 void J(Condition condition, const ExternalLabel* label, Register pp);
773 void CallPatchable(const ExternalLabel* label); 771 void CallPatchable(const ExternalLabel* label);
774 void Call(const ExternalLabel* label, Register pp); 772 void Call(const ExternalLabel* label);
775 // Unaware of write barrier (use StoreInto* methods for storing to objects). 773 // Unaware of write barrier (use StoreInto* methods for storing to objects).
776 // TODO(koda): Add StackAddress/HeapAddress types to prevent misuse. 774 // TODO(koda): Add StackAddress/HeapAddress types to prevent misuse.
777 void StoreObject(const Address& dst, const Object& obj, Register pp); 775 void StoreObject(const Address& dst, const Object& obj);
778 void PushObject(const Object& object, Register pp); 776 void PushObject(const Object& object);
779 void CompareObject(Register reg, const Object& object, Register pp); 777 void CompareObject(Register reg, const Object& object);
780 778
781 // When storing into a heap object field, knowledge of the previous content 779 // When storing into a heap object field, knowledge of the previous content
782 // is expressed through these constants. 780 // is expressed through these constants.
783 enum FieldContent { 781 enum FieldContent {
784 kEmptyOrSmiOrNull, // Empty = garbage/zapped in release/debug mode. 782 kEmptyOrSmiOrNull, // Empty = garbage/zapped in release/debug mode.
785 kHeapObjectOrSmi, 783 kHeapObjectOrSmi,
786 kOnlySmi, 784 kOnlySmi,
787 }; 785 };
788 786
789 // Destroys value. 787 // Destroys value.
790 void StoreIntoObject(Register object, // Object we are storing into. 788 void StoreIntoObject(Register object, // Object we are storing into.
791 const Address& dest, // Where we are storing into. 789 const Address& dest, // Where we are storing into.
792 Register value, // Value we are storing. 790 Register value, // Value we are storing.
793 bool can_value_be_smi = true); 791 bool can_value_be_smi = true);
794 792
795 void StoreIntoObjectNoBarrier(Register object, 793 void StoreIntoObjectNoBarrier(Register object,
796 const Address& dest, 794 const Address& dest,
797 Register value, 795 Register value,
798 FieldContent old_content = kHeapObjectOrSmi); 796 FieldContent old_content = kHeapObjectOrSmi);
799 void InitializeFieldNoBarrier(Register object, 797 void InitializeFieldNoBarrier(Register object,
800 const Address& dest, 798 const Address& dest,
801 Register value) { 799 Register value) {
802 return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull); 800 return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
803 } 801 }
804 void StoreIntoObjectNoBarrier(Register object, 802 void StoreIntoObjectNoBarrier(Register object,
805 const Address& dest, 803 const Address& dest,
806 const Object& value, 804 const Object& value,
807 Register pp,
808 FieldContent old_content = kHeapObjectOrSmi); 805 FieldContent old_content = kHeapObjectOrSmi);
809 void InitializeFieldNoBarrier(Register object, 806 void InitializeFieldNoBarrier(Register object,
810 const Address& dest, 807 const Address& dest,
811 const Object& value, 808 const Object& value) {
812 Register pp) { 809 return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
813 return StoreIntoObjectNoBarrier(object, dest, value, pp, kEmptyOrSmiOrNull);
814 } 810 }
815 811
816 // Stores a Smi value into a heap object field that always contains a Smi. 812 // Stores a Smi value into a heap object field that always contains a Smi.
817 void StoreIntoSmiField(const Address& dest, Register value); 813 void StoreIntoSmiField(const Address& dest, Register value);
818 void ZeroInitSmiField(const Address& dest); 814 void ZeroInitSmiField(const Address& dest);
819 // Increments a Smi field. Leaves flags in same state as an 'addq'. 815 // Increments a Smi field. Leaves flags in same state as an 'addq'.
820 void IncrementSmiField(const Address& dest, int64_t increment); 816 void IncrementSmiField(const Address& dest, int64_t increment);
821 817
822 void DoubleNegate(XmmRegister d); 818 void DoubleNegate(XmmRegister d);
823 void FloatNegate(XmmRegister f); 819 void FloatNegate(XmmRegister f);
(...skipping 23 matching lines...) Expand all
847 // Call runtime function. Reserves shadow space on the stack before calling 843 // Call runtime function. Reserves shadow space on the stack before calling
848 // if platform ABI requires that. Does not restore RSP after the call itself. 844 // if platform ABI requires that. Does not restore RSP after the call itself.
849 void CallCFunction(const ExternalLabel* label); 845 void CallCFunction(const ExternalLabel* label);
850 void CallCFunction(Register reg); 846 void CallCFunction(Register reg);
851 847
852 /* 848 /*
853 * Loading and comparing classes of objects. 849 * Loading and comparing classes of objects.
854 */ 850 */
855 void LoadClassId(Register result, Register object); 851 void LoadClassId(Register result, Register object);
856 852
857 void LoadClassById(Register result, Register class_id, Register pp); 853 void LoadClassById(Register result, Register class_id);
858 854
859 void LoadClass(Register result, Register object, Register pp); 855 void LoadClass(Register result, Register object);
860 856
861 void CompareClassId(Register object, intptr_t class_id); 857 void CompareClassId(Register object, intptr_t class_id);
862 858
863 void LoadClassIdMayBeSmi(Register result, Register object); 859 void LoadClassIdMayBeSmi(Register result, Register object);
864 void LoadTaggedClassIdMayBeSmi(Register result, Register object); 860 void LoadTaggedClassIdMayBeSmi(Register result, Register object);
865 861
866 // CheckClassIs fused with optimistic SmiUntag. 862 // CheckClassIs fused with optimistic SmiUntag.
867 // Value in the register object is untagged optimistically. 863 // Value in the register object is untagged optimistically.
868 void SmiUntagOrCheckClass(Register object, intptr_t class_id, Label* smi); 864 void SmiUntagOrCheckClass(Register object, intptr_t class_id, Label* smi);
869 865
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 ObjectPoolWrapper& object_pool_wrapper() { return object_pool_wrapper_; } 912 ObjectPoolWrapper& object_pool_wrapper() { return object_pool_wrapper_; }
917 913
918 RawObjectPool* MakeObjectPool() { 914 RawObjectPool* MakeObjectPool() {
919 return object_pool_wrapper_.MakeObjectPool(); 915 return object_pool_wrapper_.MakeObjectPool();
920 } 916 }
921 917
922 void FinalizeInstructions(const MemoryRegion& region) { 918 void FinalizeInstructions(const MemoryRegion& region) {
923 buffer_.FinalizeInstructions(region); 919 buffer_.FinalizeInstructions(region);
924 } 920 }
925 921
926 void LoadPoolPointer(Register pp); 922 void LoadPoolPointer(Register pp = PP);
927 923
928 // Set up a Dart frame on entry with a frame pointer and PC information to 924 // Set up a Dart frame on entry with a frame pointer and PC information to
929 // enable easy access to the RawInstruction object of code corresponding 925 // enable easy access to the RawInstruction object of code corresponding
930 // to this frame. 926 // to this frame.
931 // The dart frame layout is as follows: 927 // The dart frame layout is as follows:
932 // .... 928 // ....
933 // locals space <=== RSP 929 // locals space <=== RSP
934 // saved PP 930 // saved PP
935 // pc (used to derive the RawInstruction Object of the dart code) 931 // pc (used to derive the RawInstruction Object of the dart code)
936 // saved RBP <=== RBP 932 // saved RBP <=== RBP
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 // which will allocate in the runtime where tracing occurs. 996 // which will allocate in the runtime where tracing occurs.
1001 void MaybeTraceAllocation(intptr_t cid, 997 void MaybeTraceAllocation(intptr_t cid,
1002 Label* trace, 998 Label* trace,
1003 bool near_jump, 999 bool near_jump,
1004 bool inline_isolate = true); 1000 bool inline_isolate = true);
1005 1001
1006 // Inlined allocation of an instance of class 'cls', code has no runtime 1002 // Inlined allocation of an instance of class 'cls', code has no runtime
1007 // calls. Jump to 'failure' if the instance cannot be allocated here. 1003 // calls. Jump to 'failure' if the instance cannot be allocated here.
1008 // Allocated instance is returned in 'instance_reg'. 1004 // Allocated instance is returned in 'instance_reg'.
1009 // Only the tags field of the object is initialized. 1005 // Only the tags field of the object is initialized.
1010 // Loads large immediates from the object pool with pool pointer in PP if it
1011 // is not kNoRegister
1012 void TryAllocate(const Class& cls, 1006 void TryAllocate(const Class& cls,
1013 Label* failure, 1007 Label* failure,
1014 bool near_jump, 1008 bool near_jump,
1015 Register instance_reg, 1009 Register instance_reg);
1016 Register pp);
1017 1010
1018 void TryAllocateArray(intptr_t cid, 1011 void TryAllocateArray(intptr_t cid,
1019 intptr_t instance_size, 1012 intptr_t instance_size,
1020 Label* failure, 1013 Label* failure,
1021 bool near_jump, 1014 bool near_jump,
1022 Register instance, 1015 Register instance,
1023 Register end_address); 1016 Register end_address);
1024 1017
1025 // Debugging and bringup support. 1018 // Debugging and bringup support.
1026 void Stop(const char* message, bool fixed_length_encoding = false); 1019 void Stop(const char* message, bool fixed_length_encoding = false);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 const String& comment_; 1063 const String& comment_;
1071 1064
1072 DISALLOW_COPY_AND_ASSIGN(CodeComment); 1065 DISALLOW_COPY_AND_ASSIGN(CodeComment);
1073 }; 1066 };
1074 1067
1075 GrowableArray<CodeComment*> comments_; 1068 GrowableArray<CodeComment*> comments_;
1076 bool constant_pool_allowed_; 1069 bool constant_pool_allowed_;
1077 1070
1078 intptr_t FindImmediate(int64_t imm); 1071 intptr_t FindImmediate(int64_t imm);
1079 bool CanLoadFromObjectPool(const Object& object) const; 1072 bool CanLoadFromObjectPool(const Object& object) const;
1080 void LoadObjectHelper(Register dst, 1073 void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
1081 const Object& obj, 1074 void LoadWordFromPoolOffset(Register dst, int32_t offset);
1082 Register pp,
1083 bool is_unique);
1084 void LoadWordFromPoolOffset(Register dst, Register pp, int32_t offset);
1085 1075
1086 inline void EmitUint8(uint8_t value); 1076 inline void EmitUint8(uint8_t value);
1087 inline void EmitInt32(int32_t value); 1077 inline void EmitInt32(int32_t value);
1088 inline void EmitInt64(int64_t value); 1078 inline void EmitInt64(int64_t value);
1089 1079
1090 inline void EmitRegisterREX(Register reg, uint8_t rex); 1080 inline void EmitRegisterREX(Register reg, uint8_t rex);
1091 inline void EmitOperandREX(int rm, const Operand& operand, uint8_t rex); 1081 inline void EmitOperandREX(int rm, const Operand& operand, uint8_t rex);
1092 inline void EmitXmmRegisterOperand(int rm, XmmRegister reg); 1082 inline void EmitXmmRegisterOperand(int rm, XmmRegister reg);
1093 inline void EmitFixup(AssemblerFixup* fixup); 1083 inline void EmitFixup(AssemblerFixup* fixup);
1094 inline void EmitOperandSizeOverride(); 1084 inline void EmitOperandSizeOverride();
(...skipping 30 matching lines...) Expand all
1125 void VerifyObjectOrSmi(const Address& address); 1115 void VerifyObjectOrSmi(const Address& address);
1126 void VerifySmi(const Address& address, const char* stop_msg = "Expected Smi"); 1116 void VerifySmi(const Address& address, const char* stop_msg = "Expected Smi");
1127 #endif // DEBUG 1117 #endif // DEBUG
1128 // Like VerifiedMemory::Verify(address, kWordSize) and ::Write, but also, 1118 // Like VerifiedMemory::Verify(address, kWordSize) and ::Write, but also,
1129 // in DEBUG mode, verifies that 'address' has content of type 'old_content'. 1119 // in DEBUG mode, verifies that 'address' has content of type 'old_content'.
1130 void VerifyHeapWord(const Address& address, FieldContent old_content); 1120 void VerifyHeapWord(const Address& address, FieldContent old_content);
1131 void VerifiedWrite(const Address& dest, 1121 void VerifiedWrite(const Address& dest,
1132 Register value, 1122 Register value,
1133 FieldContent old_content); 1123 FieldContent old_content);
1134 // Unaware of write barrier (use StoreInto* methods for storing to objects). 1124 // Unaware of write barrier (use StoreInto* methods for storing to objects).
1135 void MoveImmediate(const Address& dst, const Immediate& imm, Register pp); 1125 void MoveImmediate(const Address& dst, const Immediate& imm);
1136 1126
1137 void ComputeCounterAddressesForCid(intptr_t cid, 1127 void ComputeCounterAddressesForCid(intptr_t cid,
1138 Heap::Space space, 1128 Heap::Space space,
1139 Address* count_address, 1129 Address* count_address,
1140 Address* size_address); 1130 Address* size_address);
1141 DISALLOW_ALLOCATION(); 1131 DISALLOW_ALLOCATION();
1142 DISALLOW_COPY_AND_ASSIGN(Assembler); 1132 DISALLOW_COPY_AND_ASSIGN(Assembler);
1143 }; 1133 };
1144 1134
1145 1135
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 } 1204 }
1215 1205
1216 1206
1217 inline void Assembler::EmitOperandSizeOverride() { 1207 inline void Assembler::EmitOperandSizeOverride() {
1218 EmitUint8(0x66); 1208 EmitUint8(0x66);
1219 } 1209 }
1220 1210
1221 } // namespace dart 1211 } // namespace dart
1222 1212
1223 #endif // VM_ASSEMBLER_X64_H_ 1213 #endif // VM_ASSEMBLER_X64_H_
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/assembler_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698