HomeFreeBSD

Fix atomic_*cmpset32 on riscv64 with clang.

Description

Fix atomic_*cmpset32 on riscv64 with clang.

The lr.w instruction used to read the value from memory sign-extends
the value read from memory. GCC sign-extends the 32-bit comparison
value passed in whereas clang currently does not. As a result, if the
value being compared has the MSB set, the comparison fails for
matching 32-bit values when compiled with clang.

Use a cast to explicitly sign-extend the unsigned comparison value.
This works with both GCC and clang.

There is commentary in the RISC-V spec that suggests that GCC's
approach is more correct, but it is not clear if the commentary in the
RISC-V spec is binding.

Reviewed by: mhorne
Obtained from: Axiado
MFC after: 2 weeks
Sponsored by: DARPA
Differential Revision: https://reviews.freebsd.org/D22084

Details

Provenance
jhbAuthored on
Reviewer
mhorne
Differential Revision
D22084: Fix atomic_*cmpset32 on riscv64 with clang.
Parents
rS353930: Fix undefined behavior.
Branches
Unknown
Tags
Unknown