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:rh@matriplex.com] -> 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 ->