| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 // TODO(vitalyr): the assembler does not need an isolate. | 488 // TODO(vitalyr): the assembler does not need an isolate. |
| 489 Assembler(Isolate* isolate, void* buffer, int buffer_size); | 489 Assembler(Isolate* isolate, void* buffer, int buffer_size); |
| 490 virtual ~Assembler() { } | 490 virtual ~Assembler() { } |
| 491 | 491 |
| 492 // GetCode emits any pending (non-emitted) code and fills the descriptor | 492 // GetCode emits any pending (non-emitted) code and fills the descriptor |
| 493 // desc. GetCode() is idempotent; it returns the same result if no other | 493 // desc. GetCode() is idempotent; it returns the same result if no other |
| 494 // Assembler functions are invoked in between GetCode() calls. | 494 // Assembler functions are invoked in between GetCode() calls. |
| 495 void GetCode(CodeDesc* desc); | 495 void GetCode(CodeDesc* desc); |
| 496 | 496 |
| 497 // Read/Modify the code target in the branch/call instruction at pc. | 497 // Read/Modify the code target in the branch/call instruction at pc. |
| 498 inline static Address target_address_at(Address pc, | 498 inline static Address target_address_at(Address pc, Address constant_pool); |
| 499 ConstantPoolArray* constant_pool); | 499 inline static void set_target_address_at( |
| 500 inline static void set_target_address_at(Address pc, | 500 Address pc, Address constant_pool, Address target, |
| 501 ConstantPoolArray* constant_pool, | 501 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED); |
| 502 Address target, | |
| 503 ICacheFlushMode icache_flush_mode = | |
| 504 FLUSH_ICACHE_IF_NEEDED); | |
| 505 static inline Address target_address_at(Address pc, Code* code) { | 502 static inline Address target_address_at(Address pc, Code* code) { |
| 506 ConstantPoolArray* constant_pool = code ? code->constant_pool() : NULL; | 503 Address constant_pool = code ? code->constant_pool() : NULL; |
| 507 return target_address_at(pc, constant_pool); | 504 return target_address_at(pc, constant_pool); |
| 508 } | 505 } |
| 509 static inline void set_target_address_at(Address pc, | 506 static inline void set_target_address_at(Address pc, |
| 510 Code* code, | 507 Code* code, |
| 511 Address target, | 508 Address target, |
| 512 ICacheFlushMode icache_flush_mode = | 509 ICacheFlushMode icache_flush_mode = |
| 513 FLUSH_ICACHE_IF_NEEDED) { | 510 FLUSH_ICACHE_IF_NEEDED) { |
| 514 ConstantPoolArray* constant_pool = code ? code->constant_pool() : NULL; | 511 Address constant_pool = code ? code->constant_pool() : NULL; |
| 515 set_target_address_at(pc, constant_pool, target); | 512 set_target_address_at(pc, constant_pool, target); |
| 516 } | 513 } |
| 517 | 514 |
| 518 // Return the code target address at a call site from the return address | 515 // Return the code target address at a call site from the return address |
| 519 // of that call in the instruction stream. | 516 // of that call in the instruction stream. |
| 520 inline static Address target_address_from_return_address(Address pc); | 517 inline static Address target_address_from_return_address(Address pc); |
| 521 | 518 |
| 522 // Return the code target address of the patch debug break slot | 519 // Return the code target address of the patch debug break slot |
| 523 inline static Address break_address_from_return_address(Address pc); | 520 inline static Address break_address_from_return_address(Address pc); |
| 524 | 521 |
| (...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 void RecordComment(const char* msg); | 942 void RecordComment(const char* msg); |
| 946 | 943 |
| 947 // Record a deoptimization reason that can be used by a log or cpu profiler. | 944 // Record a deoptimization reason that can be used by a log or cpu profiler. |
| 948 // Use --trace-deopt to enable. | 945 // Use --trace-deopt to enable. |
| 949 void RecordDeoptReason(const int reason, const SourcePosition position); | 946 void RecordDeoptReason(const int reason, const SourcePosition position); |
| 950 | 947 |
| 951 // Writes a single byte or word of data in the code stream. Used for | 948 // Writes a single byte or word of data in the code stream. Used for |
| 952 // inline tables, e.g., jump-tables. | 949 // inline tables, e.g., jump-tables. |
| 953 void db(uint8_t data); | 950 void db(uint8_t data); |
| 954 void dd(uint32_t data); | 951 void dd(uint32_t data); |
| 952 void dq(uint64_t data); |
| 953 void dp(uintptr_t data) { dd(data); } |
| 955 void dd(Label* label); | 954 void dd(Label* label); |
| 956 | 955 |
| 957 // Check if there is less than kGap bytes available in the buffer. | 956 // Check if there is less than kGap bytes available in the buffer. |
| 958 // If this is the case, we need to grow the buffer before emitting | 957 // If this is the case, we need to grow the buffer before emitting |
| 959 // an instruction or relocation information. | 958 // an instruction or relocation information. |
| 960 inline bool buffer_overflow() const { | 959 inline bool buffer_overflow() const { |
| 961 return pc_ >= reloc_info_writer.pos() - kGap; | 960 return pc_ >= reloc_info_writer.pos() - kGap; |
| 962 } | 961 } |
| 963 | 962 |
| 964 // Get the number of bytes available in the buffer. | 963 // Get the number of bytes available in the buffer. |
| 965 inline int available_space() const { return reloc_info_writer.pos() - pc_; } | 964 inline int available_space() const { return reloc_info_writer.pos() - pc_; } |
| 966 | 965 |
| 967 static bool IsNop(Address addr); | 966 static bool IsNop(Address addr); |
| 968 | 967 |
| 969 PositionsRecorder* positions_recorder() { return &positions_recorder_; } | 968 PositionsRecorder* positions_recorder() { return &positions_recorder_; } |
| 970 | 969 |
| 971 int relocation_writer_size() { | 970 int relocation_writer_size() { |
| 972 return (buffer_ + buffer_size_) - reloc_info_writer.pos(); | 971 return (buffer_ + buffer_size_) - reloc_info_writer.pos(); |
| 973 } | 972 } |
| 974 | 973 |
| 975 // Avoid overflows for displacements etc. | 974 // Avoid overflows for displacements etc. |
| 976 static const int kMaximalBufferSize = 512*MB; | 975 static const int kMaximalBufferSize = 512*MB; |
| 977 | 976 |
| 978 byte byte_at(int pos) { return buffer_[pos]; } | 977 byte byte_at(int pos) { return buffer_[pos]; } |
| 979 void set_byte_at(int pos, byte value) { buffer_[pos] = value; } | 978 void set_byte_at(int pos, byte value) { buffer_[pos] = value; } |
| 980 | 979 |
| 981 // Allocate a constant pool of the correct size for the generated code. | 980 void SetConstantPoolOffset(int pos, int offset, |
| 982 Handle<ConstantPoolArray> NewConstantPool(Isolate* isolate); | 981 ConstantPoolEntry::Access access, |
| 983 | 982 ConstantPoolEntry::Type type) { |
| 984 // Generate the constant pool for the generated code. | 983 // No embedded constant pool support. |
| 985 void PopulateConstantPool(ConstantPoolArray* constant_pool); | 984 UNREACHABLE(); |
| 985 } |
| 986 | 986 |
| 987 protected: | 987 protected: |
| 988 byte* addr_at(int pos) { return buffer_ + pos; } | 988 byte* addr_at(int pos) { return buffer_ + pos; } |
| 989 | 989 |
| 990 | 990 |
| 991 private: | 991 private: |
| 992 uint32_t long_at(int pos) { | 992 uint32_t long_at(int pos) { |
| 993 return *reinterpret_cast<uint32_t*>(addr_at(pos)); | 993 return *reinterpret_cast<uint32_t*>(addr_at(pos)); |
| 994 } | 994 } |
| 995 void long_at_put(int pos, uint32_t x) { | 995 void long_at_put(int pos, uint32_t x) { |
| 996 *reinterpret_cast<uint32_t*>(addr_at(pos)) = x; | 996 *reinterpret_cast<uint32_t*>(addr_at(pos)) = x; |
| 997 } | 997 } |
| 998 | 998 |
| 999 // code emission | 999 // code emission |
| 1000 void GrowBuffer(); | 1000 void GrowBuffer(); |
| 1001 inline void emit(uint32_t x); | 1001 inline void emit(uint32_t x); |
| 1002 inline void emit(Handle<Object> handle); | 1002 inline void emit(Handle<Object> handle); |
| 1003 inline void emit(uint32_t x, | 1003 inline void emit(uint32_t x, |
| 1004 RelocInfo::Mode rmode, | 1004 RelocInfo::Mode rmode, |
| 1005 TypeFeedbackId id = TypeFeedbackId::None()); | 1005 TypeFeedbackId id = TypeFeedbackId::None()); |
| 1006 inline void emit(Handle<Code> code, | 1006 inline void emit(Handle<Code> code, |
| 1007 RelocInfo::Mode rmode, | 1007 RelocInfo::Mode rmode, |
| 1008 TypeFeedbackId id = TypeFeedbackId::None()); | 1008 TypeFeedbackId id = TypeFeedbackId::None()); |
| 1009 inline void emit(const Immediate& x); | 1009 inline void emit(const Immediate& x); |
| 1010 inline void emit_w(const Immediate& x); | 1010 inline void emit_w(const Immediate& x); |
| 1011 inline void emit_q(uint64_t x); |
| 1011 | 1012 |
| 1012 // Emit the code-object-relative offset of the label's position | 1013 // Emit the code-object-relative offset of the label's position |
| 1013 inline void emit_code_relative_offset(Label* label); | 1014 inline void emit_code_relative_offset(Label* label); |
| 1014 | 1015 |
| 1015 // instruction generation | 1016 // instruction generation |
| 1016 void emit_arith_b(int op1, int op2, Register dst, int imm8); | 1017 void emit_arith_b(int op1, int op2, Register dst, int imm8); |
| 1017 | 1018 |
| 1018 // Emit a basic arithmetic instruction (i.e. first byte of the family is 0x81) | 1019 // Emit a basic arithmetic instruction (i.e. first byte of the family is 0x81) |
| 1019 // with a given destination expression and an immediate operand. It attempts | 1020 // with a given destination expression and an immediate operand. It attempts |
| 1020 // to use the shortest encoding possible. | 1021 // to use the shortest encoding possible. |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1079 private: | 1080 private: |
| 1080 Assembler* assembler_; | 1081 Assembler* assembler_; |
| 1081 #ifdef DEBUG | 1082 #ifdef DEBUG |
| 1082 int space_before_; | 1083 int space_before_; |
| 1083 #endif | 1084 #endif |
| 1084 }; | 1085 }; |
| 1085 | 1086 |
| 1086 } } // namespace v8::internal | 1087 } } // namespace v8::internal |
| 1087 | 1088 |
| 1088 #endif // V8_X87_ASSEMBLER_X87_H_ | 1089 #endif // V8_X87_ASSEMBLER_X87_H_ |
| OLD | NEW |