From: SourceForge.net <no...@so...> - 2010-05-21 12:18:18
|
Bugs item #2995398, was opened at 2010-05-02 08:03 Message generated for change (Comment added) made by spth You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2995398&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: z80 port Group: None >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: andrewl (andrewwl) Assigned to: Nobody/Anonymous (nobody) Summary: memcpy() code fails in one corner case Initial Comment: For the z80 target, your memcpy() intrinsic generates the following code: ROM:0232 ld l, (ix+4) ROM:0235 ld h, (ix+5) ; HL = <dest> ROM:0238 ld c, (ix+6) ROM:023B ld b, (ix+7) ; CB = <src> ROM:023E ex de, hl ; DE = HL ROM:023F ld l, c ROM:0240 ld h, b ; HL = CB ROM:0241 ld c, (ix+8) ROM:0244 ld b, (ix+9) ; CB = <len> ROM:0247 ldir The problem is when the length argument is 0 (eg: memcpy(dst, src, 0)). The LDIR instruction first copies a byte, THEN decrements CB, THEN decides whether to repeat (when CB is 0). So an initial value of 0 overwrites all of memory since CB is decremented to FFFF before the zero check occurs. Here is my version info: sdcc -v SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.9.0 #5416 (Mar 22 2009) (MINGW32) Thank you for this great software! Andrew ---------------------------------------------------------------------- >Comment By: Philipp Krause (spth) Date: 2010-05-21 14:18 Message: Fixed in revision #5828. ldir is now only used when the last parameter is a literal, and if it is zero, no ldir is generated at all. Philipp ---------------------------------------------------------------------- Comment By: Philipp Krause (spth) Date: 2010-05-16 15:29 Message: Well, this might be the final nail in the coffin of this ldir-for-memcpy thing. Checking for zero first is clearly unacceptable in terms of code size. There are firther bugs in argument handling (and there have been in the past, with fixes complicating the code). The best solution seems to be to only convert memcpy with the last paramteter being an integer constant to ldir, and use regular memcpy otherwise. However it would be a bit complicated, AFAIK there is no way to replace function calls by builtins depending on the parameters in sdcc. Maybe we can continue to convert memcpy calls to a builtin and then later replace some of them with function calls again the same way we replace long division, etc by support calls. Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2995398&group_id=599 |