Hi, Mark H Weaver <m...@netris.org> skribis:
> Ludovic Courtès <l...@gnu.org> writes: >> Though an immediate, like a fixnum or an iflo, is still something >> different from a tagged heap object like a pair, right? So I would >> expect SCM_THOB_P to be a different test, not a drop-in replacement for >> SCM_NIMP, is that correct? > > That's right. It's not possible to create a drop-in replacement for > SCM_NIMP, because it is being used to answer two different questions > which used to be effectively equivalent, but no longer are: > > (1) Is X a pointer to a heap object with a heap tag in the first word? > (2) Is X a reference to a heap object? > > Test (1) needs to be done before checking the heap tag, to implement > type predicates for heap objects. Test (2) is needed in relatively few > places, e.g. to decide whether to register disappearing links when > adding an entry to a weak hash table. > > Actually, in my current branch I've removed the SCM_IMP and SCM_NIMP > macros outright, because it seems to me they are likely to be misused. > > SCM_THOB_P implements test (1) and SCM_HEAP_OBJECT_P implements test (2). I see. > There's no masking involved. Rather, it is subtracted from the pointer, > which allows the tag to be fused with the field offset. For example, on > x86-64, whereas CAR and CDR were previously: > > 1c0: 48 8b 07 mov (%rdi),%rax ;old car > and: > 1d0: 48 8b 47 08 mov 0x8(%rdi),%rax ;old cdr > > Now they become: > > 1e0: 48 8b 47 fa mov -0x6(%rdi),%rax ;new car > and: > 1f0: 48 8b 47 02 mov 0x2(%rdi),%rax ;new cdr Looks reasonable. :-) > Fortunately, BDW-GC provides GC_REGISTER_DISPLACEMENT, which allows us > to register a small offset K, such that BDW-GC should recognize pointers > that point K bytes into a heap block. We've been using this in both 2.0 > and 2.2 from scm_init_struct (), and in 'master' it's done in > scm_storage_prehistory (). > > This new approach entails registering one additional displacement. Cool; if it’s just one displacement, that’s OK. > What do you think? It all looks perfectly reasonable to me! Thanks for explaining, Ludo’.