Hi all,

The patches linked below introduce a new family of intrinsics, for

integer saturation: @llvm.usat, and @llvm.ssat (unsigned/signed).

Quoting the added documentation:

%r = call i32 @llvm.ssat.i32(i32 %x, i32 %n)

is equivalent to the expression min(max(x, -2^(n-1)), 2^(n-1)-1), itself

implementable as the following IR:

%min_sint_n = i32 ... ; the min. signed integer of bitwidth n, -2^(n-1)

%max_sint_n = i32 ... ; the max. signed integer of bitwidth n, 2^(n-1)-1

%0 = icmp slt i32 %x, %min_sint_n

%1 = select i1 %0, i32 %min_sint_n, i32 %x

%2 = icmp sgt i32 %1, %max_sint_n

%r = select i1 %2, i32 %max_sint_n, i32 %1

As a starting point, here are two patches:

- http://reviews.llvm.org/D6976 Add Integer Saturation Intrinsics.

- http://reviews.llvm.org/D6977 [CodeGen] Add legalization for

Integer Saturation Intrinsics.

From there, we can generate several new instructions, more efficient

than their expanded counterpart. Locally, I have worked on:

- ARM: the SSAT/USAT instructions (scalar)

- AArch64: the SQ/UQ ADD/SUB AArch64 instructions (vector/scalar

saturating arithmetic)

- X86: PACK SS/US (vector, saturate+truncate)

- X86: PADD/SUB S/US (vector, saturating arithmetic)

Anyway, let's first agree on the intrinsics, so that further

development is done on trunk.

Thanks!

-Ahmed