This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Question about CASE_DROPS_THROUGH
zack@codesourcery.com (Zack Weinberg) wrote on 20.06.04 in <87isdmvwi0.fsf@taltos.codesourcery.com>:
> (It should be noted that there are a lot of ports that use the
> "casesi" expander, but in all cases other than VAX there appears to be
> no good reason for this - they're just duplicating what stmt.c would
> do if it had only "tablejump" to work with. I was particularly
> curious to see if the s390 had a similar instruction to the VAX, but
> if it does we aren't using it.)
I don't remember such an instruction from /370, and I would be surprised
if it had been added later. (Instead there's this strange "get this other
instruction, fiddle with the bits in it, then execute it" instruction that
has never stopped boggling me ...)
But the VAX instruction still looks familiar: UCSD p-Code has something
that looks extremely close to it - I think I know it as "XJP". Opcode
followed by lower and upper bound, then by an UJP[1] (unconditional jump)
instruction that just skips over the case table, then a vector of jump
targets. (The UJP takes two bytes, as does every jump target - this is a
16 bit pseudo CPU.)
Just for curiosity, same-procedure code addresses are either referring
backwards, in which case they are offset-from-address-word, or forward, in
which case they index a table at the end of the procedure (where there is
also a struct defining calling sequence and stuff, which is referenced
from the segment procedure table), and that table will have the offset-
from-address-word. In fact, *all* actual code pointers are offset-from-
address-word - everything is PIC. And everything is designed for a strict
single-pass compiler.
[1] Or presumably one could put some sort of exception thrower there if
there ever was a compiler for a language where falling through was an
error.
MfG Kai