Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@redhat.com>
To: Joern Rennecke <renneckej@superh.com>
Cc: gdb-patches@sources.redhat.com, joern.rennecke@superh.com,
	andrew.stubbs@superh.com, amylaar@spamcop.net
Subject: Re: [RFA] SH4A contribution for sim
Date: Wed, 17 Dec 2003 21:49:00 -0000	[thread overview]
Message-ID: <3FE0CF66.30901@redhat.com> (raw)
In-Reply-To: <200312151444.hBFEiX821417@chloe.uk.w2k.superh.com>

Joern Rennecke wrote:
>>Michael Snyder wrote:
>>
>>>Here are my changes to support simulation of the sh4a.
>>
>>J"oern?  Any comment?
> 
> 
>>>  	  {
>>>  	    int m, mv;
>>>  
>>>+ 	    /* J"orn Rennecke: "Allow variable length n / m fields".
>>>+ 	       I'm not sure if I understand these two lines.  MVS */
>>>  	    if (s[1] - '0' > 1U || !s[2] || ! s[3])
>>>  	      expand_opcode (shift - 1, val + s[0] - '0', i, s + 1);
>>>+ 
> 
> 
> The code above handles a single binary digit if it appears as
> one of the last three characters, or in front of a non-binary character
> (e.g. the 'i' in 'i8*1....').  This is because handling the three 'n's in
> 'nnn0' leaves one extra binary digit.  E.g. for fsca, after 'nnn', the
> nibbles 0111 and 1110 are processed, leaving '1'.

Ah, thanks, I see.  So you're basically solving the same problem here
that I did by introducing the "ddd0" pattern.

Wouldn't it be safer to handle the extra '0' immediately?
What if you had a pattern that was like "nnn0GGGG", (for instance)?
You'd wind up parsing it as "nnn" plus "0GGG" plus "G".


> I didn't want to process single bits all the time because that requires
> some changes in patterns that recognize binary/letter combinations.

Yeah, that could be ugly.

> 
> On the other hand, you seem to be doing that right now anyway. 

Processing single bits?  Not that I'm aware....

 > And
> expanding these combinations is making this code ever harder to maintain.
> I think the only sane way forward is to handle variable-length binary fields
> - i.e. make a loop to see how much we got and build up the number as we go.
> The position dependent template fragments where the 'xx' and 'yy' for
> movx/movy, which you changed to 'xy' and 'yx'.

As a less extreme measure, what if we break some combinations
into two-byte fields instead of four?  I'm still thinking it
through, but I'm thinking that, for instance, "01NN" could be
handled in two passes: take the "01" first, then recurse and
let the "NN" be handled in the outer switch statement.  This
might also apply to 01xy and XY01.

> We can use this chage to xy/yx to make the detection position-independent,
> or check the shift parameter.  rather, that should be a count
> of bits that remain to be processed - subtracting 4 at the start doesn't
> make much sense if you don't process nibbles all the time.
> 
> 
>>>+ 	    /* 01xy -- 4 way fork across xy.  */
>>>+ 	    else if (s[2] == 'x' && s[3] == 'y')
>>>+ 	      for (j = 0; j < 4; j++)
>>>+ 		expand_opcode (shift - 4, val | m | (j << shift), i, s + 4);
>>>+ 	    /* 01xx -- 2x32 fork across x0 and nopy.  */
> 
> 
> This does not just go across nopy (that would be pointless), but across
> nopy and movy.
> By replacing all the 'xx' in movx templates with 'xy' and doing a vanilla
> expansion for 'xy' above, you disable generation of case labels for
> movx/movy combinations.  Then you made tons of other changes to compensate
> for this.  I see not point in these changes.

Please say more.  I found this part of the work difficult,
and I'm by no means sure that my solution was optimal.
Unfortunately I did the work several months ago, and my
memory is not fresh (appologies for not getting around to
submitting it sooner).


>>>+ 	case 'd':
>>>+ 	  /* Double register dr0-dr14 (even numbers only).  */
>>>+ 	  /* ddd0 -- 8 way fork.  */
>>>+ 	  val |= bton (s) << shift;
>>>+ 	  for (j = 0; j < 15; j += 2)
>>>+ 	    expand_opcode (shift - 4, val | (j << shift), i, s + 4);
>>>+ 	  break;
> 
> 
> What is that for?  I don't see why we should have a separate ddd0 pattern,
> where nnn0 works just fine and also makes it much clearer where the number
> ends up.  It's also more efficient when the simulator doesn't do any
> unnecessary runtime checks on the opcodes.  The even-numbered registers
> generate legal instruction encodings.  The odd-numbered ones are left
> over for the default case.  If you want to make sure that they raise a
> SIGILL exception, you can do this by initializing table accordingly.

OK, but there's precident -- MMMM, ssss, and GGGG all stand for
specific subsets of register numbers.  I'm willing to go with your
way, but consider that if we do use ddd0, then the problem of
handling a single nybble goes away.  The nnnn / mmmm code becomes
simpler again.





  reply	other threads:[~2003-12-17 21:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-05  2:38 Michael Snyder
2003-12-12  2:40 ` Michael Snyder
2003-12-15 19:03   ` Joern Rennecke
2003-12-17 21:49     ` Michael Snyder [this message]
     [not found] <200312180144.hBI1iosK001449@meolyon.local>
2003-12-18  2:37 ` Michael Snyder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3FE0CF66.30901@redhat.com \
    --to=msnyder@redhat.com \
    --cc=amylaar@spamcop.net \
    --cc=andrew.stubbs@superh.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=joern.rennecke@superh.com \
    --cc=renneckej@superh.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox