RFR: 8261142: AArch64: Incorrect instruction encoding when right-shifting vectors with shift amount equals to the element width [v11]
Eric Liu
github.com+10482586+therealeliu at openjdk.java.net
Tue Mar 2 11:19:53 UTC 2021
On Fri, 26 Feb 2021 06:10:01 GMT, Dong Bo <dongbo at openjdk.org> wrote:
>> In vectorAPI, when right-shifting a vector with a shift equals to the element width, the shift is transformed to zero,
>> see `src/jdk.incubator.vector/share/classes/jdk/incubator/vector/VectorOperators.java`:
>> /** Produce {@code a>>>(n&(ESIZE*8-1))}. Integral only. */
>> public static final /*bitwise*/ Binary LSHR = binary("LSHR", ">>>", VectorSupport.VECTOR_OP_URSHIFT, VO_SHIFT);
>>
>> The aarch64 assembler generates wrong or illegal instructions in this case, e.g. for the JAVA code below on aarch64,
>> assembler call `__ ushr(dst, __ T8B, src, 0)`, the instruction generated is not `ushr dst.8B, src.8B, 0`, but `ushr dst.4H, src.4H, 16` instead.
>> According to local tests, JVM gives wrong results for byte/short and crashes with SIGILL for integer/long.
>> ByteVector vba = ByteVector.fromArray(byte64SPECIES, bytesA, 8 * i);
>> vbb.lanewise(VectorOperators.ASHR, 8).intoArray(arrBytes, 8 * i);
>>
>> The legal right shift amount should be in the range 1 to the element width in bits on aarch64:
>> https://developer.arm.com/documentation/dui0801/f/A64-SIMD-Vector-Instructions/USHR--vector-?lang=en
>>
>> This fix handles zero shift separately. If the shift is zero, it generates `orr` for right shift, `addv` for right shift and accumulate.
>> Verified with linux-aarch64-server-fastdebug, tier1. Also created a jtreg to reproduce the issue and for regression tests.
>
> Dong Bo has updated the pull request incrementally with one additional commit since the last revision:
>
> refactor tests
test/hotspot/jtreg/compiler/vectorapi/TestVectorShiftImm.java line 133:
> 131: static int shift_with_op(VectorOperators.Binary op, ByteVector vbb,
> 132: byte arr[][], int end, int ind) {
> 133: vbb.lanewise(op, 1).intoArray(arr[end++], ind);
How about adding case 0 in this test? Those codes were changed.
-------------
PR: https://git.openjdk.java.net/jdk/pull/2472
More information about the hotspot-dev
mailing list