RFR: 8365911: AArch64: Fix encoding error in sve_cpy for negative floats [v2]
erifan
duke at openjdk.org
Wed Sep 3 07:22:27 UTC 2025
> The sve_cpy instruction is not correctly implemented for negative floating-point values. The issues include:
>
> 1. When a negative floating-point number (e.g. `-1.0`) is passed, the `checked_cast<int8_t>(pack(d))` check fails. For example, assume `d = -1.0`:
> - `pack(-1.0)` returns an unsigned int with the 7th bit set, i.e., `0xf0`.
> - `checked_cast<int8_t>(0xf0)` casts `0xf0` to an int8_t value, which is `-16`.
> - Casting this int8_t `-16` back to unsigned int results in `0xfffffff0`.
> - The check compares `0xf0` to `0xfffffff0`, which obviously fails.
>
> 2. Additionally, the encoding of the negative floating-point number is incorrect:
> - The imm8 field can fall outside the valid range of **[-128, 127]**.
> - Bit **13** should be encoded as **0** for floating-point numbers.
>
> This PR fixes these issues and renames floating-point `sve_cpy` as `sve_fcpy`.
>
> Some test cases are added to aarch64-asmtest.py, and all tests passed.
erifan has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains three additional commits since the last revision:
- Don't rename sve_cpy as sve_fcpy
- Merge branch 'master' into JDK-8365911
- 8365911: AArch64: Fix encoding error in sve_cpy for negative floats
The sve_cpy instruction is not correctly implemented for negative
floating-point values. The issues include:
1. When a negative floating-point number (e.g. `-1.0`) is passed, the
`checked_cast<int8_t>(pack(d))` check fails. For example, assume `d = -1.0`:
- `pack(-1.0)` returns an unsigned int with the 7th bit set, i.e., `0xf0`.
- `checked_cast<int8_t>(0xf0)` casts `0xf0` to an int8_t value, which is `-16`.
- Casting this int8_t `-16` back to unsigned int results in `0xfffffff0`.
- The check compares `0xf0` to `0xfffffff0`, which obviously fails.
2. Additionally, the encoding of the negative floating-point number is incorrect:
- The imm8 field can fall outside the valid range of **[-128, 127]**.
- Bit **13** should be encoded as **0** for floating-point numbers.
This PR fixes these issues and renames floating-point `sve_cpy` as `sve_fcpy`.
Some test cases are added to aarch64-asmtest.py, and all tests passed.
-------------
Changes:
- all: https://git.openjdk.org/jdk/pull/26951/files
- new: https://git.openjdk.org/jdk/pull/26951/files/dad0e011..16a06948
Webrevs:
- full: https://webrevs.openjdk.org/?repo=jdk&pr=26951&range=01
- incr: https://webrevs.openjdk.org/?repo=jdk&pr=26951&range=00-01
Stats: 16389 lines in 782 files changed: 11717 ins; 2213 del; 2459 mod
Patch: https://git.openjdk.org/jdk/pull/26951.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/26951/head:pull/26951
PR: https://git.openjdk.org/jdk/pull/26951
More information about the hotspot-compiler-dev
mailing list