We are in the process of porting a major application from Arm32 to Arm64. Our algorithms make frequent use of the SSAT and USAT instructions. They are extremely useful, performing a left or right shift of any size then a signed or unsigned saturate to an arbitrary number of bits. This is extremely useful for image processing algorithms, because we can perform some math that generates a 32-bit integer result, then grab whatever bits we need out of that (saturated to the max/min of the bit depth of the output image) with a single instruction.
These instructions have inexplicably disappeared in Arm64 and the closest alternative we've found are SQSHRN / UQSHRN / SQSHLN / UQSHLN which perform a shift and saturate but are far more limited in the saturation they perform (USAT could saturate to any width, even 7 bits; the new instructions can only saturate to half the width of the input, e.g. 16 bits in case of a 32 bit input, which would require additional processing to achieve the needed result).
Can someone explain why these instructions were dropped, and what's the best way to efficiently port existing code that uses them?