Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Autobackout][FuncReg]Revert of change: 7930522
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