| Index: src/x64/assembler-x64.h
|
| ===================================================================
|
| --- src/x64/assembler-x64.h (revision 2061)
|
| +++ src/x64/assembler-x64.h (working copy)
|
| @@ -253,143 +253,44 @@
|
|
|
| class Operand BASE_EMBEDDED {
|
| public:
|
| - // reg
|
| - INLINE(explicit Operand(Register reg));
|
| -
|
| - // MemoryOperand
|
| - INLINE(explicit Operand()) { UNIMPLEMENTED(); }
|
| -
|
| - // Returns true if this Operand is a wrapper for the specified register.
|
| - bool is_reg(Register reg) const;
|
| -
|
| - // These constructors have been moved to MemOperand, and should
|
| - // be removed from Operand as soon as all their uses use MemOperands instead.
|
| - // [disp/r]
|
| - INLINE(explicit Operand(intptr_t disp, RelocInfo::Mode rmode)) {
|
| - UNIMPLEMENTED();
|
| - }
|
| - // disp only must always be relocated
|
| -
|
| // [base + disp/r]
|
| - explicit Operand(Register base, int32_t disp,
|
| - RelocInfo::Mode rmode = RelocInfo::NONE);
|
| + INLINE(Operand(Register base, int32_t disp));
|
|
|
| // [base + index*scale + disp/r]
|
| - explicit Operand(Register base,
|
| - Register index,
|
| - ScaleFactor scale,
|
| - int32_t disp,
|
| - RelocInfo::Mode rmode = RelocInfo::NONE);
|
| + Operand(Register base,
|
| + Register index,
|
| + ScaleFactor scale,
|
| + int32_t disp);
|
|
|
| // [index*scale + disp/r]
|
| - explicit Operand(Register index,
|
| - ScaleFactor scale,
|
| - int32_t disp,
|
| - RelocInfo::Mode rmode = RelocInfo::NONE);
|
| + Operand(Register index,
|
| + ScaleFactor scale,
|
| + int32_t disp);
|
|
|
| - // End of constructors and methods that have been moved to MemOperand.
|
| -
|
| private:
|
| byte rex_;
|
| byte buf_[10];
|
| // The number of bytes in buf_.
|
| unsigned int len_;
|
| - // Only valid if len_ > 4.
|
| RelocInfo::Mode rmode_;
|
|
|
| // Set the ModRM byte without an encoded 'reg' register. The
|
| // register is encoded later as part of the emit_operand operation.
|
| + // set_modrm can be called before or after set_sib and set_disp*.
|
| inline void set_modrm(int mod, Register rm);
|
|
|
| + // Set the SIB byte if one is needed. Sets the length to 2 rather than 1.
|
| inline void set_sib(ScaleFactor scale, Register index, Register base);
|
| - inline void set_disp8(int8_t disp);
|
| - inline void set_disp32(int32_t disp);
|
|
|
| + // Adds operand displacement fields (offsets added to the memory address).
|
| + // Needs to be called after set_sib, not before it.
|
| + inline void set_disp8(int disp);
|
| + inline void set_disp32(int disp);
|
| +
|
| friend class Assembler;
|
| };
|
|
|
| -class MemOperand : public Operand {
|
| - public:
|
| - // [disp/r]
|
| - INLINE(explicit MemOperand(int32_t disp, RelocInfo::Mode rmode)) :
|
| - Operand() {
|
| - UNIMPLEMENTED();
|
| - }
|
| - // disp only must always be relocated
|
|
|
| - // [base + disp/r]
|
| - explicit MemOperand(Register base, int32_t disp,
|
| - RelocInfo::Mode rmode = RelocInfo::NONE);
|
| -
|
| - // [base + index*scale + disp/r]
|
| - explicit MemOperand(Register base,
|
| - Register index,
|
| - ScaleFactor scale,
|
| - int32_t disp,
|
| - RelocInfo::Mode rmode = RelocInfo::NONE);
|
| -
|
| - // [index*scale + disp/r]
|
| - explicit MemOperand(Register index,
|
| - ScaleFactor scale,
|
| - int32_t disp,
|
| - RelocInfo::Mode rmode = RelocInfo::NONE);
|
| -};
|
| -
|
| -// -----------------------------------------------------------------------------
|
| -// A Displacement describes the 32bit immediate field of an instruction which
|
| -// may be used together with a Label in order to refer to a yet unknown code
|
| -// position. Displacements stored in the instruction stream are used to describe
|
| -// the instruction and to chain a list of instructions using the same Label.
|
| -// A Displacement contains 2 different fields:
|
| -//
|
| -// next field: position of next displacement in the chain (0 = end of list)
|
| -// type field: instruction type
|
| -//
|
| -// A next value of null (0) indicates the end of a chain (note that there can
|
| -// be no displacement at position zero, because there is always at least one
|
| -// instruction byte before the displacement).
|
| -//
|
| -// Displacement _data field layout
|
| -//
|
| -// |31.....2|1......0|
|
| -// [ next | type |
|
| -
|
| -class Displacement BASE_EMBEDDED {
|
| - public:
|
| - enum Type {
|
| - UNCONDITIONAL_JUMP,
|
| - CODE_RELATIVE,
|
| - OTHER
|
| - };
|
| -
|
| - int data() const { return data_; }
|
| - Type type() const { return TypeField::decode(data_); }
|
| - void next(Label* L) const {
|
| - int n = NextField::decode(data_);
|
| - n > 0 ? L->link_to(n) : L->Unuse();
|
| - }
|
| - void link_to(Label* L) { init(L, type()); }
|
| -
|
| - explicit Displacement(int data) { data_ = data; }
|
| -
|
| - Displacement(Label* L, Type type) { init(L, type); }
|
| -
|
| - void print() {
|
| - PrintF("%s (%x) ", (type() == UNCONDITIONAL_JUMP ? "jmp" : "[other]"),
|
| - NextField::decode(data_));
|
| - }
|
| -
|
| - private:
|
| - int data_;
|
| -
|
| - class TypeField: public BitField<Type, 0, 2> {};
|
| - class NextField: public BitField<int, 2, 32-2> {};
|
| -
|
| - void init(Label* L, Type type);
|
| -};
|
| -
|
| -
|
| -
|
| // CpuFeatures keeps track of which features are supported by the target CPU.
|
| // Supported features must be enabled by a Scope before use.
|
| // Example:
|
| @@ -850,11 +751,6 @@
|
| void bind_to(Label* L, int pos);
|
| void link_to(Label* L, Label* appendix);
|
|
|
| - // displacements
|
| - inline Displacement disp_at(Label* L);
|
| - inline void disp_at_put(Label* L, Displacement disp);
|
| - inline void emit_disp(Label* L, Displacement::Type type);
|
| -
|
| // record reloc info for current pc_
|
| void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0);
|
|
|
|
|