Patch to implement rotates by zero
Mon Aug 26 16:55:00 GMT 2002

At Tue, 20 Aug 2002 13:19:12 +0000 (UTC), "Maciej W. Rozycki" wrote:
> On 17 Aug 2002 wrote:
> > AFAIK, 'sll' w/ a shift of 0 is only guaranteed to sign-extend by
> > MIPS64.  I've seen no previous documentation that defined that it must
> > work that way.
>  Well, the behaviour is defined explicitly for "sll" and "sllv" by "MIPS
> R4000 Microprocessor User's Manual" (pp. A-140, A-141), the original spec
> for the original MIPS III processor, so the assumption should be any MIPS
> III+ implementation must do them this way; otherwise it is non-compliant
> (or simply broken).

So, i did some more looking.

points that agree with you:

* All of the specific processor user manuals i checked have similar
  wording re: sll doing a sign extension even for not-sign-extended
  64-bit inputs, but i didn't check many.

* I checked the r4k UM and it does in fact match what you said, _but_
  I do note that the PDF I have (second edition, from the MIPS web
  site IIRC), same pages as you mention, has change bars next to the
  statements in sll/sllv descriptions which define this behaviour.  I
  don't know how first edition looked (or how the earliest r4k parts

* An ancient MIPS IV ISA document i got from the SGI web or FTP site
  once ("it was a while ago") agrees.  (it also has the
  broken-assembler caveat.)

points that don't (but don't strongly disagree wither):

* MIPS RISC Architecture (Kane & Heinrich -- the version updated for
  r4000) makes no specific mention of this behaviour.  (it doesn't
  provide the description about unpredictable operation for the
  not-sign-extended 64-bit operands, either, though.  Arguably, this
  is more of an 'architecture' reference than the r4k UM is... but,
  well, this isn't a great book IMO.  8-S)

* similarly, See MIPS Run doesn't mention this sign-extending
  behaviour, either, at least not in the most obvious-to-me places.
  (IMO, for precise instruction descriptions, though, this isn't the
  best book in the world either.)

Personally, I only use binutils as my assembler, and I only use mips64
parts these days... so doing what you suggest would be fine w/ me.

Looking at the documentation, I can't find any strong counterexamples
to your claim that using sll consistently to sign extend should be OK.
However, if it is used, and support for other assemblers is continued
in gcc there probably should be an autoconf test to see that the
assembler is OK.


More information about the Binutils mailing list