SSAT16
Signed Saturate 16
Signed Saturate 16 saturates two signed 16-bit values to a selected 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)
(1)
(1)
0
0
1
1
SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn>
d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1;
if d == 15 || n == 15 then UNPREDICTABLE;
1
1
1
1
0
(0)
1
1
0
0
1
0
0
0
0
0
0
0
(0)
(0)
SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn>
d = UInt(Rd); n = UInt(Rn); saturate_to = UInt(sat_imm)+1;
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 16, encoded in the "sat_imm" field as <imm>-1.
<Rn>
Is the general-purpose source register, encoded in the "Rn" field.
if ConditionPassed() then
EncodingSpecificOperations();
(result1, sat1) = SignedSatQ(SInt(R[n]<15:0>), saturate_to);
(result2, sat2) = SignedSatQ(SInt(R[n]<31:16>), saturate_to);
R[d]<15:0> = SignExtend(result1, 16);
R[d]<31:16> = SignExtend(result2, 16);
if sat1 || sat2 then
PSTATE.Q = '1';