On Thu, Jul 12, 2018 at 04:40:39PM -0700, Steve Fink wrote:
> 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.

On the topic of tagged pointers, the approach taken in the LLVM code
base is interesting, as described in this talk by Chandler Carruth.
(the part relevant to tagged pointers starts at 22:36)

(relatedly, I have the beginning of something similar for rust)

dev-platform mailing list

Reply via email to