Home Reading Searching Subscribe Sponsors Statistics Posting Contact Spam Lists Links About Hosting Filtering Features Download Marketing Archives FAQ Blog From: Ahmed Bougacha 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: 17ms