[jdk16] RFR: 8260585: AArch64: Wrong code generated for shifting right and accumulating four unsigned short integers [v3]
dongbo (E)
dongbo4 at huawei.com
Mon Feb 1 14:35:09 UTC 2021
On 2021/2/1 20:32, Andrew Haley wrote:
> On 2/1/21 8:11 AM, dongbo (E) wrote:
>> The tests passed with the newest version and still can catch the typo.
>> Also tested a few of injected errors, the tests failed as expected.
> One oddity has come up.
>
> I'm running compiler/c2/TestShiftRightAndAccumulate
> and the generated code I see for compiler.c2.TestShiftRightAndAccumulate::test_shorts
>
> No vector instructions here. As far as I can see vectors are never used
> for jshort, just for jchar. All very strange, and probably not your fault,
> but since I'm looking I had to mention it.
>
> The other weird thing is that {u,s}sra is never generated with the .8B form.
I guess the `usra` is not generated for `byte` and `short` because:
```
src/hotspot/share/opto/vectornode.cpp, line 182:
case Op_URShiftI:
switch (bt) {
case T_BOOLEAN:return Op_URShiftVB;
case T_CHAR: return Op_URShiftVS;
case T_BYTE:
case T_SHORT: return 0; // Vector logical right shift for signed short
// values produces incorrect Java result for
// negative data because java code should
convert
// a short value into int value with sign
// extension before a shift.
case T_INT: return Op_URShiftVI;
default: ShouldNotReachHere(); return 0;
}
```
For `byte` and `short`, we can have `ssra` for the code below:
```
for (int i = 0; i < count; i++) {
shortsC[i] = (short) (shortsA[i] + (shortsB[i] >> 5));
shortsD[i] = (short) (shortsA[i] + shortsB[i]);
}
```
I updated the tests to use this code, although I don't know why the
similar pattern of `char` does not works for `short`.
For `.8B` form, we only have `sshr + add`:
```
│ 0x0000ffff90085664: sshr v16.8b, v16.8b, #1
│ 0x0000ffff90085668: add v16.8b, v16.8b, v17.8b
```
According to the current implementation, it is strange that they are not
combined into a `ssra`:
```
AddVB: match(Set dst (AddVB src1 src2))
RShiftVB: match(Set dst (RShiftVB src (RShiftCntV shift)))
SSRA_VB: match(Set dst (AddVB dst (RShiftVB src (RShiftCntV shift))))
```
I think we need further investigate the last two issues.
More information about the hotspot-compiler-dev
mailing list