> > Since the jmp is a fixed 2 bytes (0xEB, tablesize), all references to > the table can still be done with trivial pc/RIP-relative addressing within > the closure, and you just need one pointer for both the table and the > closure data. > Only if tablesize fits in 127 bytes. Otherwise it will use 0xE9-based > encoding which is larger.The table size is variable - between 2 and 6 32- or 64-bit words, where 2-3 is the common case. This means Chris's trick of adjusting the pointer by a fixed amount to point directly to the code doesn't work unless we pad the table to the worst-case size all the time, which wastes a lot of space. Well, perhaps we could split the table into two, with the branch instruction after the first 2 or 3 words. Cheers, Simon
> > The table size is variable - between 2 and 6 32- or 64-bit words, where > 2-3 is the common case. This means Chris's trick of adjusting the pointer > by a fixed amount to point directly to the code doesn't work unless we pad > the table to the worst-case size all the time, which wastes a lot of > space. > Well... but you can surely emit the size of table as an argument of the > jump instruction :)Sure, the jump instruction is not the problem. But we were hoping to omit the jump instruction and have the compiler add the correct offset to the pointer when it generates code. In order to be able to do that, it has to know what the offset is: so either the offset is fixed, or we need some way to figure out what it is (we don't have that right now; in theory we could track that information but it might be painful to do so). Cheers, Simon