USAT16 Unsigned Saturate 16 Unsigned Saturate 16 saturates two signed 16-bit values to a selected unsigned range. This instruction sets PSTATE.Q to 1 if the operation saturates. For more information about the constrained unpredictable behavior of this instruction, see Architectural Constraints on UNPREDICTABLE behaviors. It has encodings from the following instruction sets: A32 ( A1 ) and T32 ( T1 ) . != 1111 0 1 1 0 1 1 1 0 (1) (1) (1) (1) 0 0 1 1 USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm); if d == 15 || n == 15 then UNPREDICTABLE; 1 1 1 1 0 (0) 1 1 1 0 1 0 0 0 0 0 0 0 (0) (0) USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm); if d == 15 || n == 15 then UNPREDICTABLE; // Armv8-A removes UNPREDICTABLE for R13 <c> See Standard assembler syntax fields. <q> See Standard assembler syntax fields. <Rd> Is the general-purpose destination register, encoded in the "Rd" field. <imm> Is the bit position for saturation, in the range 0 to 15, encoded in the "sat_imm" field. <Rn> Is the general-purpose source register, encoded in the "Rn" field. if ConditionPassed() then EncodingSpecificOperations(); (result1, sat1) = UnsignedSatQ(SInt(R[n]<15:0>), saturate_to); (result2, sat2) = UnsignedSatQ(SInt(R[n]<31:16>), saturate_to); R[d]<15:0> = ZeroExtend(result1, 16); R[d]<31:16> = ZeroExtend(result2, 16); if sat1 || sat2 then PSTATE.Q = '1';