Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane

From: Ahmed Bougacha <ahmed.bougacha <at> gmail.com>
Subject: [RFC] Integer Saturation Intrinsics
Newsgroups: gmane.comp.compilers.llvm.devel
Date: Wednesday 14th January 2015 22:08:25 UTC (over 3 years ago)
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
 
CD: 26ms