cgen-dis.in
Patrick Macdonald
patrickm@redhat.com
Wed Jan 31 11:16:00 GMT 2001
Comrades,
Starting from scratch... think of yesterday as my first day.
Doug, you are correct, this conditional inside print_insn () is
causing me pain.
if (CGEN_INSN_BITSIZE (insn) > cd->base_insn_bitsize &&
(CGEN_INSN_BITSIZE (insn) / 8) <= sizeof (unsigned long))
{
read in 32 bits;
extract information;
}
else
extract information;
The patch that I provided solved my problem but I was requested to
keep looking for a better solution (perhaps off the 'else' branch).
I'm trying to get a handle on what a better solution encompasses.
Just getting to the 'else' branch, as requested, is not straight
forward. One problem is that the instructions in question satisfy
the if conditional. I could add a condition such that only big endian
insns get through but that's kind of bogus besides probably being
blatantly wrong.
Just to refresh your memory: I have an ISA with a 16 bit base insn
bitsize, little endian. Several instructions have an instruction length
of 32 (16 bit instruction + 16 bit immediate). If I had an instruction,
0xabcd, and an immediate 0x1234, it's written to the obj as cdab 3412.
The 16 bit instruction is read in, 0xabcd, but then hits this conditional
as: if (32 > 16 && 32/8 <= 4). So... this is true. The instruction is
reread as a 32 bit, little endian instruction which returns 0x1234abcd.
This is why I had to flip the hi/lo bytes. If this had of been a big
endian target, all would be well. This is probably why we have not been
stung by this before.
So, where does this leave me? Well, I need help to fix this problem. The
help of people in the know. My cgen internal knowledge is minimal and having
me hack here and there without direction is a waste of time. Yeah, I could
hunker down for weeks and attempt to bring myself up to your gentlefellows
level, but that's not realistic. Guidance is requested and required.
Thanks,
Patrick
More information about the Cgen
mailing list