[foreign-memaccess+abi] RFR: 8300201: When storing MemoryAddress.ofLong(0x0000000080000000L), MemorySegment.get is not equal to MemorySegment.set because of the expanded sign [v2]

Gavin Ray duke at openjdk.org
Mon Jan 23 17:54:16 UTC 2023


On Mon, 23 Jan 2023 17:47:40 GMT, Per Minborg <pminborg at openjdk.org> wrote:

>> This PR proposes to normalize the upper 32-bit to zero on 32-bit systems.
>
> Per Minborg has updated the pull request incrementally with two additional commits since the last revision:
> 
>  - Update comments for 32-bit platforms
>  - Update src/java.base/share/classes/java/lang/foreign/MemorySegment.java
>    
>    Co-authored-by: Maurizio Cimadamore <54672762+mcimadamore at users.noreply.github.com>

Sorry to follow on here, but a question related to this -- you can use the upper 16 bits of a 64-bit pointer for pointer tagging, and also the lower 3-bits if it's on a word-aligned boundary.

This is really useful for building things like atomic tagged pointers, where you can store an ABA-like counter in the 16 bits and use the 3 bits for whatever userdata tag you want:


// A word-aligned, atomic tagged pointer.
// Uses both the upper 16 bits for storage, and the lower 3 bits for tagging.
//
//   64                48                32                16
// 0xXXXXXXXXXXXXXXXX  0000000000000000  0000000000000000  0000000000000XXX
//   ^                 ^                                                ^
//   |                 |                                                +-- Tag (3 bits)
//   |                 +-- Pointer (48 bits)
//   +-- Counter (16 bits)


Is this possible with `MemoryAddress` and bitmasks currently in Java 🤔 

(Or does an optimization like that even make sense on the JVM?)

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

PR: https://git.openjdk.org/panama-foreign/pull/774


More information about the panama-dev mailing list