Subject: RE: Questions?

From: "Siders, Keith" <[email-masked]>
Date: Thu, 7 Mar 2002 13:19:29 -0600

You can get that down to 5 instructions. You could either use a typecast, or
for portability, use a union definition. For that matter you could even
typecast *mptr as a pointer to the union and extract the data from the
string however you choose. But it still takes 5 instructions, unless you're
pulling the data into another buffer, in which case you're down to 4.

Keith

-> -----Original Message-----
-> From: Richard Hodges [mailto:[email-masked]]
-> Sent: Thursday, March 07, 2002 11:57 AM
-> To: Ralf Baechle
-> Cc: Linux MIPS
-> Subject: Re: Questions?
-> 
-> 
-> On Thu, 7 Mar 2002, Ralf Baechle wrote:
-> 
-> > The MIPS ABI only covers big endian systems - every "real" 
-> MIPS UNIX
-> > system is big endian.  Everything else is a GNU extension. 
->  There is
-> > hardly any reason to choose a particular byteorder as 
-> usually endianess
-> > swapping takes so little CPU time that it isn't even 
-> meassurable but so
-> > I'm told there are exceptions.
-> 
-> To me, byte swapping on MIPS actually seems rather 
-> expensive.  The code
-> for htonl (linux/byteorder/swab.h) ends up something like this:
-> 
->         srl     $5,$4,8
->         andi    $5,$5,0xff00
->         srl     $2,$4,24
->         andi    $3,$4,0xff00
->         or      $2,$2,$5
->         sll     $3,$3,8
->         or      $2,$2,$3
->         sll     $4,$4,24
-> 
-> This may not be an issue if it is only needed a few times 
-> per packet, but
-> my system must byte-swap (LE to BE) about 500KB (or 4mb) per second.
-> Actually, I save a bit of work by combining the byte 
-> swapping with the
-> memory move, just after copy_from_user, and looks something like:
-> 
->     unsigned char a, b, c, d, *mptr;
-> 	a = mptr[0];
-> 	b = mptr[1];
-> 	c = mptr[2];
-> 	d = mptr[3];
-> 	mptr[0] = d;
-> 	mptr[1] = c;
-> 	mptr[2] = b;
-> 	mptr[3] = a;
-> 
-> This method works, but it is still 8 instructions per word.  
-> Yuck!  Does
-> anyone know of a _decent_ way to handle this on MIPS?
-> 
-> All the best,
-> 
-> -Richard
->

---

From: Richard Hodges <[email-masked]>
Date: Thu, 7 Mar 2002 13:00:17 -0800 (PST)

> pulling the data into another buffer, in which case you're down to 4.

Which 5 instructions are those?  For htonl from memory, the only sequence
I can think of is the "obvious" one of lbu/shift (7 instructions).  And
for swapping BE-LE in memory (an important thing for me), I do not see any
method better than the "obvious" one I mentioned earlier:

    90c50000        lbu     a1,0(a2)
    90c40001        lbu     a0,1(a2)
    90c30002        lbu     v1,2(a2)
    90c20003        lbu     v0,3(a2)
    a0c20000        sb      v0,0(a2)
    a0c30001        sb      v1,1(a2)
    a0c40002        sb      a0,2(a2)
    a0c50003        sb      a1,3(a2)

Thanks,

-Richard