Index: src/compiler/x64/code-generator-x64.cc |
diff --git a/src/compiler/x64/code-generator-x64.cc b/src/compiler/x64/code-generator-x64.cc |
index 538c99939aeaaf72462b862a388a3ecc7b125292..83053d09f1ba97aabeed256735ff08055134643c 100644 |
--- a/src/compiler/x64/code-generator-x64.cc |
+++ b/src/compiler/x64/code-generator-x64.cc |
@@ -2188,6 +2188,19 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} |
break; |
} |
+ case kX64I32x4Neg: { |
+ CpuFeatureScope sse_scope(masm(), SSSE3); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(0); |
+ if (dst.is(src)) { |
+ __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
+ __ psignd(dst, kScratchDoubleReg); |
+ } else { |
+ __ pxor(dst, dst); |
+ __ psubd(dst, src); |
+ } |
+ break; |
+ } |
case kX64I32x4Shl: { |
__ pslld(i.OutputSimd128Register(), i.InputInt8(1)); |
break; |
@@ -2234,6 +2247,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ pxor(i.OutputSimd128Register(), kScratchDoubleReg); |
break; |
} |
+ case kX64I32x4GtS: { |
+ __ pcmpgtd(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
+ break; |
+ } |
+ case kX64I32x4GeS: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pminsd(dst, src); |
+ __ pcmpeqd(dst, src); |
+ break; |
+ } |
case kX64I32x4ShrU: { |
__ psrld(i.OutputSimd128Register(), i.InputInt8(1)); |
break; |
@@ -2248,6 +2273,24 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ pmaxud(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
break; |
} |
+ case kX64I32x4GtU: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pmaxud(dst, src); |
+ __ pcmpeqd(dst, src); |
+ __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
+ __ pxor(dst, kScratchDoubleReg); |
+ break; |
+ } |
+ case kX64I32x4GeU: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pminud(dst, src); |
+ __ pcmpeqd(dst, src); |
+ break; |
+ } |
case kX64S128Zero: { |
XMMRegister dst = i.OutputSimd128Register(); |
__ xorps(dst, dst); |
@@ -2278,6 +2321,19 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} |
break; |
} |
+ case kX64I16x8Neg: { |
+ CpuFeatureScope sse_scope(masm(), SSSE3); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(0); |
+ if (dst.is(src)) { |
+ __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
+ __ psignw(dst, kScratchDoubleReg); |
+ } else { |
+ __ pxor(dst, dst); |
+ __ psubw(dst, src); |
+ } |
+ break; |
+ } |
case kX64I16x8Shl: { |
__ psllw(i.OutputSimd128Register(), i.InputInt8(1)); |
break; |
@@ -2332,6 +2388,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ pxor(i.OutputSimd128Register(), kScratchDoubleReg); |
break; |
} |
+ case kX64I16x8GtS: { |
+ __ pcmpgtw(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
+ break; |
+ } |
+ case kX64I16x8GeS: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pminsw(dst, src); |
+ __ pcmpeqw(dst, src); |
+ break; |
+ } |
case kX64I16x8ShrU: { |
__ psrlw(i.OutputSimd128Register(), i.InputInt8(1)); |
break; |
@@ -2354,6 +2422,24 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ pmaxuw(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
break; |
} |
+ case kX64I16x8GtU: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pmaxuw(dst, src); |
+ __ pcmpeqw(dst, src); |
+ __ pcmpeqw(kScratchDoubleReg, kScratchDoubleReg); |
+ __ pxor(dst, kScratchDoubleReg); |
+ break; |
+ } |
+ case kX64I16x8GeU: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pminuw(dst, src); |
+ __ pcmpeqw(dst, src); |
+ break; |
+ } |
case kX64I8x16Splat: { |
CpuFeatureScope sse_scope(masm(), SSSE3); |
XMMRegister dst = i.OutputSimd128Register(); |
@@ -2379,6 +2465,19 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} |
break; |
} |
+ case kX64I8x16Neg: { |
+ CpuFeatureScope sse_scope(masm(), SSSE3); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(0); |
+ if (dst.is(src)) { |
+ __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); |
+ __ psignb(dst, kScratchDoubleReg); |
+ } else { |
+ __ pxor(dst, dst); |
+ __ psubb(dst, src); |
+ } |
+ break; |
+ } |
case kX64I8x16Add: { |
__ paddb(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
break; |
@@ -2415,6 +2514,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ pxor(i.OutputSimd128Register(), kScratchDoubleReg); |
break; |
} |
+ case kX64I8x16GtS: { |
+ __ pcmpgtb(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
+ break; |
+ } |
+ case kX64I8x16GeS: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pminsb(dst, src); |
+ __ pcmpeqb(dst, src); |
+ break; |
+ } |
case kX64I8x16AddSaturateU: { |
__ paddusb(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
break; |
@@ -2433,6 +2544,24 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
__ pmaxub(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
break; |
} |
+ case kX64I8x16GtU: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pmaxub(dst, src); |
+ __ pcmpeqb(dst, src); |
+ __ pcmpeqb(kScratchDoubleReg, kScratchDoubleReg); |
+ __ pxor(dst, kScratchDoubleReg); |
+ break; |
+ } |
+ case kX64I8x16GeU: { |
+ CpuFeatureScope sse_scope(masm(), SSE4_1); |
+ XMMRegister dst = i.OutputSimd128Register(); |
+ XMMRegister src = i.InputSimd128Register(1); |
+ __ pminub(dst, src); |
+ __ pcmpeqb(dst, src); |
+ break; |
+ } |
case kX64S128And: { |
__ pand(i.OutputSimd128Register(), i.InputSimd128Register(1)); |
break; |
@@ -2447,8 +2576,16 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( |
} |
case kX64S128Not: { |
XMMRegister dst = i.OutputSimd128Register(); |
- __ pcmpeqd(dst, dst); |
- __ pxor(dst, i.InputSimd128Register(1)); |
+ XMMRegister src = i.InputSimd128Register(0); |
+ if (dst.is(src)) { |
+ __ movaps(kScratchDoubleReg, dst); |
+ __ pcmpeqd(dst, dst); |
+ __ pxor(dst, kScratchDoubleReg); |
+ } else { |
+ __ pcmpeqd(dst, dst); |
+ __ pxor(dst, src); |
+ } |
+ |
break; |
} |
case kX64S128Select: { |