Version:
SDCC : z80/z180/r2k/r2ka/r3ka/gbz80/ez80_z80/z80n 4.1.11 #12685 (Mac OS X x86_64)
Also in 12555 and 12419
Configure line:
./configure --disable-ds390-port --disable-ds400-port --disable-hc08-port --disable-s08-port --disable-mcs51-port --disable-pic-port --disable-pic14-port --disable-pic16-port --disable-tlcs90-port --disable-xa51-port --disable-stm8-port --disable-pdk13-port --disable-pdk14-port --disable-pdk15-port --disable-pdk16-port --disable-ucsim --disable-device-lib --disable-packihx
Compilation line:
sdcc -mz80 -S test.c
Test file (apologies for not trimming this down):
typedef unsigned char boolean; #define true 1 #define false 0 typedef unsigned char obj_code; typedef struct object_d { obj_code code; char *desc; unsigned int position; // Always int, as carried =1500, worn=1600 unsigned char attributes; } object; object *odummy; unsigned char current_position; char *message1006; char *message1005; extern object *search_object_p(unsigned int o); extern void show_message(const char *m); #define ISNOTMOVABLE 1 #define CARRIED 1500 boolean get(unsigned int o) { odummy=search_object_p(o); if(odummy->position!=current_position) { show_message(message1006); } else if((odummy->attributes&ISNOTMOVABLE)==0) { show_message(message1005); } else { odummy->position=CARRIED; return false; } return true; }
Generated code snippet:
ld (_odummy), hl ;blah.c:33: if(odummy->position!=current_position) { ld iy, (_odummy) push iy pop bc inc bc inc bc inc bc ld l, c ld h, b ld e, (hl) inc hl ld d, (hl) ld iy, #_current_position <<<<< ld l, 0 (iy) ; spillPairReg hl ; spillPairReg hl ld h, #0x00 ; spillPairReg hl ; spillPairReg hl cp a, a sbc hl, de jr Z, 00105$ ;blah.c:34: show_message(message1006); ld hl, (_message1006) push hl call _show_message pop af jr 00106$ 00105$: ;blah.c:35: } else if((odummy->attributes&ISNOTMOVABLE)==0) { push iy <<<< pop de ld hl, #5 add hl, de ld a, (hl) rrca jr C, 00102$
Problematic lines marked with <<<. At line 35 it's assumed that iy should hold (odummy) however, it has been loaded up with the contents of current_position.
Thanks. I can reproduce the issue using current SDCC 4.1.10 #12683 on my Debian GNU/Linux testing system.
Fixed in [r12687].