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

Reply via email to