This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib 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: [RUSSYLKI] __IEEE_*_ENDIAN vs. BYTE_ORDER


Ralf Corsepius wrote:
Hi,

Newlib's sys/param.h applies __IEEE_*_ENDIAN (from machine/ieeefp.h) to
define BYTE_ORDER.

AFAIU, __IEEE_*_ENDIAN denotes the floating point endianess, only, which
doesn't necessarily match with a CPU's general endianess.


E.g. some arm-CPUs seem to use __IEEE_BIG_ENDIAN, while actually being little endian targets.

On these targets newlib's sys/param.h results into
#define __IEEE_BIG_ENDIAN
#define BYTE_ORDER BIG_ENDIAN

even for little endian arm targets, while I think
#define __IEEE_BIG_ENDIAN
#define BYTE_ORDER LITTLE_ENDIAN

would have been correct.

I.e. I suspect newlib's sys/param.h to be "illegally" using
__IEEE_*_ENDIAN to setup BYTE_ORDER. I am wrong or right?

Ralf

I agree.

I've met problems with that. For my arm-elf target i had BYTE_ORDER = BIG_ENDIAN when I had -m little-endian gcc option. This is because of:
1. We rely on floating point endianess to get integers endianess.
2. Floating point endianess isn't always equivalent to integers endianess (Arm may gave mixed endianess for floating point).


I think BYTE_ORDER macro must relate to integers endian. For floating point endianess we should use __IEEE_* macros.

--
Best Regards,
Artem B. Bityuckiy,
St.-Petersburg, Russia.


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