RFR: 8322770: Implement C2 VectorizedHashCode on AArch64 [v5]

Mikhail Ablakatov duke at openjdk.org
Thu Aug 22 14:45:06 UTC 2024


On Thu, 22 Aug 2024 13:12:23 GMT, Andrew Dinn <adinn at openjdk.org> wrote:

>> Mikhail Ablakatov has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   cleanup: use a constexpr function for intpow instead of a templated class
>
> src/hotspot/cpu/aarch64/c2_MacroAssembler_aarch64.cpp line 100:
> 
>> 98: 
>> 99:   assert(is_power_of_2(unroll_factor), "can't use this value to calculate the jump target PC");
>> 100:   orr(tmp2, cnt, 0x1fff ^ (unroll_factor - 1));
> 
> This is rather cryptic, especially the slightly arbitrary choice of 0x1fff -- any all 1s value greater than (loop_factor - 1) would do. I think a comment as to what is being done here might help maintainers understand what is happening here.
> 
> // At this point cnt holds (r - l) where r is the number of remaining elements,
> // l is loop_count and 0 <= r < l. The constant operand to the orr 'rounds' this
> // negative value into range [-u, -1] where u = unroll_factor, by clearing bits
> // below bit k = log2(unroll_factor) and setting any higher bits that might be clear.
> // The subtract shifted by 3 offsets past ((u - r) % u) load + madd insns i.e. it only
> // executes r % u load + madds. Iteration eats up the remainder, u elements at a time.

Thank you for providing a detailed comment!

I can't remember why I needed the `0x1fff` literal. Probably this is an artifact left from WIP code. I believe this is not required anymore and the `orr` can be simplified to `orr(tmp2, cnt, -unroll_factor)`.

Given that, I'd suggest to shorten the comment to:

```c++
  // At this point cnt holds (r - l) where r is the number of remaining elements, l is loop_count                                                                                                                                                                                                                           
  // and 0 <= r < l. The orr performs (r - l) % u where u = unroll_factor.  The subtract shifted by                                                                                                                                                                                                                         
  // 3 offsets past |(r - l) % u| load + madd insns i.e. it only executes r % u load + madds.                                                                                                                                                                                                                               
  // Iteration eats up the remainder, u elements at a time.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/18487#discussion_r1727195330


More information about the hotspot-dev mailing list