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

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

Issue 46873004: Revert "Do not directly load smi constants larger than a 16 bit payload on ia32." (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month 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_arm.h ('k') | runtime/vm/assembler_ia32.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_IA32_H_ 5 #ifndef VM_ASSEMBLER_IA32_H_
6 #define VM_ASSEMBLER_IA32_H_ 6 #define VM_ASSEMBLER_IA32_H_
7 7
8 #ifndef VM_ASSEMBLER_H_ 8 #ifndef VM_ASSEMBLER_H_
9 #error Do not include assembler_ia32.h directly; use assembler.h instead. 9 #error Do not include assembler_ia32.h directly; use assembler.h instead.
10 #endif 10 #endif
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 #endif 304 #endif
305 }; 305 };
306 306
307 307
308 class Assembler : public ValueObject { 308 class Assembler : public ValueObject {
309 public: 309 public:
310 explicit Assembler(bool use_far_branches = false) 310 explicit Assembler(bool use_far_branches = false)
311 : buffer_(), 311 : buffer_(),
312 object_pool_(GrowableObjectArray::Handle()), 312 object_pool_(GrowableObjectArray::Handle()),
313 prologue_offset_(-1), 313 prologue_offset_(-1),
314 comments_(), 314 comments_() {
315 jit_cookie_(1017109444) {
316 // This mode is only needed and implemented for MIPS and ARM. 315 // This mode is only needed and implemented for MIPS and ARM.
317 ASSERT(!use_far_branches); 316 ASSERT(!use_far_branches);
318 } 317 }
319 ~Assembler() { } 318 ~Assembler() { }
320 319
321 static const bool kNearJump = true; 320 static const bool kNearJump = true;
322 static const bool kFarJump = false; 321 static const bool kFarJump = false;
323 322
324 /* 323 /*
325 * Emit Machine Instructions. 324 * Emit Machine Instructions.
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 // Issues a move instruction if 'to' is not the same as 'from'. 629 // Issues a move instruction if 'to' is not the same as 'from'.
631 void MoveRegister(Register to, Register from); 630 void MoveRegister(Register to, Register from);
632 void PopRegister(Register r); 631 void PopRegister(Register r);
633 632
634 void AddImmediate(Register reg, const Immediate& imm); 633 void AddImmediate(Register reg, const Immediate& imm);
635 634
636 void Drop(intptr_t stack_elements); 635 void Drop(intptr_t stack_elements);
637 636
638 void LoadObject(Register dst, const Object& object); 637 void LoadObject(Register dst, const Object& object);
639 638
640 // If 'object' is a large Smi, xor it with a per-assembler cookie value to
641 // prevent user-controlled immediates from appearing in the code stream.
642 void LoadObjectSafely(Register dst, const Object& object);
643
644 void PushObject(const Object& object); 639 void PushObject(const Object& object);
645 void CompareObject(Register reg, const Object& object); 640 void CompareObject(Register reg, const Object& object);
646 void LoadDoubleConstant(XmmRegister dst, double value); 641 void LoadDoubleConstant(XmmRegister dst, double value);
647 642
648 void StoreIntoObject(Register object, // Object we are storing into. 643 void StoreIntoObject(Register object, // Object we are storing into.
649 const Address& dest, // Where we are storing into. 644 const Address& dest, // Where we are storing into.
650 Register value, // Value we are storing. 645 Register value, // Value we are storing.
651 bool can_value_be_smi = true); 646 bool can_value_be_smi = true);
652 647
653 void StoreIntoObjectNoBarrier(Register object, 648 void StoreIntoObjectNoBarrier(Register object,
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 void Unreachable(const char* message); 775 void Unreachable(const char* message);
781 776
782 static void InitializeMemoryWithBreakpoints(uword data, intptr_t length); 777 static void InitializeMemoryWithBreakpoints(uword data, intptr_t length);
783 778
784 void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3); 779 void Comment(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
785 const Code::Comments& GetCodeComments() const; 780 const Code::Comments& GetCodeComments() const;
786 781
787 static const char* RegisterName(Register reg); 782 static const char* RegisterName(Register reg);
788 static const char* FpuRegisterName(FpuRegister reg); 783 static const char* FpuRegisterName(FpuRegister reg);
789 784
790 // Smis that do not fit into 17 bits (16 bits of payload) are unsafe.
791 static bool IsSafe(const Object& object) {
792 return !object.IsSmi() ||
793 Utils::IsInt(17, reinterpret_cast<intptr_t>(object.raw()));
794 }
795 static bool IsSafeSmi(const Object& object) {
796 return object.IsSmi() &&
797 Utils::IsInt(17, reinterpret_cast<intptr_t>(object.raw()));
798 }
799
800 private: 785 private:
801 AssemblerBuffer buffer_; 786 AssemblerBuffer buffer_;
802 GrowableObjectArray& object_pool_; // Object pool is not used on ia32. 787 GrowableObjectArray& object_pool_; // Object pool is not used on ia32.
803 intptr_t prologue_offset_; 788 intptr_t prologue_offset_;
804 789
805 class CodeComment : public ZoneAllocated { 790 class CodeComment : public ZoneAllocated {
806 public: 791 public:
807 CodeComment(intptr_t pc_offset, const String& comment) 792 CodeComment(intptr_t pc_offset, const String& comment)
808 : pc_offset_(pc_offset), comment_(comment) { } 793 : pc_offset_(pc_offset), comment_(comment) { }
809 794
810 intptr_t pc_offset() const { return pc_offset_; } 795 intptr_t pc_offset() const { return pc_offset_; }
811 const String& comment() const { return comment_; } 796 const String& comment() const { return comment_; }
812 797
813 private: 798 private:
814 intptr_t pc_offset_; 799 intptr_t pc_offset_;
815 const String& comment_; 800 const String& comment_;
816 801
817 DISALLOW_COPY_AND_ASSIGN(CodeComment); 802 DISALLOW_COPY_AND_ASSIGN(CodeComment);
818 }; 803 };
819 804
820 GrowableArray<CodeComment*> comments_; 805 GrowableArray<CodeComment*> comments_;
821 806
822 int32_t jit_cookie_;
823
824 inline void EmitUint8(uint8_t value); 807 inline void EmitUint8(uint8_t value);
825 inline void EmitInt32(int32_t value); 808 inline void EmitInt32(int32_t value);
826 inline void EmitRegisterOperand(int rm, int reg); 809 inline void EmitRegisterOperand(int rm, int reg);
827 inline void EmitXmmRegisterOperand(int rm, XmmRegister reg); 810 inline void EmitXmmRegisterOperand(int rm, XmmRegister reg);
828 inline void EmitFixup(AssemblerFixup* fixup); 811 inline void EmitFixup(AssemblerFixup* fixup);
829 inline void EmitOperandSizeOverride(); 812 inline void EmitOperandSizeOverride();
830 813
831 void EmitOperand(int rm, const Operand& operand); 814 void EmitOperand(int rm, const Operand& operand);
832 void EmitImmediate(const Immediate& imm); 815 void EmitImmediate(const Immediate& imm);
833 void EmitComplex(int rm, const Operand& operand, const Immediate& immediate); 816 void EmitComplex(int rm, const Operand& operand, const Immediate& immediate);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 } 859 }
877 860
878 861
879 inline void Assembler::EmitOperandSizeOverride() { 862 inline void Assembler::EmitOperandSizeOverride() {
880 EmitUint8(0x66); 863 EmitUint8(0x66);
881 } 864 }
882 865
883 } // namespace dart 866 } // namespace dart
884 867
885 #endif // VM_ASSEMBLER_IA32_H_ 868 #endif // VM_ASSEMBLER_IA32_H_
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm.h ('k') | runtime/vm/assembler_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698