Index: src/x64/assembler-x64.h |
diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h |
index ba9810a4e27599a334ae808a5c39c2542c4722fe..8e54ffe936470af2aa97e4bbbd7257f08a3f3d28 100644 |
--- a/src/x64/assembler-x64.h |
+++ b/src/x64/assembler-x64.h |
@@ -156,7 +156,7 @@ extern MMXRegister mm15; |
struct XMMRegister { |
- bool is_valid() const { return 0 <= code_ && code_ < 2; } |
+ bool is_valid() const { return 0 <= code_ && code_ < 16; } |
int code() const { |
ASSERT(is_valid()); |
return code_; |
@@ -330,11 +330,11 @@ class Operand BASE_EMBEDDED { |
// CpuFeatures keeps track of which features are supported by the target CPU. |
// Supported features must be enabled by a Scope before use. |
// Example: |
-// if (CpuFeatures::IsSupported(SSE2)) { |
-// CpuFeatures::Scope fscope(SSE2); |
-// // Generate SSE2 floating point code. |
+// if (CpuFeatures::IsSupported(SSE3)) { |
+// CpuFeatures::Scope fscope(SSE3); |
+// // Generate SSE3 floating point code. |
// } else { |
-// // Generate standard x87 floating point code. |
+// // Generate standard x87 or SSE2 floating point code. |
// } |
class CpuFeatures : public AllStatic { |
public: |
@@ -371,6 +371,10 @@ class CpuFeatures : public AllStatic { |
#endif |
}; |
private: |
+ // Safe defaults include SSE2 and CMOV for X64. It is always available, if |
+ // anyone checks, but they shouldn't need to check. |
+ static const uint64_t kDefaultCpuFeatures = |
+ (1 << CpuFeatures::SSE2 | 1 << CpuFeatures::CMOV); |
static uint64_t supported_; |
static uint64_t enabled_; |
}; |
@@ -497,8 +501,11 @@ class Assembler : public Malloced { |
void load_rax(void* ptr, RelocInfo::Mode rmode); |
void load_rax(ExternalReference ext); |
- // Conditional moves |
- // Implement conditional moves here. |
+ // Conditional moves. |
+ void cmovq(Condition cc, Register dst, Register src); |
+ void cmovq(Condition cc, Register dst, const Operand& src); |
+ void cmovl(Condition cc, Register dst, Register src); |
+ void cmovl(Condition cc, Register dst, const Operand& src); |
// Exchange two registers |
void xchg(Register dst, Register src); |
@@ -512,6 +519,10 @@ class Assembler : public Malloced { |
arithmetic_op_32(0x03, dst, src); |
} |
+ void addl(Register dst, Immediate src) { |
+ immediate_arithmetic_op_32(0x0, dst, src); |
+ } |
+ |
void addq(Register dst, const Operand& src) { |
arithmetic_op(0x03, dst, src); |
} |
@@ -844,17 +855,32 @@ class Assembler : public Malloced { |
void frndint(); |
- // SSE2 instructions |
+ void sahf(); |
+ |
+ // SSE2 instructions |
+ void movsd(const Operand& dst, XMMRegister src); |
+ void movsd(Register src, XMMRegister dst); |
+ void movsd(XMMRegister dst, Register src); |
+ void movsd(XMMRegister src, const Operand& dst); |
+ |
void cvttss2si(Register dst, const Operand& src); |
void cvttsd2si(Register dst, const Operand& src); |
- void cvtsi2sd(XMMRegister dst, const Operand& src); |
+ void cvtlsi2sd(XMMRegister dst, const Operand& src); |
+ void cvtlsi2sd(XMMRegister dst, Register src); |
+ void cvtqsi2sd(XMMRegister dst, const Operand& src); |
+ void cvtqsi2sd(XMMRegister dst, Register src); |
void addsd(XMMRegister dst, XMMRegister src); |
void subsd(XMMRegister dst, XMMRegister src); |
void mulsd(XMMRegister dst, XMMRegister src); |
void divsd(XMMRegister dst, XMMRegister src); |
+ |
+ void emit_sse_operand(XMMRegister dst, XMMRegister src); |
+ void emit_sse_operand(XMMRegister reg, const Operand& adr); |
+ void emit_sse_operand(XMMRegister dst, Register src); |
+ |
// Use either movsd or movlpd. |
// void movdbl(XMMRegister dst, const Operand& src); |
// void movdbl(const Operand& dst, XMMRegister src); |
@@ -933,6 +959,7 @@ class Assembler : public Malloced { |
// High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. |
// REX.W is set. |
inline void emit_rex_64(Register reg, Register rm_reg); |
+ inline void emit_rex_64(XMMRegister reg, Register rm_reg); |
// Emits a REX prefix that encodes a 64-bit operand size and |
// the top bit of the destination, index, and base register codes. |
@@ -940,6 +967,7 @@ class Assembler : public Malloced { |
// register is used for REX.B, and the high bit of op's index register |
// is used for REX.X. REX.W is set. |
inline void emit_rex_64(Register reg, const Operand& op); |
+ inline void emit_rex_64(XMMRegister reg, const Operand& op); |
// Emits a REX prefix that encodes a 64-bit operand size and |
// the top bit of the register code. |
@@ -984,6 +1012,18 @@ class Assembler : public Malloced { |
// is emitted. |
inline void emit_optional_rex_32(Register reg, const Operand& op); |
+ // As for emit_optional_rex_32(Register, Register), except that |
+ // the registers are XMM registers. |
+ inline void emit_optional_rex_32(XMMRegister reg, XMMRegister base); |
+ |
+ // As for emit_optional_rex_32(Register, Register), except that |
+ // the registers are XMM registers. |
+ inline void emit_optional_rex_32(XMMRegister reg, Register base); |
+ |
+ // As for emit_optional_rex_32(Register, const Operand&), except that |
+ // the register is an XMM register. |
+ inline void emit_optional_rex_32(XMMRegister reg, const Operand& op); |
+ |
// Optionally do as emit_rex_32(Register) if the register number has |
// the high bit set. |
inline void emit_optional_rex_32(Register rm_reg); |