Support saturating vector add and subtract on ARM32. Bug b/37495545 Change-Id: I1d025f894bb7cf08dcaafd950605781633596ab3 Reviewed-on: https://chromium-review.googlesource.com/689098 Reviewed-by: Jim Stichnoth <stichnot@chromium.org> Reviewed-on: https://swiftshader-review.googlesource.com/12748 Reviewed-by: Nicolas Capens <nicolascapens@google.com> Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/third_party/subzero/src/IceTargetLoweringARM32.cpp b/third_party/subzero/src/IceTargetLoweringARM32.cpp index ace8023..65dca3a 100644 --- a/third_party/subzero/src/IceTargetLoweringARM32.cpp +++ b/third_party/subzero/src/IceTargetLoweringARM32.cpp
@@ -5320,12 +5320,14 @@ case Intrinsics::Trap: _trap(); return; - case Intrinsics::AddSaturateSigned: { - UnimplementedLoweringError(this, Instr); - return; - } + case Intrinsics::AddSaturateSigned: case Intrinsics::AddSaturateUnsigned: { - UnimplementedLoweringError(this, Instr); + bool Unsigned = (ID == Intrinsics::AddSaturateUnsigned); + Variable *Src0 = legalizeToReg(Instr->getArg(0)); + Variable *Src1 = legalizeToReg(Instr->getArg(1)); + Variable *T = makeReg(DestTy); + _vqadd(T, Src0, Src1, Unsigned); + _mov(Dest, T); return; } case Intrinsics::LoadSubVector: { @@ -5360,12 +5362,14 @@ UnimplementedLoweringError(this, Instr); return; } - case Intrinsics::SubtractSaturateSigned: { - UnimplementedLoweringError(this, Instr); - return; - } + case Intrinsics::SubtractSaturateSigned: case Intrinsics::SubtractSaturateUnsigned: { - UnimplementedLoweringError(this, Instr); + bool Unsigned = (ID == Intrinsics::SubtractSaturateUnsigned); + Variable *Src0 = legalizeToReg(Instr->getArg(0)); + Variable *Src1 = legalizeToReg(Instr->getArg(1)); + Variable *T = makeReg(DestTy); + _vqsub(T, Src0, Src1, Unsigned); + _mov(Dest, T); return; } case Intrinsics::VectorPackSigned: {