> 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. -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University
> > 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 :) -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University