Цитата(klen @ Nov 11 2008, 20:28)

Свежак AVR
http://klen.org/Files/DevTools/kgp_avr-bu2...avrlibc1.6.2.7zкомпиллер теперь оптимизирует битовые сдвиги на предмен использования кинструкции swap, спасибо aesok
Решил я опять помучать ГЦЦ. Вытащил по ссылке, начал пробовать. Появилась пара вопросов. Первый:
Код
test.c:
typedef unsigned char UREG;
typedef signed char REG;
static void _netw_memcpy(char *d, char *s, UREG l);
void netw_memcpy(void *d, void *s, UREG l)
{
_netw_memcpy((char*)d,(char*)s,l);
}
static void _netw_memcpy(char *d, char *s, UREG l)
{
char c;
if (!l) return;
do
{
c=*s++;
*d++=c;
}
while(--l);
}
после gcc -O9 -S -mmcu=atmega168 test.c
Код
.file "test.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
.global __do_copy_data
.global __do_clear_bss
.text
.global netw_memcpy
.type netw_memcpy, @function
netw_memcpy:
push r16
push r17
push r28
push r29
/* prologue: function */
/* frame size = 0 */
tst r20
breq .L4
ldi r18,lo8(0)
ldi r19,hi8(0)
subi r20,lo8(-(-1))
mov r16,r20
ldi r17,lo8(0)
movw r28,r16
adiw r28,1
.L3:
movw r30,r24
add r30,r18
adc r31,r19
movw r26,r22
add r26,r18
adc r27,r19
ld r21,X
st Z,r21
subi r18,lo8(-(1))
sbci r19,hi8(-(1))
cp r18,r28
cpc r19,r29
brne .L3
.L4:
/* epilogue start */
pop r29
pop r28
pop r17
pop r16
ret
.size netw_memcpy, .-netw_memcpy
Как-то IAR с этим справляется на ура:
Код
RSEG CODE:CODE:NOROOT(1)
// 8 __x_z void netw_memcpy(void *d, void *s, UREG l)
netw_memcpy:
// 9 {
// 10 _netw_memcpy((char*)d,(char*)s,l);
REQUIRE _netw_memcpy
; // Fall through to label _netw_memcpy
// 11 }
// 12
RSEG CODE:CODE:NOROOT(1)
// 13 static __x_z void _netw_memcpy(char *d, char *s, UREG l)
_netw_memcpy:
// 14 {
// 15 char c;
// 16 if (!l) return;
TST R16
BREQ ??_netw_memcpy_0
// 17 do
// 18 {
// 19 c=*s++;
??_netw_memcpy_1:
LD R17, Z+
// 20 *d++=c;
ST X+, R17
// 21 }
// 22 while(--l);
DEC R16
BRNE ??_netw_memcpy_1
??_netw_memcpy_0:
RET
// 23 }
Вот и вопрос, ничего там в оптимизаторе случайно не сломали? А то что-то совсем мрачно. И вроде не было такого.
Теперь вопрос номер два. Сунул ему более глобальный файл. Получил вот такое
Код
F:\GCC\kgp_avr\avr-kgp-elf\bin>gcc -O9 -S network.c -mmcu=atmega168
network.c: In function 'INT_ETH_PROCESS_PKT2':
network.c:810: error: unable to find a register to spill in class 'POINTER_REGS'
network.c:810: error: this is the insn:
(insn 3268 2214 3269 284 network.c:88 (set (mem/c:QI (plus:HI (reg/f:HI 28 r28)
(const_int 24 [0x18])) [27 S1 A8])
(reg:QI 30 r30)) 4 {*movqi} (nil))
network.c:810: internal compiler error: in spill_failure, at reload1.c:2093
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
F:\GCC\kgp_avr\avr-kgp-elf\bin>
Баг-репорт отправлять прямо туда или Вам?