Hi team, According to https://bugs.openjdk.java.net/browse/JDK-8277884 and [the original patch](https://github.com/riscv-collab/riscv-openjdk/pull/15): A very simple program inherited from jcstress could reproduce this: import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; // run with: // build/linux-riscv64-server-release/images/jdk/bin/java -ea -XX:-TieredCompilation -XX:CompileCommand=compileonly,jdk.internal.misc.Unsafe::compareAndSetByte TestCASByte // assert will fail. // if we add '-XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_compareAndExchangeByte' this test will pass. public class TestCASByte { byte[] array = new byte[1]; static final VarHandle vh; static { try { vh = MethodHandles.arrayElementVarHandle(byte[].class); } catch (Exception e) { throw new RuntimeException(e); } } public void test() { for (int i = 0; i < 100_000; i++) { // To level 4 // clear array[0] = 0; byte res1 = (byte)vh.getAndSet(array, 0, (byte)-1); byte res2 = (byte)vh.getAndSet(array, 0, (byte)2); assert res1 == 0 && res2 == -1; } } public static void main(String[] args) { new TestCASByte().test(); } } In this case when we are getting the -1 value saved in memory, the shift is 0, the old is 0x00000000000000ff and the mask is 0x00000000000000ff at the end of cmpxchg_narrow_value. The final result is 0x00000000000000ff but it indeed should be 0xffffffffffffffff. BTW the shift is 0. Therefore, if the result is negative, we need to make a sign extension. Thanks, Xiaolin ------------- Commit messages: - Fix cmpxchg_narrow_value that needs to sign-extend non-bool results Changes: https://git.openjdk.java.net/riscv-port/pull/15/files Webrev: https://webrevs.openjdk.java.net/?repo=riscv-port&pr=15&range=00 Issue: https://bugs.openjdk.java.net/browse/JDK-8277884 Stats: 7 lines in 1 file changed: 7 ins; 0 del; 0 mod Patch: https://git.openjdk.java.net/riscv-port/pull/15.diff Fetch: git fetch https://git.openjdk.java.net/riscv-port pull/15/head:pull/15 PR: https://git.openjdk.java.net/riscv-port/pull/15