[foreign-memaccess+abi] RFR: 8300201: When storing MemoryAddress.ofLong(0x0000000080000000L), MemorySegment.get is not equal to MemorySegment.set because of the expanded sign [v2]
Per Minborg
pminborg at openjdk.org
Mon Jan 23 18:14:11 UTC 2023
On Mon, 23 Jan 2023 17:51:31 GMT, Gavin Ray <duke at openjdk.org> wrote:
> 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?)
On some systems, mapped memory segments appear as negative longs and thus, is at least using bit 63.
-------------
PR: https://git.openjdk.org/panama-foreign/pull/774
More information about the panama-dev
mailing list