On 07/12/2018 04:27 PM, Cameron McCormack wrote:
On Fri, Jul 13, 2018, at 6:51 AM, Kris Maglione wrote:
I actually have a patch sitting around with helpers to make it super easy to
use smart pointers as tagged pointers :) I never wound up putting it up for
review, since my original use case went away, but it you can think of any
specific cases where it would be useful, I'd be happy to try and get it
landed.
Speaking of tagged pointers, I've used lower one or two bits for tagging a
number of times, but I've never tried packing things into the high bits of a 64
bit pointer. Is that inadvisable for any reason? How many bits can I use,
given the 64 bit platforms we need to support?
JS::Value makes use of this. We preserve the bottom 47 bits, but that's
starting to be problematic as some systems want 48. So, stashing stuff
into the high 16 bits is pretty safe!
The number of low bits available depends on your pointer alignment. But
you can generally get away with 2 bits on 32-bit, 3 bits on 64-bit --
unless it's a char*, in which case it's quite common to have
byte-aligned pointers (eg when sharing part of another string.) You
really do need to know the exact alignment, though, rather than guessing.
Bit ops are pretty cheap, and in these post-Spectre days, it's not an
awful idea to xor with a type field in those high bits before
(potentially speculatively) accessing pointers. I think you still get
the benefits of speculation if it's the right type.
_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform