[Docs] Documentation for the saturation addition and subtraction intrinsics

Differential Revision: https://reviews.llvm.org/D54729

llvm-svn: 347334
This commit is contained in:
Leonard Chan 2018-11-20 18:01:24 +00:00
parent 96152dcb1c
commit 9ede953abc
1 changed files with 200 additions and 0 deletions

View File

@ -12576,6 +12576,206 @@ Examples:
%obit = extractvalue {i32, i1} %res, 1
br i1 %obit, label %overflow, label %normal
Saturation Arithmetic Intrinsics
---------------------------------
Saturation arithmetic is a version of arithmetic in which operations are
limited to a fixed range between a minimum and maximum value. If the result of
an operation is greater than the maximum value, the result is set (or
"clamped") to this maximum. If it is below the minimum, it is clamped to this
minimum.
'``llvm.sadd.sat.*``' Intrinsics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax
"""""""
This is an overloaded intrinsic. You can use ``llvm.sadd.sat``
on any integer bit width or vectors of integers.
::
declare i16 @llvm.sadd.sat.i16(i16 %a, i16 %b)
declare i32 @llvm.sadd.sat.i32(i32 %a, i32 %b)
declare i64 @llvm.sadd.sat.i64(i64 %a, i64 %b)
declare <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %a, <4 x i32> %b)
Overview
"""""""""
The '``llvm.sadd.sat``' family of intrinsic functions perform signed
saturation addition on the 2 arguments.
Arguments
""""""""""
The arguments (%a and %b) and the result may be of integer types of any bit
width, but they must have the same bit width. ``%a`` and ``%b`` are the two
values that will undergo signed addition.
Semantics:
""""""""""
The maximum value this operation can clamp to is the largest signed value
representable by the bit width of the arguments. The minimum value is the
smallest signed value representable by this bit width.
Examples
"""""""""
.. code-block:: llvm
%res = call i4 @llvm.sadd.sat.i4(i4 1, i4 2) ; %res = 3
%res = call i4 @llvm.sadd.sat.i4(i4 5, i4 6) ; %res = 7
%res = call i4 @llvm.sadd.sat.i4(i4 -4, i4 2) ; %res = -2
%res = call i4 @llvm.sadd.sat.i4(i4 -4, i4 -5) ; %res = -8
'``llvm.uadd.sat.*``' Intrinsics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax
"""""""
This is an overloaded intrinsic. You can use ``llvm.uadd.sat``
on any integer bit width or vectors of integers.
::
declare i16 @llvm.uadd.sat.i16(i16 %a, i16 %b)
declare i32 @llvm.uadd.sat.i32(i32 %a, i32 %b)
declare i64 @llvm.uadd.sat.i64(i64 %a, i64 %b)
declare <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %a, <4 x i32> %b)
Overview
"""""""""
The '``llvm.uadd.sat``' family of intrinsic functions perform unsigned
saturation addition on the 2 arguments.
Arguments
""""""""""
The arguments (%a and %b) and the result may be of integer types of any bit
width, but they must have the same bit width. ``%a`` and ``%b`` are the two
values that will undergo unsigned addition.
Semantics:
""""""""""
The maximum value this operation can clamp to is the largest unsigned value
representable by the bit width of the arguments. Because this is an unsigned
operation, the result will never saturate towards zero.
Examples
"""""""""
.. code-block:: llvm
%res = call i4 @llvm.uadd.sat.i4(i4 1, i4 2) ; %res = 3
%res = call i4 @llvm.uadd.sat.i4(i4 5, i4 6) ; %res = 11
%res = call i4 @llvm.uadd.sat.i4(i4 8, i4 8) ; %res = 15
'``llvm.ssub.sat.*``' Intrinsics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax
"""""""
This is an overloaded intrinsic. You can use ``llvm.ssub.sat``
on any integer bit width or vectors of integers.
::
declare i16 @llvm.ssub.sat.i16(i16 %a, i16 %b)
declare i32 @llvm.ssub.sat.i32(i32 %a, i32 %b)
declare i64 @llvm.ssub.sat.i64(i64 %a, i64 %b)
declare <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %a, <4 x i32> %b)
Overview
"""""""""
The '``llvm.ssub.sat``' family of intrinsic functions perform signed
saturation subtraction on the 2 arguments.
Arguments
""""""""""
The arguments (%a and %b) and the result may be of integer types of any bit
width, but they must have the same bit width. ``%a`` and ``%b`` are the two
values that will undergo signed subtraction.
Semantics:
""""""""""
The maximum value this operation can clamp to is the largest signed value
representable by the bit width of the arguments. The minimum value is the
smallest signed value representable by this bit width.
Examples
"""""""""
.. code-block:: llvm
%res = call i4 @llvm.ssub.sat.i4(i4 2, i4 1) ; %res = 1
%res = call i4 @llvm.ssub.sat.i4(i4 2, i4 6) ; %res = -4
%res = call i4 @llvm.ssub.sat.i4(i4 -4, i4 5) ; %res = -8
%res = call i4 @llvm.ssub.sat.i4(i4 4, i4 -5) ; %res = 7
'``llvm.usub.sat.*``' Intrinsics
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Syntax
"""""""
This is an overloaded intrinsic. You can use ``llvm.usub.sat``
on any integer bit width or vectors of integers.
::
declare i16 @llvm.usub.sat.i16(i16 %a, i16 %b)
declare i32 @llvm.usub.sat.i32(i32 %a, i32 %b)
declare i64 @llvm.usub.sat.i64(i64 %a, i64 %b)
declare <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %a, <4 x i32> %b)
Overview
"""""""""
The '``llvm.usub.sat``' family of intrinsic functions perform unsigned
saturation subtraction on the 2 arguments.
Arguments
""""""""""
The arguments (%a and %b) and the result may be of integer types of any bit
width, but they must have the same bit width. ``%a`` and ``%b`` are the two
values that will undergo unsigned subtraction.
Semantics:
""""""""""
The minimum value this operation can clamp to is 0, which is the smallest
unsigned value representable by the bit width of the unsigned arguments.
Because this is an unsigned operation, the result will never saturate towards
the largest possible value representable by this bit width.
Examples
"""""""""
.. code-block:: llvm
%res = call i4 @llvm.usub.sat.i4(i4 2, i4 1) ; %res = 1
%res = call i4 @llvm.usub.sat.i4(i4 2, i4 6) ; %res = 0
Specialised Arithmetic Intrinsics
---------------------------------