| Index: src/x64/assembler-x64.cc
|
| diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc
|
| index 49bd78d1ffc9e52dde1dba42ef36f0cbe6734646..ff00bd47791f7b383da8b2cacd101589e55d80ca 100644
|
| --- a/src/x64/assembler-x64.cc
|
| +++ b/src/x64/assembler-x64.cc
|
| @@ -2728,6 +2728,45 @@ void Assembler::extractps(Register dst, XMMRegister src, byte imm8) {
|
| }
|
|
|
|
|
| +void Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) {
|
| + ASSERT(is_uint8(imm8));
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(src, dst);
|
| + emit(0x0F);
|
| + emit(0xC6);
|
| + emit_sse_operand(dst, src);
|
| + emit(imm8);
|
| +}
|
| +
|
| +
|
| +void Assembler::insertps(XMMRegister dst, XMMRegister src, byte imm8) {
|
| + ASSERT(CpuFeatures::IsSupported(SSE4_1));
|
| + ASSERT(is_uint8(imm8));
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x3A);
|
| + emit(0x21);
|
| + emit_sse_operand(dst, src);
|
| + emit(imm8);
|
| +}
|
| +
|
| +
|
| +void Assembler::pinsrd(XMMRegister dst, Register src, byte imm8) {
|
| + ASSERT(CpuFeatures::IsSupported(SSE4_1));
|
| + ASSERT(is_uint8(imm8));
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x3A);
|
| + emit(0x22);
|
| + emit_sse_operand(dst, src);
|
| + emit(imm8);
|
| +}
|
| +
|
| +
|
| void Assembler::movsd(const Operand& dst, XMMRegister src) {
|
| EnsureSpace ensure_space(this);
|
| emit(0xF2); // double
|
| @@ -2775,16 +2814,6 @@ void Assembler::movaps(XMMRegister dst, XMMRegister src) {
|
| }
|
|
|
|
|
| -void Assembler::shufps(XMMRegister dst, XMMRegister src, byte imm8) {
|
| - ASSERT(is_uint8(imm8));
|
| - EnsureSpace ensure_space(this);
|
| - emit_optional_rex_32(src, dst);
|
| - emit(0x0F);
|
| - emit(0xC6);
|
| - emit_sse_operand(dst, src);
|
| - emit(imm8);
|
| -}
|
| -
|
|
|
| void Assembler::movapd(XMMRegister dst, XMMRegister src) {
|
| EnsureSpace ensure_space(this);
|
| @@ -3096,6 +3125,46 @@ void Assembler::cmpltsd(XMMRegister dst, XMMRegister src) {
|
| }
|
|
|
|
|
| +void Assembler::cmpps(XMMRegister dst, XMMRegister src, int8_t cmp) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xC2);
|
| + emit_sse_operand(dst, src);
|
| + emit(cmp);
|
| +}
|
| +
|
| +
|
| +void Assembler::cmpeqps(XMMRegister dst, XMMRegister src) {
|
| + cmpps(dst, src, 0x0);
|
| +}
|
| +
|
| +
|
| +void Assembler::cmpltps(XMMRegister dst, XMMRegister src) {
|
| + cmpps(dst, src, 0x1);
|
| +}
|
| +
|
| +
|
| +void Assembler::cmpleps(XMMRegister dst, XMMRegister src) {
|
| + cmpps(dst, src, 0x2);
|
| +}
|
| +
|
| +
|
| +void Assembler::cmpneqps(XMMRegister dst, XMMRegister src) {
|
| + cmpps(dst, src, 0x4);
|
| +}
|
| +
|
| +
|
| +void Assembler::cmpnltps(XMMRegister dst, XMMRegister src) {
|
| + cmpps(dst, src, 0x5);
|
| +}
|
| +
|
| +
|
| +void Assembler::cmpnleps(XMMRegister dst, XMMRegister src) {
|
| + cmpps(dst, src, 0x6);
|
| +}
|
| +
|
| +
|
| void Assembler::roundsd(XMMRegister dst, XMMRegister src,
|
| Assembler::RoundingMode mode) {
|
| ASSERT(IsEnabled(SSE4_1));
|
| @@ -3130,6 +3199,293 @@ void Assembler::movmskps(Register dst, XMMRegister src) {
|
| }
|
|
|
|
|
| +void Assembler::minps(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5D);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::minps(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5D);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::maxps(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5F);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::maxps(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5F);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::rcpps(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x53);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::rcpps(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x53);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::rsqrtps(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x52);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::rsqrtps(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x52);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::sqrtps(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x51);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::sqrtps(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x51);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::cvtdq2ps(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5B);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::cvtdq2ps(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5B);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::movups(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + if (src.low_bits() == 4) {
|
| + // Try to avoid an unnecessary SIB byte.
|
| + emit_optional_rex_32(src, dst);
|
| + emit(0x0F);
|
| + emit(0x11);
|
| + emit_sse_operand(src, dst);
|
| + } else {
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x10);
|
| + emit_sse_operand(dst, src);
|
| + }
|
| +}
|
| +
|
| +
|
| +void Assembler::movups(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x10);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::movups(const Operand& dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit_optional_rex_32(src, dst);
|
| + emit(0x0F);
|
| + emit(0x11);
|
| + emit_sse_operand(src, dst);
|
| +}
|
| +
|
| +
|
| +void Assembler::paddd(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xFE);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::paddd(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xFE);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::psubd(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xFA);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::psubd(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xFA);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::pmulld(XMMRegister dst, XMMRegister src) {
|
| + ASSERT(IsEnabled(SSE4_1));
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x38);
|
| + emit(0x40);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::pmulld(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xF4);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::pmuludq(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xF4);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::pmuludq(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0xF4);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::punpackldq(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x62);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::punpackldq(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x62);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::psrldq(XMMRegister dst, uint8_t shift) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst);
|
| + emit(0x0F);
|
| + emit(0x73);
|
| + emit_sse_operand(dst);
|
| + emit(shift);
|
| +}
|
| +
|
| +
|
| +void Assembler::cvtps2dq(XMMRegister dst, XMMRegister src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5B);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::cvtps2dq(XMMRegister dst, const Operand& src) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x5B);
|
| + emit_sse_operand(dst, src);
|
| +}
|
| +
|
| +
|
| +void Assembler::pshufd(XMMRegister dst, XMMRegister src, uint8_t shuffle) {
|
| + EnsureSpace ensure_space(this);
|
| + emit(0x66);
|
| + emit_optional_rex_32(dst, src);
|
| + emit(0x0F);
|
| + emit(0x70);
|
| + emit_sse_operand(dst, src);
|
| + emit(shuffle);
|
| +}
|
| +
|
| +
|
| void Assembler::emit_sse_operand(XMMRegister reg, const Operand& adr) {
|
| Register ireg = { reg.code() };
|
| emit_operand(ireg, adr);
|
| @@ -3151,6 +3507,11 @@ void Assembler::emit_sse_operand(Register dst, XMMRegister src) {
|
| }
|
|
|
|
|
| +void Assembler::emit_sse_operand(XMMRegister dst) {
|
| + emit(0xD8 | dst.low_bits());
|
| +}
|
| +
|
| +
|
| void Assembler::db(uint8_t data) {
|
| EnsureSpace ensure_space(this);
|
| emit(data);
|
|
|