This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Byteswapping floating point types


On Tue, 2009-07-14 at 17:34 -0700, Ian Lance Taylor wrote:
> Andrew Troschinetz <ast@arlut.utexas.edu> writes:

> template<typename T>
> T byteswap(T value)
> {
>   char buf1[sizeof(T)], buf2[sizeof(T)];
>   memcpy(buf1, &value, sizeof(T));
>   for (size_t i = 0; i < sizeof(T); ++i)
>     buf2[i] = buf1[sizeof(T) - 1 - i];
>   T ret;
>   memcpy(&ret, buf2, sizeof(T));
>   return ret;
> }


I'd take it one step further, and make the byteswapped objects their own
types:

template<typename T> class Byteswapped
{
   unsigned char buf[sizeof(T)];
   T Unswap(void) const;
   void Swap(const T &t);

  public:
   operator T(void) const { return Unswap();}
   Byteswapped &operator =(const T &t) { Swap(t); return *this;}
   Byteswapped(const T&t) { Swap(t);}
   ~Byteswapped();
   ....
};

(forgive the incomplete class, but it's late where I am, and I've shut
down the C++ part of my brain for the night).

The idea is that you can then have the byteswapped types as distinct
types in the code, and can handle them as though they were the unswapped
types (albeit with a great deal of overhead). I've had to do this a
great deal in the embedded systems I design, where I have a very
heterogeneous mix of processors (ARM, PPC, x86, 56300 DSPs, TI C6x
DSPs).
This would also, in the case of a floating point value, keep the swapped
version from being treated by the CPU as a floating point value, and
should in theory keep it out of any FPU registers.




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]