avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] mass stupidity with registers and longs


From: E. Weddington
Subject: Re: [avr-gcc-list] mass stupidity with registers and longs
Date: Mon, 17 Jan 2005 10:45:46 -0700
User-agent: Mozilla Thunderbird 0.7.3 (Windows/20040803)

David Gay wrote:

Curtis Maloney wrote:


I give up. I've been trying to shift 4 chars into an unsigned long, but can't stop GCC 3.4.1 (what's shipped with the latest WinAVR) from sign extending values, let alone producing sane code.

I've tried -Os, -O2, -O3, with and without -fnew-ra... the asm varies, but is generaly crap.

now, if I have:
    extern char a[4];
    unsigned long ul;

    ul = ( (unsigned)a[0] << 8 ) | (unsigned)a[1];

why would it be sign extending a[0] and a[1] when they're cast to unsigneds? And then why doesn't the code optimiser see to just mov rX, a[1]; mov rX+1,a[0] ?

I tried casts on casts on casts... everything I could think of to get better code, and it just did not improve.

Am I missing something,


Yes. As others have not given the actual explanation of why what you did doesn't work, and why you actually did ask for those sign extensions:

- "char" is signed on most platforms (including avr-gcc)

Note: If the WinAVR Makefile template is being used, it defines -funsigned-char as a compiler switch, making all "char"s, unsigned chars. The OP would have to post his command line to verfify that this was being used.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]