s390: [wasm-simd] Implement simd saturate binary operations
Change-Id: I847d01568f07da0a73e364a25e3e33e3875f3518 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2061229 Reviewed-by: Junliang Yan <jyan@ca.ibm.com> Commit-Queue: Milad Farazmand <miladfar@ca.ibm.com> Cr-Commit-Position: refs/heads/master@{#66312}
This commit is contained in:
parent
0fe133cc3e
commit
b9e40f7c01
@ -3548,35 +3548,35 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
|||||||
__ op(i.OutputSimd128Register(), i.InputSimd128Register(0), Condition(0), \
|
__ op(i.OutputSimd128Register(), i.InputSimd128Register(0), Condition(0), \
|
||||||
Condition(0), Condition(mode));
|
Condition(0), Condition(mode));
|
||||||
case kS390_I32x4SConvertI16x8Low: {
|
case kS390_I32x4SConvertI16x8Low: {
|
||||||
VECTOR_UNPACK(vupl, 1);
|
VECTOR_UNPACK(vupl, 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kS390_I32x4SConvertI16x8High: {
|
case kS390_I32x4SConvertI16x8High: {
|
||||||
VECTOR_UNPACK(vuph, 1);
|
VECTOR_UNPACK(vuph, 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kS390_I32x4UConvertI16x8Low: {
|
case kS390_I32x4UConvertI16x8Low: {
|
||||||
VECTOR_UNPACK(vupll, 1);
|
VECTOR_UNPACK(vupll, 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kS390_I32x4UConvertI16x8High: {
|
case kS390_I32x4UConvertI16x8High: {
|
||||||
VECTOR_UNPACK(vuplh, 1);
|
VECTOR_UNPACK(vuplh, 1)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kS390_I16x8SConvertI8x16Low: {
|
case kS390_I16x8SConvertI8x16Low: {
|
||||||
VECTOR_UNPACK(vupl, 0);
|
VECTOR_UNPACK(vupl, 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kS390_I16x8SConvertI8x16High: {
|
case kS390_I16x8SConvertI8x16High: {
|
||||||
VECTOR_UNPACK(vuph, 0);
|
VECTOR_UNPACK(vuph, 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kS390_I16x8UConvertI8x16Low: {
|
case kS390_I16x8UConvertI8x16Low: {
|
||||||
VECTOR_UNPACK(vupll, 0);
|
VECTOR_UNPACK(vupll, 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kS390_I16x8UConvertI8x16High: {
|
case kS390_I16x8UConvertI8x16High: {
|
||||||
VECTOR_UNPACK(vuplh, 0);
|
VECTOR_UNPACK(vuplh, 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#undef VECTOR_UNPACK
|
#undef VECTOR_UNPACK
|
||||||
@ -3609,6 +3609,86 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#undef VECTOR_PACK_UNSIGNED
|
#undef VECTOR_PACK_UNSIGNED
|
||||||
|
#define BINOP_EXTRACT(op, extract_high, extract_low, mode) \
|
||||||
|
Simd128Register src1 = i.InputSimd128Register(0); \
|
||||||
|
Simd128Register src2 = i.InputSimd128Register(1); \
|
||||||
|
Simd128Register tempFPReg1 = i.ToSimd128Register(instr->TempAt(0)); \
|
||||||
|
Simd128Register tempFPReg2 = i.ToSimd128Register(instr->TempAt(1)); \
|
||||||
|
__ extract_high(kScratchDoubleReg, src1, Condition(0), Condition(0), \
|
||||||
|
Condition(mode)); \
|
||||||
|
__ extract_high(tempFPReg1, src2, Condition(0), Condition(0), \
|
||||||
|
Condition(mode)); \
|
||||||
|
__ op(kScratchDoubleReg, kScratchDoubleReg, tempFPReg1, Condition(0), \
|
||||||
|
Condition(0), Condition(mode + 1)); \
|
||||||
|
__ extract_low(tempFPReg1, src1, Condition(0), Condition(0), \
|
||||||
|
Condition(mode)); \
|
||||||
|
__ extract_low(tempFPReg2, src2, Condition(0), Condition(0), \
|
||||||
|
Condition(mode)); \
|
||||||
|
__ op(tempFPReg1, tempFPReg1, tempFPReg2, Condition(0), Condition(0), \
|
||||||
|
Condition(mode + 1));
|
||||||
|
case kS390_I16x8AddSaturateS: {
|
||||||
|
BINOP_EXTRACT(va, vuph, vupl, 1)
|
||||||
|
__ vpks(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kS390_I16x8SubSaturateS: {
|
||||||
|
BINOP_EXTRACT(vs, vuph, vupl, 1)
|
||||||
|
__ vpks(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kS390_I16x8AddSaturateU: {
|
||||||
|
BINOP_EXTRACT(va, vuplh, vupll, 1)
|
||||||
|
__ vpkls(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kS390_I16x8SubSaturateU: {
|
||||||
|
BINOP_EXTRACT(vs, vuplh, vupll, 1)
|
||||||
|
// negative to 0
|
||||||
|
__ vx(tempFPReg2, tempFPReg2, tempFPReg2, Condition(0), Condition(0),
|
||||||
|
Condition(0));
|
||||||
|
__ vmx(kScratchDoubleReg, tempFPReg2, kScratchDoubleReg, Condition(0),
|
||||||
|
Condition(0), Condition(2));
|
||||||
|
__ vmx(tempFPReg1, tempFPReg2, tempFPReg1, Condition(0), Condition(0),
|
||||||
|
Condition(2));
|
||||||
|
__ vpkls(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(2));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kS390_I8x16AddSaturateS: {
|
||||||
|
BINOP_EXTRACT(va, vuph, vupl, 0)
|
||||||
|
__ vpks(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kS390_I8x16SubSaturateS: {
|
||||||
|
BINOP_EXTRACT(vs, vuph, vupl, 0)
|
||||||
|
__ vpks(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kS390_I8x16AddSaturateU: {
|
||||||
|
BINOP_EXTRACT(va, vuplh, vupll, 0)
|
||||||
|
__ vpkls(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case kS390_I8x16SubSaturateU: {
|
||||||
|
BINOP_EXTRACT(vs, vuplh, vupll, 0)
|
||||||
|
// negative to 0
|
||||||
|
__ vx(tempFPReg2, tempFPReg2, tempFPReg2, Condition(0), Condition(0),
|
||||||
|
Condition(0));
|
||||||
|
__ vmx(kScratchDoubleReg, tempFPReg2, kScratchDoubleReg, Condition(0),
|
||||||
|
Condition(0), Condition(1));
|
||||||
|
__ vmx(tempFPReg1, tempFPReg2, tempFPReg1, Condition(0), Condition(0),
|
||||||
|
Condition(1));
|
||||||
|
__ vpkls(i.OutputSimd128Register(), kScratchDoubleReg, tempFPReg1,
|
||||||
|
Condition(0), Condition(1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#undef BINOP_EXTRACT
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
}
|
}
|
||||||
|
@ -232,7 +232,6 @@ namespace compiler {
|
|||||||
V(S390_I32x4GtU) \
|
V(S390_I32x4GtU) \
|
||||||
V(S390_I32x4GeU) \
|
V(S390_I32x4GeU) \
|
||||||
V(S390_I32x4Neg) \
|
V(S390_I32x4Neg) \
|
||||||
V(S390_I16x8Splat) \
|
|
||||||
V(S390_I32x4Shl) \
|
V(S390_I32x4Shl) \
|
||||||
V(S390_I32x4ShrS) \
|
V(S390_I32x4ShrS) \
|
||||||
V(S390_I32x4ShrU) \
|
V(S390_I32x4ShrU) \
|
||||||
@ -242,6 +241,7 @@ namespace compiler {
|
|||||||
V(S390_I32x4SConvertI16x8High) \
|
V(S390_I32x4SConvertI16x8High) \
|
||||||
V(S390_I32x4UConvertI16x8Low) \
|
V(S390_I32x4UConvertI16x8Low) \
|
||||||
V(S390_I32x4UConvertI16x8High) \
|
V(S390_I32x4UConvertI16x8High) \
|
||||||
|
V(S390_I16x8Splat) \
|
||||||
V(S390_I16x8ExtractLaneU) \
|
V(S390_I16x8ExtractLaneU) \
|
||||||
V(S390_I16x8ExtractLaneS) \
|
V(S390_I16x8ExtractLaneS) \
|
||||||
V(S390_I16x8ReplaceLane) \
|
V(S390_I16x8ReplaceLane) \
|
||||||
@ -269,6 +269,10 @@ namespace compiler {
|
|||||||
V(S390_I16x8SConvertI8x16High) \
|
V(S390_I16x8SConvertI8x16High) \
|
||||||
V(S390_I16x8UConvertI8x16Low) \
|
V(S390_I16x8UConvertI8x16Low) \
|
||||||
V(S390_I16x8UConvertI8x16High) \
|
V(S390_I16x8UConvertI8x16High) \
|
||||||
|
V(S390_I16x8AddSaturateS) \
|
||||||
|
V(S390_I16x8SubSaturateS) \
|
||||||
|
V(S390_I16x8AddSaturateU) \
|
||||||
|
V(S390_I16x8SubSaturateU) \
|
||||||
V(S390_I8x16Splat) \
|
V(S390_I8x16Splat) \
|
||||||
V(S390_I8x16ExtractLaneU) \
|
V(S390_I8x16ExtractLaneU) \
|
||||||
V(S390_I8x16ExtractLaneS) \
|
V(S390_I8x16ExtractLaneS) \
|
||||||
@ -292,6 +296,10 @@ namespace compiler {
|
|||||||
V(S390_I8x16Neg) \
|
V(S390_I8x16Neg) \
|
||||||
V(S390_I8x16SConvertI16x8) \
|
V(S390_I8x16SConvertI16x8) \
|
||||||
V(S390_I8x16UConvertI16x8) \
|
V(S390_I8x16UConvertI16x8) \
|
||||||
|
V(S390_I8x16AddSaturateS) \
|
||||||
|
V(S390_I8x16SubSaturateS) \
|
||||||
|
V(S390_I8x16AddSaturateU) \
|
||||||
|
V(S390_I8x16SubSaturateU) \
|
||||||
V(S390_S1x4AnyTrue) \
|
V(S390_S1x4AnyTrue) \
|
||||||
V(S390_S1x8AnyTrue) \
|
V(S390_S1x8AnyTrue) \
|
||||||
V(S390_S1x16AnyTrue) \
|
V(S390_S1x16AnyTrue) \
|
||||||
|
@ -215,6 +215,10 @@ int InstructionScheduler::GetTargetInstructionFlags(
|
|||||||
case kS390_I16x8SConvertI8x16High:
|
case kS390_I16x8SConvertI8x16High:
|
||||||
case kS390_I16x8UConvertI8x16Low:
|
case kS390_I16x8UConvertI8x16Low:
|
||||||
case kS390_I16x8UConvertI8x16High:
|
case kS390_I16x8UConvertI8x16High:
|
||||||
|
case kS390_I16x8AddSaturateS:
|
||||||
|
case kS390_I16x8SubSaturateS:
|
||||||
|
case kS390_I16x8AddSaturateU:
|
||||||
|
case kS390_I16x8SubSaturateU:
|
||||||
case kS390_I8x16Splat:
|
case kS390_I8x16Splat:
|
||||||
case kS390_I8x16ExtractLaneU:
|
case kS390_I8x16ExtractLaneU:
|
||||||
case kS390_I8x16ExtractLaneS:
|
case kS390_I8x16ExtractLaneS:
|
||||||
@ -238,6 +242,10 @@ int InstructionScheduler::GetTargetInstructionFlags(
|
|||||||
case kS390_I8x16Neg:
|
case kS390_I8x16Neg:
|
||||||
case kS390_I8x16SConvertI16x8:
|
case kS390_I8x16SConvertI16x8:
|
||||||
case kS390_I8x16UConvertI16x8:
|
case kS390_I8x16UConvertI16x8:
|
||||||
|
case kS390_I8x16AddSaturateS:
|
||||||
|
case kS390_I8x16SubSaturateS:
|
||||||
|
case kS390_I8x16AddSaturateU:
|
||||||
|
case kS390_I8x16SubSaturateU:
|
||||||
case kS390_S1x4AnyTrue:
|
case kS390_S1x4AnyTrue:
|
||||||
case kS390_S1x8AnyTrue:
|
case kS390_S1x8AnyTrue:
|
||||||
case kS390_S1x16AnyTrue:
|
case kS390_S1x16AnyTrue:
|
||||||
|
@ -2556,6 +2556,10 @@ void InstructionSelector::VisitWord64AtomicStore(Node* node) {
|
|||||||
V(I16x8GeU) \
|
V(I16x8GeU) \
|
||||||
V(I16x8SConvertI32x4) \
|
V(I16x8SConvertI32x4) \
|
||||||
V(I16x8UConvertI32x4) \
|
V(I16x8UConvertI32x4) \
|
||||||
|
V(I16x8AddSaturateS) \
|
||||||
|
V(I16x8SubSaturateS) \
|
||||||
|
V(I16x8AddSaturateU) \
|
||||||
|
V(I16x8SubSaturateU) \
|
||||||
V(I8x16Add) \
|
V(I8x16Add) \
|
||||||
V(I8x16Sub) \
|
V(I8x16Sub) \
|
||||||
V(I8x16Mul) \
|
V(I8x16Mul) \
|
||||||
@ -2571,6 +2575,10 @@ void InstructionSelector::VisitWord64AtomicStore(Node* node) {
|
|||||||
V(I8x16GeU) \
|
V(I8x16GeU) \
|
||||||
V(I8x16SConvertI16x8) \
|
V(I8x16SConvertI16x8) \
|
||||||
V(I8x16UConvertI16x8) \
|
V(I8x16UConvertI16x8) \
|
||||||
|
V(I8x16AddSaturateS) \
|
||||||
|
V(I8x16SubSaturateS) \
|
||||||
|
V(I8x16AddSaturateU) \
|
||||||
|
V(I8x16SubSaturateU) \
|
||||||
V(S128And) \
|
V(S128And) \
|
||||||
V(S128Or) \
|
V(S128Or) \
|
||||||
V(S128Xor)
|
V(S128Xor)
|
||||||
@ -2722,22 +2730,6 @@ void InstructionSelector::VisitS128Select(Node* node) {
|
|||||||
g.UseRegister(node->InputAt(2)));
|
g.UseRegister(node->InputAt(2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructionSelector::VisitI16x8AddSaturateS(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitI16x8SubSaturateS(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitI16x8AddSaturateU(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitI16x8SubSaturateU(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitI16x8RoundingAverageU(Node* node) {
|
void InstructionSelector::VisitI16x8RoundingAverageU(Node* node) {
|
||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
}
|
}
|
||||||
@ -2746,22 +2738,6 @@ void InstructionSelector::VisitI8x16RoundingAverageU(Node* node) {
|
|||||||
UNIMPLEMENTED();
|
UNIMPLEMENTED();
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstructionSelector::VisitI8x16AddSaturateS(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitI8x16SubSaturateS(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitI8x16AddSaturateU(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitI8x16SubSaturateU(Node* node) {
|
|
||||||
UNIMPLEMENTED();
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstructionSelector::VisitS128AndNot(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitS128AndNot(Node* node) { UNIMPLEMENTED(); }
|
||||||
|
|
||||||
void InstructionSelector::EmitPrepareResults(
|
void InstructionSelector::EmitPrepareResults(
|
||||||
|
Loading…
Reference in New Issue
Block a user