Hi Denis, I read the "out_movqi_r_mr" code of the AVR port. I see that following exception are
handled: 1. "REG_X+offset", which is not supported by AVR. 2. "REGY+offset", with offset larger than 63, which is not supported by AVR. Seems reload can not handle the targets that has some base regs are offsetable, and some can't. I will follow your method to handle my port. Thanks! 2010/8/1 Denis Chertykov <cherty...@gmail.com>: > 2010/7/31 redriver jiang <jiang.redri...@gmail.com>: >> Hi, >> >> Seems there are still some exceptions. >> >> During my testing, the compiler complains: >> >> ./os_core.c: In function 'OS_EventTaskWait': >> ./os_core.c:747: error: unable to find a register to spill in class >> 'POINTER_REGS' >> ./os_core.c:747: error: this is the insn: >> (insn 7 6 8 2 ./os_core.c:739 (set (mem/s/f:HI (plus:HI (reg/f:HI 16 >> R16 [orig:39 OSTCBCur.39 ] [39]) >> (const_int 13 [0xd])) [11 <variable>.OSTCBEventPtr+0 S2 A8]) >> (reg/v/f:HI 2 R2 [orig:40 pevent ] [40])) 48 {*movhi} (nil)) >> ./os_core.c:747: confused by earlier errors, bailing out >> >> >> I guess that it is caused by that there is only one register "R18" in >> "POINTER_REGS" class. >> >> I have changed "LEGITIMIZE_RELOAD_ADDRESS" several times, but still can't >> work. >> >> Do I miss some "macro" definition? >> >> Could someone give some direction? > > I have a lot of experiments with reloading memory addresses while I > debug AVR port. > Finally I have emulated memory addressing with infinite displacement. > > Look carefully at avr.c: out_movhi_r_mr > > Denis. >