[ia32][wasm] Add I16x8 ShiftOp and Binop.
Shl/ShrS/ShrU Add/AddSaturateS/Sub/SubSaturateS Bug: Change-Id: I9fbca45a22505ce1cea6b6ee2b57c07b71d31d50 Reviewed-on: https://chromium-review.googlesource.com/737513 Commit-Queue: Jing Bao <jing.bao@intel.com> Reviewed-by: Bill Budge <bbudge@chromium.org> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org> Cr-Commit-Position: refs/heads/master@{#49247}
This commit is contained in:
parent
a90cce27a1
commit
ff71747d4e
@ -2221,6 +2221,76 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
|||||||
i.InputOperand(2), i.InputInt8(1));
|
i.InputOperand(2), i.InputInt8(1));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case kSSEI16x8Shl: {
|
||||||
|
__ psllw(i.OutputSimd128Register(), i.InputInt8(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kAVXI16x8Shl: {
|
||||||
|
CpuFeatureScope avx_scope(tasm(), AVX);
|
||||||
|
__ vpsllw(i.OutputSimd128Register(), i.InputSimd128Register(0),
|
||||||
|
i.InputInt8(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kSSEI16x8ShrS: {
|
||||||
|
__ psraw(i.OutputSimd128Register(), i.InputInt8(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kAVXI16x8ShrS: {
|
||||||
|
CpuFeatureScope avx_scope(tasm(), AVX);
|
||||||
|
__ vpsraw(i.OutputSimd128Register(), i.InputSimd128Register(0),
|
||||||
|
i.InputInt8(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kSSEI16x8Add: {
|
||||||
|
__ paddw(i.OutputSimd128Register(), i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kAVXI16x8Add: {
|
||||||
|
CpuFeatureScope avx_scope(tasm(), AVX);
|
||||||
|
__ vpaddw(i.OutputSimd128Register(), i.InputSimd128Register(0),
|
||||||
|
i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kSSEI16x8AddSaturateS: {
|
||||||
|
__ paddsw(i.OutputSimd128Register(), i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kAVXI16x8AddSaturateS: {
|
||||||
|
CpuFeatureScope avx_scope(tasm(), AVX);
|
||||||
|
__ vpaddsw(i.OutputSimd128Register(), i.InputSimd128Register(0),
|
||||||
|
i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kSSEI16x8Sub: {
|
||||||
|
__ psubw(i.OutputSimd128Register(), i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kAVXI16x8Sub: {
|
||||||
|
CpuFeatureScope avx_scope(tasm(), AVX);
|
||||||
|
__ vpsubw(i.OutputSimd128Register(), i.InputSimd128Register(0),
|
||||||
|
i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kSSEI16x8SubSaturateS: {
|
||||||
|
__ psubsw(i.OutputSimd128Register(), i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kAVXI16x8SubSaturateS: {
|
||||||
|
CpuFeatureScope avx_scope(tasm(), AVX);
|
||||||
|
__ vpsubsw(i.OutputSimd128Register(), i.InputSimd128Register(0),
|
||||||
|
i.InputOperand(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kSSEI16x8ShrU: {
|
||||||
|
__ psrlw(i.OutputSimd128Register(), i.InputInt8(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kAVXI16x8ShrU: {
|
||||||
|
CpuFeatureScope avx_scope(tasm(), AVX);
|
||||||
|
__ vpsrlw(i.OutputSimd128Register(), i.InputSimd128Register(0),
|
||||||
|
i.InputInt8(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
case kIA32I8x16Splat: {
|
case kIA32I8x16Splat: {
|
||||||
XMMRegister dst = i.OutputSimd128Register();
|
XMMRegister dst = i.OutputSimd128Register();
|
||||||
__ Movd(dst, i.InputOperand(0));
|
__ Movd(dst, i.InputOperand(0));
|
||||||
|
@ -152,6 +152,20 @@ namespace compiler {
|
|||||||
V(IA32I16x8ExtractLane) \
|
V(IA32I16x8ExtractLane) \
|
||||||
V(SSEI16x8ReplaceLane) \
|
V(SSEI16x8ReplaceLane) \
|
||||||
V(AVXI16x8ReplaceLane) \
|
V(AVXI16x8ReplaceLane) \
|
||||||
|
V(SSEI16x8Shl) \
|
||||||
|
V(AVXI16x8Shl) \
|
||||||
|
V(SSEI16x8ShrS) \
|
||||||
|
V(AVXI16x8ShrS) \
|
||||||
|
V(SSEI16x8Add) \
|
||||||
|
V(AVXI16x8Add) \
|
||||||
|
V(SSEI16x8AddSaturateS) \
|
||||||
|
V(AVXI16x8AddSaturateS) \
|
||||||
|
V(SSEI16x8Sub) \
|
||||||
|
V(AVXI16x8Sub) \
|
||||||
|
V(SSEI16x8SubSaturateS) \
|
||||||
|
V(AVXI16x8SubSaturateS) \
|
||||||
|
V(SSEI16x8ShrU) \
|
||||||
|
V(AVXI16x8ShrU) \
|
||||||
V(IA32I8x16Splat) \
|
V(IA32I8x16Splat) \
|
||||||
V(IA32I8x16ExtractLane) \
|
V(IA32I8x16ExtractLane) \
|
||||||
V(SSEI8x16ReplaceLane) \
|
V(SSEI8x16ReplaceLane) \
|
||||||
|
@ -138,6 +138,20 @@ int InstructionScheduler::GetTargetInstructionFlags(
|
|||||||
case kIA32I16x8ExtractLane:
|
case kIA32I16x8ExtractLane:
|
||||||
case kSSEI16x8ReplaceLane:
|
case kSSEI16x8ReplaceLane:
|
||||||
case kAVXI16x8ReplaceLane:
|
case kAVXI16x8ReplaceLane:
|
||||||
|
case kSSEI16x8Shl:
|
||||||
|
case kAVXI16x8Shl:
|
||||||
|
case kSSEI16x8ShrS:
|
||||||
|
case kAVXI16x8ShrS:
|
||||||
|
case kSSEI16x8Add:
|
||||||
|
case kAVXI16x8Add:
|
||||||
|
case kSSEI16x8AddSaturateS:
|
||||||
|
case kAVXI16x8AddSaturateS:
|
||||||
|
case kSSEI16x8Sub:
|
||||||
|
case kAVXI16x8Sub:
|
||||||
|
case kSSEI16x8SubSaturateS:
|
||||||
|
case kAVXI16x8SubSaturateS:
|
||||||
|
case kSSEI16x8ShrU:
|
||||||
|
case kAVXI16x8ShrU:
|
||||||
case kIA32I8x16Splat:
|
case kIA32I8x16Splat:
|
||||||
case kIA32I8x16ExtractLane:
|
case kIA32I8x16ExtractLane:
|
||||||
case kSSEI8x16ReplaceLane:
|
case kSSEI8x16ReplaceLane:
|
||||||
|
@ -1915,14 +1915,21 @@ VISIT_ATOMIC_BINOP(Xor)
|
|||||||
V(I32x4MinU) \
|
V(I32x4MinU) \
|
||||||
V(I32x4MaxU) \
|
V(I32x4MaxU) \
|
||||||
V(I32x4GtU) \
|
V(I32x4GtU) \
|
||||||
V(I32x4GeU)
|
V(I32x4GeU) \
|
||||||
|
V(I16x8Add) \
|
||||||
|
V(I16x8AddSaturateS) \
|
||||||
|
V(I16x8Sub) \
|
||||||
|
V(I16x8SubSaturateS)
|
||||||
|
|
||||||
#define SIMD_UNOP_LIST(V) V(I32x4Neg)
|
#define SIMD_UNOP_LIST(V) V(I32x4Neg)
|
||||||
|
|
||||||
#define SIMD_SHIFT_OPCODES(V) \
|
#define SIMD_SHIFT_OPCODES(V) \
|
||||||
V(I32x4Shl) \
|
V(I32x4Shl) \
|
||||||
V(I32x4ShrS) \
|
V(I32x4ShrS) \
|
||||||
V(I32x4ShrU)
|
V(I32x4ShrU) \
|
||||||
|
V(I16x8Shl) \
|
||||||
|
V(I16x8ShrS) \
|
||||||
|
V(I16x8ShrU)
|
||||||
|
|
||||||
#define VISIT_SIMD_SPLAT(Type) \
|
#define VISIT_SIMD_SPLAT(Type) \
|
||||||
void InstructionSelector::Visit##Type##Splat(Node* node) { \
|
void InstructionSelector::Visit##Type##Splat(Node* node) { \
|
||||||
|
@ -2224,12 +2224,7 @@ void InstructionSelector::VisitI16x8Splat(Node* node) { UNIMPLEMENTED(); }
|
|||||||
void InstructionSelector::VisitI16x8ExtractLane(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitI16x8ExtractLane(Node* node) { UNIMPLEMENTED(); }
|
||||||
|
|
||||||
void InstructionSelector::VisitI16x8ReplaceLane(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitI16x8ReplaceLane(Node* node) { UNIMPLEMENTED(); }
|
||||||
#endif // !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_X64
|
|
||||||
// && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_MIPS &&
|
|
||||||
// !V8_TARGET_ARCH_MIPS64
|
|
||||||
|
|
||||||
#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_X64 && \
|
|
||||||
!V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64
|
|
||||||
void InstructionSelector::VisitI16x8Shl(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitI16x8Shl(Node* node) { UNIMPLEMENTED(); }
|
||||||
|
|
||||||
void InstructionSelector::VisitI16x8ShrS(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitI16x8ShrS(Node* node) { UNIMPLEMENTED(); }
|
||||||
@ -2248,7 +2243,8 @@ void InstructionSelector::VisitI16x8SubSaturateS(Node* node) {
|
|||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
}
|
}
|
||||||
#endif // !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_X64
|
#endif // !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_X64
|
||||||
// && !V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64
|
// && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_MIPS &&
|
||||||
|
// !V8_TARGET_ARCH_MIPS64
|
||||||
|
|
||||||
#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_X64 && \
|
#if !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_X64 && \
|
||||||
!V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64
|
!V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64
|
||||||
|
@ -1166,8 +1166,6 @@ WASM_SIMD_COMPILED_TEST(I16x8ConvertI32x4) {
|
|||||||
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS ||
|
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_MIPS ||
|
||||||
// V8_TARGET_ARCH_MIPS64
|
// V8_TARGET_ARCH_MIPS64
|
||||||
|
|
||||||
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \
|
|
||||||
V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
|
|
||||||
void RunI16x8BinOpTest(WasmExecutionMode execution_mode, WasmOpcode simd_op,
|
void RunI16x8BinOpTest(WasmExecutionMode execution_mode, WasmOpcode simd_op,
|
||||||
Int16BinOp expected_op) {
|
Int16BinOp expected_op) {
|
||||||
WasmRunner<int32_t, int32_t, int32_t, int32_t> r(execution_mode);
|
WasmRunner<int32_t, int32_t, int32_t, int32_t> r(execution_mode);
|
||||||
@ -1203,6 +1201,8 @@ WASM_SIMD_TEST(I16x8SubSaturateS) {
|
|||||||
RunI16x8BinOpTest(execution_mode, kExprI16x8SubSaturateS, SubSaturate);
|
RunI16x8BinOpTest(execution_mode, kExprI16x8SubSaturateS, SubSaturate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \
|
||||||
|
V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
|
||||||
WASM_SIMD_TEST(I16x8Mul) {
|
WASM_SIMD_TEST(I16x8Mul) {
|
||||||
RunI16x8BinOpTest(execution_mode, kExprI16x8Mul, Mul);
|
RunI16x8BinOpTest(execution_mode, kExprI16x8Mul, Mul);
|
||||||
}
|
}
|
||||||
@ -1291,6 +1291,8 @@ WASM_SIMD_TEST(I16x8LtU) {
|
|||||||
WASM_SIMD_TEST(I16x8LeU) {
|
WASM_SIMD_TEST(I16x8LeU) {
|
||||||
RunI16x8CompareOpTest(execution_mode, kExprI16x8LeU, UnsignedLessEqual);
|
RunI16x8CompareOpTest(execution_mode, kExprI16x8LeU, UnsignedLessEqual);
|
||||||
}
|
}
|
||||||
|
#endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 ||
|
||||||
|
// V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
|
||||||
|
|
||||||
void RunI16x8ShiftOpTest(WasmExecutionMode execution_mode, WasmOpcode simd_op,
|
void RunI16x8ShiftOpTest(WasmExecutionMode execution_mode, WasmOpcode simd_op,
|
||||||
Int16ShiftOp expected_op, int shift) {
|
Int16ShiftOp expected_op, int shift) {
|
||||||
@ -1318,6 +1320,8 @@ WASM_SIMD_TEST(I16x8ShrU) {
|
|||||||
RunI16x8ShiftOpTest(execution_mode, kExprI16x8ShrU, LogicalShiftRight, 1);
|
RunI16x8ShiftOpTest(execution_mode, kExprI16x8ShrU, LogicalShiftRight, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_X64 || \
|
||||||
|
V8_TARGET_ARCH_MIPS || V8_TARGET_ARCH_MIPS64
|
||||||
void RunI8x16UnOpTest(WasmExecutionMode execution_mode, WasmOpcode simd_op,
|
void RunI8x16UnOpTest(WasmExecutionMode execution_mode, WasmOpcode simd_op,
|
||||||
Int8UnOp expected_op) {
|
Int8UnOp expected_op) {
|
||||||
WasmRunner<int32_t, int32_t, int32_t> r(execution_mode);
|
WasmRunner<int32_t, int32_t, int32_t> r(execution_mode);
|
||||||
|
Loading…
Reference in New Issue
Block a user