[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] error with optimized boolean logic in gcc
From: |
Georg-Johann Lay |
Subject: |
Re: [avr-gcc-list] error with optimized boolean logic in gcc |
Date: |
Fri, 25 Nov 2011 12:40:43 +0100 |
User-agent: |
Thunderbird 2.0.0.24 (X11/20100302) |
Sean D'Epagnier wrote:
> On Fri, Nov 25, 2011 at 11:18:17AM +0100, Georg-Johann Lay wrote:
>>> In avr.md I changed:
>>> return "sbi %i0,%2";
>>> to
>>> return "sbi %i0-0x20,%2";
>>>
>>> It fixed the problem. I think this needs to be done all over the place
>> This is an incorrect fix, the problem must be somewhere else.
>>
>
> Indeed, I didn't like it much, but it helped me understand the problem.
>
>> %i shall subtract avr_current_arch->sfr_offset which is 0x20 for all
>> architectures. The reason to use %i and not %m is to avoid magic
>> numbers 0x20 all over the place, see top of following changeset and
>> %i implementation in avr.c:print_operand()
>>
>> http://gcc.gnu.org/viewcvs?view=revision&revision=181552
>>
>> + else if (code == 'i')
>> + {
>> + if (!io_address_operand (addr, GET_MODE (x)))
>> + fatal_insn ("bad address, not an I/O address:", addr);
>> +
>> + switch (INTVAL (addr))
>> + {
>> + case RAMPZ_ADDR: fprintf (file, "__RAMPZ__"); break;
>> + case SREG_ADDR: fprintf (file, "__SREG__"); break;
>> + case SP_ADDR: fprintf (file, "__SP_L__"); break;
>> + case SP_ADDR+1: fprintf (file, "__SP_H__"); break;
>> +
>> + default:
>> + fprintf (file, HOST_WIDE_INT_PRINT_HEX,
>> + UINTVAL (addr) - avr_current_arch->sfr_offset);
>> + break;
>> + }
>> + }
>>
>
> This makes a lot more sense now, but the above code is never reached.
> If you go a bit higher up in the function you will see:
>
> else if (GET_CODE (x) == CONST_INT)
> -> fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (x) + abcd);
> else if (GET_CODE (x) == MEM)
> {
> ...
> bit of code from above
> ...
> }
>
> code is indeed 'i', but GET_CODE(x) is CONST_INT not MEM, so the conversion
> never takes place.
>
> We could of course perform the conversion in both places, but I don't
> really like that either. Maybe perform the subraction earlier as for abcd?
>
> Sean
Please f'up
http://gcc.gnu.org/ml/gcc-patches/2011-11/msg02400.html
Johann