Index: src/x64/assembler-x64.h |
=================================================================== |
--- src/x64/assembler-x64.h (revision 2088) |
+++ src/x64/assembler-x64.h (working copy) |
@@ -294,11 +294,11 @@ |
static void Probe(); |
// Check whether a feature is supported by the target CPU. |
static bool IsSupported(Feature f) { |
- return (supported_ & (static_cast<uint64_t>(1) << f)) != 0; |
+ return (supported_ & (V8_UINT64_C(1) << f)) != 0; |
} |
// Check whether a feature is currently enabled. |
static bool IsEnabled(Feature f) { |
- return (enabled_ & (static_cast<uint64_t>(1) << f)) != 0; |
+ return (enabled_ & (V8_UINT64_C(1) << f)) != 0; |
} |
// Enable a specified feature within a scope. |
class Scope BASE_EMBEDDED { |
@@ -307,7 +307,7 @@ |
explicit Scope(Feature f) { |
ASSERT(CpuFeatures::IsSupported(f)); |
old_enabled_ = CpuFeatures::enabled_; |
- CpuFeatures::enabled_ |= (static_cast<uint64_t>(1) << f); |
+ CpuFeatures::enabled_ |= (V8_UINT64_C(1) << f); |
} |
~Scope() { CpuFeatures::enabled_ = old_enabled_; } |
private: |
@@ -355,8 +355,9 @@ |
void GetCode(CodeDesc* desc); |
// Read/Modify the code target in the branch/call instruction at pc. |
- inline static Address target_address_at(Address pc); |
- inline static void set_target_address_at(Address pc, Address target); |
+ // On the x64 architecture, the address is absolute, not relative. |
+ static inline Address target_address_at(Address pc); |
+ static inline void set_target_address_at(Address pc, Address target); |
// Distance between the address of the code target in the call instruction |
// and the return address |
@@ -387,13 +388,10 @@ |
void Align(int m); |
// Stack |
- void pushad(); |
- void popad(); |
+ void pushfq(); |
+ void popfq(); |
- void pushfd(); |
- void popfd(); |
- |
- void push(const Immediate& x); |
+ void push(Immediate value); |
void push(Register src); |
void push(const Operand& src); |
void push(Label* label, RelocInfo::Mode relocation_mode); |
@@ -401,7 +399,7 @@ |
void pop(Register dst); |
void pop(const Operand& dst); |
- void enter(const Immediate& size); |
+ void enter(Immediate size); |
void leave(); |
// Moves |
@@ -409,6 +407,10 @@ |
void movb(const Operand& dst, int8_t imm8); |
void movb(const Operand& dst, Register src); |
+ void movl(Register dst, Register src); |
+ void movl(Register dst, const Operand& src); |
+ void movl(const Operand& dst, Register src); |
+ |
void movq(Register dst, int32_t imm32); |
void movq(Register dst, Immediate x); |
void movq(Register dst, const Operand& src); |
@@ -515,7 +517,8 @@ |
void dec(Register dst); |
void dec(const Operand& dst); |
- void cdq(); |
+ // Sign-extends rax into rdx:rax. |
+ void cqo(); |
void idiv(Register src); |
@@ -830,6 +833,7 @@ |
inline void emitl(uint32_t x); |
inline void emit(Handle<Object> handle); |
inline void emitq(uint64_t x, RelocInfo::Mode rmode); |
+ inline void emitw(uint16_t x); |
void emit(Immediate x) { emitl(x.value_); } |
// Emits a REX prefix that encodes a 64-bit operand size and |
@@ -858,6 +862,9 @@ |
// REX.W is set and REX.R clear. |
inline void emit_rex_64(const Operand& op); |
+ // Emit a REX prefix that only sets REX.W to choose a 64-bit operand size. |
+ void emit_rex_64() { emit(0x48); } |
+ |
// High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. |
// REX.W is clear. |
inline void emit_rex_32(Register reg, Register rm_reg); |