SSAT
Signed Saturate
Signed Saturate saturates an optionally-shifted signed value to a selectable signed 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
0
1
0
1
1
SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount>
0
SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount>}
d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1;
(shift_t, shift_n) = DecodeImmShift(sh:'0', imm5);
if d == 15 || n == 15 then UNPREDICTABLE;
1
1
1
1
0
(0)
1
1
0
0
0
0
(0)
1
Z
Z
Z
Z
Z
SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount>
0
SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount>}
if sh == '1' && (imm3:imm2) == '00000' then SEE "SSAT16";
d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1;
(shift_t, shift_n) = DecodeImmShift(sh:'0', imm3:imm2);
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 1 to 32, encoded in the "sat_imm" field as <imm>-1.
<Rn>
Is the general-purpose source register, encoded in the "Rn" field.
<amount>
For encoding A1: is the optional shift amount, in the range 0 to 31, defaulting to 0 and encoded in the "imm5" field.
<amount>
For encoding A1: is the shift amount, in the range 1 to 32 encoded in the "imm5" field as <amount> modulo 32.
<amount>
For encoding T1: is the optional shift amount, in the range 0 to 31, defaulting to 0 and encoded in the "imm3:imm2" field.
<amount>
For encoding T1: is the shift amount, in the range 1 to 31 encoded in the "imm3:imm2" field as <amount>.
if ConditionPassed() then
EncodingSpecificOperations();
operand = Shift(R[n], shift_t, shift_n, PSTATE.C); // PSTATE.C ignored
(result, sat) = SignedSatQ(SInt(operand), saturate_to);
R[d] = SignExtend(result, 32);
if sat then
PSTATE.Q = '1';