Skip to content

Commit

Permalink
[Autobackout][FuncReg]Revert of change: 7930522
Browse files Browse the repository at this point in the history
 Rework `convert_sat` builtins to handle infinity values (take 2)

The previous implementation of saturated conversion functions was based on the
assumption that if the destination integer type limits included the normal
number limits of the source FP type (e.g. `half` to `ulong` conversion), simple
checks for NaN values would suffice. Meanwhile, positive/negative infinity
values of any FP type would break this assumption, and we would run into
undefined behaviour as if performing a non-saturated conversion.

Additionally, saturation logic was duplicated for many FP/integer type pairs,
some of the implementations contradicting each other.

Unify all of the type-specific implementations through common helpers that
handle out-of-bounds clamping/NaN saturation logic. Account for INF values by
clamping to the destination type's min/max value depending on the INF sign (1).

This commit is a rework of 2b1593e: compared to the original approach, the
infinity checks are restrained to int <-> fp type pairs that satisfy:
```
intty_min < fpty_normal_min & fpty_normalmax < intty_max
```
Naturally, with unsigned types, this logic only involves the upper limit checks.
Compared to the first attempt, test coverage is also improved.

(1) Per OpenCL C 3.0 spec 6.4.3.3, "Out-of-Range Behavior and Saturated
Conversions",
> When in saturated mode, values that are outside the representable range shall
clamp to the nearest representable value in the destination format.

https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_C.html#out-of-range-behavior
  • Loading branch information
AGindinson authored and igcbot committed Jun 19, 2023
1 parent c36869e commit af96210
Show file tree
Hide file tree
Showing 4 changed files with 353 additions and 150 deletions.
Loading

0 comments on commit af96210

Please sign in to comment.