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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 | 268 |
269 class Immediate BASE_EMBEDDED { | 269 class Immediate BASE_EMBEDDED { |
270 public: | 270 public: |
271 inline explicit Immediate(int x); | 271 inline explicit Immediate(int x); |
272 inline explicit Immediate(const ExternalReference& ext); | 272 inline explicit Immediate(const ExternalReference& ext); |
273 inline explicit Immediate(Handle<Object> handle); | 273 inline explicit Immediate(Handle<Object> handle); |
274 inline explicit Immediate(Smi* value); | 274 inline explicit Immediate(Smi* value); |
275 inline explicit Immediate(Address addr); | 275 inline explicit Immediate(Address addr); |
276 inline explicit Immediate(Address x, RelocInfo::Mode rmode); | 276 inline explicit Immediate(Address x, RelocInfo::Mode rmode); |
277 | 277 |
| 278 static Immediate EmbeddedNumber(double value); // Smi or HeapNumber. |
| 279 |
278 static Immediate CodeRelativeOffset(Label* label) { | 280 static Immediate CodeRelativeOffset(Label* label) { |
279 return Immediate(label); | 281 return Immediate(label); |
280 } | 282 } |
281 | 283 |
282 bool is_zero() const { return x_ == 0 && RelocInfo::IsNone(rmode_); } | 284 bool is_heap_number() const { |
| 285 DCHECK_IMPLIES(is_heap_number_, rmode_ == RelocInfo::EMBEDDED_OBJECT); |
| 286 return is_heap_number_; |
| 287 } |
| 288 |
| 289 double heap_number() const { |
| 290 DCHECK(is_heap_number()); |
| 291 return value_.heap_number; |
| 292 } |
| 293 |
| 294 int immediate() const { |
| 295 DCHECK(!is_heap_number()); |
| 296 return value_.immediate; |
| 297 } |
| 298 |
| 299 bool is_zero() const { return RelocInfo::IsNone(rmode_) && immediate() == 0; } |
283 bool is_int8() const { | 300 bool is_int8() const { |
284 return -128 <= x_ && x_ < 128 && RelocInfo::IsNone(rmode_); | 301 return RelocInfo::IsNone(rmode_) && i::is_int8(immediate()); |
285 } | 302 } |
286 bool is_uint8() const { | 303 bool is_uint8() const { |
287 return v8::internal::is_uint8(x_) && RelocInfo::IsNone(rmode_); | 304 return RelocInfo::IsNone(rmode_) && i::is_uint8(immediate()); |
288 } | 305 } |
289 bool is_int16() const { | 306 bool is_int16() const { |
290 return -32768 <= x_ && x_ < 32768 && RelocInfo::IsNone(rmode_); | 307 return RelocInfo::IsNone(rmode_) && i::is_int16(immediate()); |
291 } | 308 } |
| 309 |
292 bool is_uint16() const { | 310 bool is_uint16() const { |
293 return v8::internal::is_uint16(x_) && RelocInfo::IsNone(rmode_); | 311 return RelocInfo::IsNone(rmode_) && i::is_uint16(immediate()); |
294 } | 312 } |
295 | 313 |
296 private: | 314 private: |
297 inline explicit Immediate(Label* value); | 315 inline explicit Immediate(Label* value); |
298 | 316 |
299 int x_; | 317 union { |
| 318 double heap_number; |
| 319 int immediate; |
| 320 } value_; |
| 321 bool is_heap_number_ = false; |
300 RelocInfo::Mode rmode_; | 322 RelocInfo::Mode rmode_; |
301 | 323 |
302 friend class Operand; | 324 friend class Operand; |
303 friend class Assembler; | 325 friend class Assembler; |
304 friend class MacroAssembler; | 326 friend class MacroAssembler; |
305 }; | 327 }; |
306 | 328 |
307 | 329 |
308 // ----------------------------------------------------------------------------- | 330 // ----------------------------------------------------------------------------- |
309 // Machine instruction Operands | 331 // Machine instruction Operands |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
368 RelocInfo::EXTERNAL_REFERENCE); | 390 RelocInfo::EXTERNAL_REFERENCE); |
369 } | 391 } |
370 | 392 |
371 static Operand ForCell(Handle<Cell> cell) { | 393 static Operand ForCell(Handle<Cell> cell) { |
372 AllowDeferredHandleDereference embedding_raw_address; | 394 AllowDeferredHandleDereference embedding_raw_address; |
373 return Operand(reinterpret_cast<int32_t>(cell.location()), | 395 return Operand(reinterpret_cast<int32_t>(cell.location()), |
374 RelocInfo::CELL); | 396 RelocInfo::CELL); |
375 } | 397 } |
376 | 398 |
377 static Operand ForRegisterPlusImmediate(Register base, Immediate imm) { | 399 static Operand ForRegisterPlusImmediate(Register base, Immediate imm) { |
378 return Operand(base, imm.x_, imm.rmode_); | 400 return Operand(base, imm.value_.immediate, imm.rmode_); |
379 } | 401 } |
380 | 402 |
381 // Returns true if this Operand is a wrapper for the specified register. | 403 // Returns true if this Operand is a wrapper for the specified register. |
382 bool is_reg(Register reg) const; | 404 bool is_reg(Register reg) const; |
383 | 405 |
384 // Returns true if this Operand is a wrapper for one register. | 406 // Returns true if this Operand is a wrapper for one register. |
385 bool is_reg_only() const; | 407 bool is_reg_only() const; |
386 | 408 |
387 // Asserts that this Operand is a wrapper for one register and returns the | 409 // Asserts that this Operand is a wrapper for one register and returns the |
388 // register. | 410 // register. |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 // is too small, a fatal error occurs. No deallocation of the buffer is done | 508 // is too small, a fatal error occurs. No deallocation of the buffer is done |
487 // upon destruction of the assembler. | 509 // upon destruction of the assembler. |
488 Assembler(Isolate* isolate, void* buffer, int buffer_size) | 510 Assembler(Isolate* isolate, void* buffer, int buffer_size) |
489 : Assembler(IsolateData(isolate), buffer, buffer_size) {} | 511 : Assembler(IsolateData(isolate), buffer, buffer_size) {} |
490 Assembler(IsolateData isolate_data, void* buffer, int buffer_size); | 512 Assembler(IsolateData isolate_data, void* buffer, int buffer_size); |
491 virtual ~Assembler() { } | 513 virtual ~Assembler() { } |
492 | 514 |
493 // GetCode emits any pending (non-emitted) code and fills the descriptor | 515 // GetCode emits any pending (non-emitted) code and fills the descriptor |
494 // desc. GetCode() is idempotent; it returns the same result if no other | 516 // desc. GetCode() is idempotent; it returns the same result if no other |
495 // Assembler functions are invoked in between GetCode() calls. | 517 // Assembler functions are invoked in between GetCode() calls. |
496 void GetCode(CodeDesc* desc); | 518 void GetCode(Isolate* isolate, CodeDesc* desc); |
497 | 519 |
498 // Read/Modify the code target in the branch/call instruction at pc. | 520 // Read/Modify the code target in the branch/call instruction at pc. |
499 // The isolate argument is unused (and may be nullptr) when skipping flushing. | 521 // The isolate argument is unused (and may be nullptr) when skipping flushing. |
500 inline static Address target_address_at(Address pc, Address constant_pool); | 522 inline static Address target_address_at(Address pc, Address constant_pool); |
501 inline static void set_target_address_at( | 523 inline static void set_target_address_at( |
502 Isolate* isolate, Address pc, Address constant_pool, Address target, | 524 Isolate* isolate, Address pc, Address constant_pool, Address target, |
503 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED); | 525 ICacheFlushMode icache_flush_mode = FLUSH_ICACHE_IF_NEEDED); |
504 static inline Address target_address_at(Address pc, Code* code); | 526 static inline Address target_address_at(Address pc, Code* code); |
505 static inline void set_target_address_at( | 527 static inline void set_target_address_at( |
506 Isolate* isolate, Address pc, Code* code, Address target, | 528 Isolate* isolate, Address pc, Code* code, Address target, |
(...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1608 byte byte_at(int pos) { return buffer_[pos]; } | 1630 byte byte_at(int pos) { return buffer_[pos]; } |
1609 void set_byte_at(int pos, byte value) { buffer_[pos] = value; } | 1631 void set_byte_at(int pos, byte value) { buffer_[pos] = value; } |
1610 | 1632 |
1611 void PatchConstantPoolAccessInstruction(int pc_offset, int offset, | 1633 void PatchConstantPoolAccessInstruction(int pc_offset, int offset, |
1612 ConstantPoolEntry::Access access, | 1634 ConstantPoolEntry::Access access, |
1613 ConstantPoolEntry::Type type) { | 1635 ConstantPoolEntry::Type type) { |
1614 // No embedded constant pool support. | 1636 // No embedded constant pool support. |
1615 UNREACHABLE(); | 1637 UNREACHABLE(); |
1616 } | 1638 } |
1617 | 1639 |
| 1640 // Patch the dummy heap number that we emitted at {pc} during code assembly |
| 1641 // with the actual heap object (handle). |
| 1642 static void set_heap_number(Handle<HeapObject> number, Address pc) { |
| 1643 Memory::Object_Handle_at(pc) = number; |
| 1644 } |
| 1645 |
1618 protected: | 1646 protected: |
1619 void emit_sse_operand(XMMRegister reg, const Operand& adr); | 1647 void emit_sse_operand(XMMRegister reg, const Operand& adr); |
1620 void emit_sse_operand(XMMRegister dst, XMMRegister src); | 1648 void emit_sse_operand(XMMRegister dst, XMMRegister src); |
1621 void emit_sse_operand(Register dst, XMMRegister src); | 1649 void emit_sse_operand(Register dst, XMMRegister src); |
1622 void emit_sse_operand(XMMRegister dst, Register src); | 1650 void emit_sse_operand(XMMRegister dst, Register src); |
1623 | 1651 |
1624 byte* addr_at(int pos) { return buffer_ + pos; } | 1652 byte* addr_at(int pos) { return buffer_ + pos; } |
1625 | 1653 |
1626 | 1654 |
1627 private: | 1655 private: |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1736 Assembler* assembler_; | 1764 Assembler* assembler_; |
1737 #ifdef DEBUG | 1765 #ifdef DEBUG |
1738 int space_before_; | 1766 int space_before_; |
1739 #endif | 1767 #endif |
1740 }; | 1768 }; |
1741 | 1769 |
1742 } // namespace internal | 1770 } // namespace internal |
1743 } // namespace v8 | 1771 } // namespace v8 |
1744 | 1772 |
1745 #endif // V8_IA32_ASSEMBLER_IA32_H_ | 1773 #endif // V8_IA32_ASSEMBLER_IA32_H_ |
OLD | NEW |