| Index: src/arm/assembler-arm.h
|
| diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h
|
| index b9f022a5ab7aec40e2017e85fddcebb78d6377f1..ac51f5a5cdcdcb489aef8120fb8222599f089b18 100644
|
| --- a/src/arm/assembler-arm.h
|
| +++ b/src/arm/assembler-arm.h
|
| @@ -524,6 +524,8 @@ class Operand BASE_EMBEDDED {
|
| // rm <shift_op> rs
|
| explicit Operand(Register rm, ShiftOp shift_op, Register rs);
|
|
|
| + static Operand EmbeddedNumber(double value); // Smi or HeapNumber
|
| +
|
| // Return true if this is a register operand.
|
| INLINE(bool is_reg() const) {
|
| return rm_.is_valid() &&
|
| @@ -548,19 +550,35 @@ class Operand BASE_EMBEDDED {
|
|
|
| inline int32_t immediate() const {
|
| DCHECK(!rm_.is_valid());
|
| - return imm32_;
|
| + DCHECK(!is_heap_number());
|
| + return value_.immediate;
|
| + }
|
| +
|
| + double heap_number() const {
|
| + DCHECK(is_heap_number());
|
| + return value_.heap_number;
|
| }
|
|
|
| Register rm() const { return rm_; }
|
| Register rs() const { return rs_; }
|
| ShiftOp shift_op() const { return shift_op_; }
|
| + bool is_heap_number() const {
|
| + DCHECK_IMPLIES(is_heap_number_, !rm_.is_valid());
|
| + DCHECK_IMPLIES(is_heap_number_, rmode_ == RelocInfo::EMBEDDED_OBJECT);
|
| + return is_heap_number_;
|
| + }
|
| +
|
|
|
| private:
|
| Register rm_;
|
| Register rs_;
|
| ShiftOp shift_op_;
|
| - int shift_imm_; // valid if rm_ != no_reg && rs_ == no_reg
|
| - int32_t imm32_; // valid if rm_ == no_reg
|
| + int shift_imm_; // valid if rm_ != no_reg && rs_ == no_reg
|
| + union {
|
| + double heap_number; // if is_heap_number_
|
| + int32_t immediate; // otherwise
|
| + } value_; // valid if rm_ == no_reg
|
| + bool is_heap_number_ = false;
|
| RelocInfo::Mode rmode_;
|
|
|
| friend class Assembler;
|
| @@ -703,7 +721,7 @@ class Assembler : public AssemblerBase {
|
| // GetCode emits any pending (non-emitted) code and fills the descriptor
|
| // desc. GetCode() is idempotent; it returns the same result if no other
|
| // Assembler functions are invoked in between GetCode() calls.
|
| - void GetCode(CodeDesc* desc);
|
| + void GetCode(Isolate* isolate, CodeDesc* desc);
|
|
|
| // Label operations & relative jumps (PPUM Appendix D)
|
| //
|
| @@ -1538,6 +1556,14 @@ class Assembler : public AssemblerBase {
|
| // the marker and branch over the data.
|
| void RecordConstPool(int size);
|
|
|
| + // Patch the dummy heap number that we emitted during code assembly in the
|
| + // constant pool entry referenced by {pc}. Replace it with the actual heap
|
| + // object (handle).
|
| + static void set_heap_number(Handle<HeapObject> number, Address pc) {
|
| + Memory::Address_at(constant_pool_entry_address(pc, 0 /* unused */)) =
|
| + reinterpret_cast<Address>(number.location());
|
| + }
|
| +
|
| // Writes a single byte or word of data in the code stream. Used
|
| // for inline tables, e.g., jump-tables. CheckConstantPool() should be
|
| // called before any use of db/dd/dq/dp to ensure that constant pools
|
|
|