RFR: 8356159: RISC-V: Add Zabha [v11]

Robbin Ehn rehn at openjdk.org
Tue Jun 3 13:17:56 UTC 2025


On Tue, 3 Jun 2025 12:10:07 GMT, Feilong Jiang <fjiang at openjdk.org> wrote:

>> When we call amocas with unknown size (i.e. not hardcoded int64/int32) we have this assert in the caller:
>> `assert((UseZacas && UseZabha) || (size != int8 && size != int16), "unsupported operand size");`
>> 
>> So it seems like we should be fine, no?
>
> Looks like `UseZabha` relies on `UseZacas`? The following code will call `atomic_cas` only when `UseZacas` is true even if the size is `int8` or `int16`. If that is true (maybe `(UseZacas && UseZabha)` already explained), then it makes sense.
> 
> https://github.com/openjdk/jdk/blob/78a392aa3b0cda52cfacfa15250fa61010519424/src/hotspot/cpu/riscv/macroAssembler_riscv.cpp#L4019-L4031

You can't use that method for int8/int16 if you don't have UseZabha (and Zacas).
You must call the cmpxchg_narrow().

The reason why we have two different method is the number of registers needed, i.e. cmpxchg_narrow requires scratch registers.

So when you don't have UseZabha you should not be calling this method at all for int8/int16.

There is an assert above that checks:
`assert((UseZacas && UseZabha) || (size != int8 && size != int16), "unsupported operand size");`

The relationship is:

UseZacas=false and UseZabha=false => LR/SC    and narrow LR/SC for sub word size.
UseZacas=true  and UseZabha=false => amocas and narrow amocas for sub word size.
UseZacas=false and UseZabha=true => LR/SC    and narrow LR/SC for sub word size.
UseZacas=true  and UseZabha=true => amocas and amocas for sub word size.


There is no LR/SC for sub word sizes, int8/int16, thus without Zacas they always use narrow LR/SC.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/25252#discussion_r2123776682


More information about the hotspot-dev mailing list