| Index: src/x64/assembler-x64.h
|
| ===================================================================
|
| --- src/x64/assembler-x64.h (revision 6955)
|
| +++ src/x64/assembler-x64.h (working copy)
|
| @@ -112,15 +112,15 @@
|
| ASSERT(index >= 0 && index < kNumAllocatableRegisters);
|
| const char* const names[] = {
|
| "rax",
|
| + "rbx",
|
| + "rdx",
|
| "rcx",
|
| - "rdx",
|
| - "rbx",
|
| "rdi",
|
| "r8",
|
| "r9",
|
| "r11",
|
| - "r12",
|
| - "r14"
|
| + "r14",
|
| + "r12"
|
| };
|
| return names[index];
|
| }
|
| @@ -153,6 +153,7 @@
|
| // Unfortunately we can't make this private in a struct when initializing
|
| // by assignment.
|
| int code_;
|
| +
|
| private:
|
| static const int registerCodeByAllocationIndex[kNumAllocatableRegisters];
|
| static const int allocationIndexByRegisterCode[kNumRegisters];
|
| @@ -215,6 +216,7 @@
|
| }
|
|
|
| bool is_valid() const { return 0 <= code_ && code_ < kNumRegisters; }
|
| + bool is(XMMRegister reg) const { return code_ == reg.code_; }
|
| int code() const {
|
| ASSERT(is_valid());
|
| return code_;
|
| @@ -389,11 +391,15 @@
|
| // this must not overflow.
|
| Operand(const Operand& base, int32_t offset);
|
|
|
| + // Checks whether either base or index register is the given register.
|
| + // Does not check the "reg" part of the Operand.
|
| + bool AddressUsesRegister(Register reg) const;
|
| +
|
| private:
|
| byte rex_;
|
| byte buf_[6];
|
| - // The number of bytes in buf_.
|
| - unsigned int len_;
|
| + // The number of bytes of buf_ in use.
|
| + byte len_;
|
|
|
| // Set the ModR/M byte without an encoded 'reg' register. The
|
| // register is encoded later as part of the emit_operand operation.
|
| @@ -607,6 +613,9 @@
|
| void popfq();
|
|
|
| void push(Immediate value);
|
| + // Push a 32 bit integer, and guarantee that it is actually pushed as a
|
| + // 32 bit value, the normal push will optimize the 8 bit case.
|
| + void push_imm32(int32_t imm32);
|
| void push(Register src);
|
| void push(const Operand& src);
|
|
|
| @@ -724,6 +733,10 @@
|
| arithmetic_op_32(0x1b, dst, src);
|
| }
|
|
|
| + void sbbq(Register dst, Register src) {
|
| + arithmetic_op(0x1b, dst, src);
|
| + }
|
| +
|
| void cmpb(Register dst, Immediate src) {
|
| immediate_arithmetic_op_8(0x7, dst, src);
|
| }
|
| @@ -834,6 +847,10 @@
|
| arithmetic_op_32(0x23, dst, src);
|
| }
|
|
|
| + void andl(Register dst, const Operand& src) {
|
| + arithmetic_op_32(0x23, dst, src);
|
| + }
|
| +
|
| void andb(Register dst, Immediate src) {
|
| immediate_arithmetic_op_8(0x4, dst, src);
|
| }
|
| @@ -1218,11 +1235,16 @@
|
| void movsd(XMMRegister dst, XMMRegister src);
|
| void movsd(XMMRegister dst, const Operand& src);
|
|
|
| + void movdqa(const Operand& dst, XMMRegister src);
|
| + void movdqa(XMMRegister dst, const Operand& src);
|
| +
|
| void movss(XMMRegister dst, const Operand& src);
|
| void movss(const Operand& dst, XMMRegister src);
|
|
|
| void cvttss2si(Register dst, const Operand& src);
|
| + void cvttss2si(Register dst, XMMRegister src);
|
| void cvttsd2si(Register dst, const Operand& src);
|
| + void cvttsd2si(Register dst, XMMRegister src);
|
| void cvttsd2siq(Register dst, XMMRegister src);
|
|
|
| void cvtlsi2sd(XMMRegister dst, const Operand& src);
|
| @@ -1256,10 +1278,6 @@
|
| void emit_sse_operand(XMMRegister dst, Register src);
|
| void emit_sse_operand(Register dst, XMMRegister src);
|
|
|
| - // Use either movsd or movlpd.
|
| - // void movdbl(XMMRegister dst, const Operand& src);
|
| - // void movdbl(const Operand& dst, XMMRegister src);
|
| -
|
| // Debugging
|
| void Print();
|
|
|
| @@ -1278,7 +1296,7 @@
|
|
|
| // Writes a single word of data in the code stream.
|
| // Used for inline tables, e.g., jump-tables.
|
| - void db(uint8_t data) { UNIMPLEMENTED(); }
|
| + void db(uint8_t data);
|
| void dd(uint32_t data);
|
|
|
| int pc_offset() const { return static_cast<int>(pc_ - buffer_); }
|
|
|