Closed hansake closed 2 years ago
When compiling a very simple test program for z80 an incorrect 16 bit indexed load is generated by the compiler. This was correct in earlier version.
The test program:
/* Very very simple test program: testz80.c */ int main() { int a , b, c; b = 1; c = 2; a = b + c; return (a); }
Compiled with:
$ ez80-clang --target=z80 -S testz80.c
gave in a previous release this output:
section .text,"ax",@progbits section .text,"ax",@progbits public _main _main: push ix ld ix, 0 add ix, sp ld hl, -8 add hl, sp ld sp, hl ld hl, 0 ld de, 1 ld bc, 2 ld (ix + -2), l ld (ix + -1), h ld (ix + -6), e ld (ix + -5), d ld (ix + -8), c ld (ix + -7), b ld l, (ix + -6) ld h, (ix + -5) ld e, (ix + -8) ld d, (ix + -7) add hl, de ld (ix + -4), l ld (ix + -3), h ld l, (ix + -4) ld h, (ix + -3) ld iy, 8 add iy, sp ld sp, iy pop ix ret section .text,"ax",@progbits ident "clang version 13.0.0 (https://github.com/jacobly0/llvm-project.git d270916c9cf31e630cc9ef215671a0d1c56280f8)" extern __Unwind_SjLj_Register extern __Unwind_SjLj_Unregister
and in the latest release I cloned and compiled, the following assembler output is generated.
section .text,"ax",@progbits section .text,"ax",@progbits public _main _main: push ix ld ix, 0 add ix, sp ld hl, -8 add hl, sp ld sp, hl ld hl, 0 ld de, 1 ld bc, 2 ld (ix - 2), l ld (ix - 1), h ld (ix - 6), e ld (ix - 5), d ld (ix - 8), c ld (ix - 7), b ld l, (ix - 6) ld h, (ix - 5) ld e, (ix - 8) ld d, (ix - 7) add hl, de ld (ix - 4), l ld (ix - 3), h ld hl, (ix - 4) <--- incorrect instruction ld iy, 8 add iy, sp ld sp, iy pop ix ret section .text,"ax",@progbits ident "clang version 13.0.0 (https://github.com/jacobly0/llvm-project.git a25003f240988428e2fad6f77f25d9b600c59b5e)" extern __Unwind_SjLj_Register extern __Unwind_SjLj_Unregister
The instruction that upsets the assembler (z80-elf-as) is:
ld hl, (ix - 4)
which is correctly generated in an earlier release as:
ld l, (ix + -4) ld h, (ix + -3)
Unfortunately Z80 and Z180 can't make a 16 bit indexed load.
Another thing that z80-elf-as don't understand is:
public _main
but that was fixed with a sed script used by the Makefile:
...Makefile # Define a pattern rule that compiles every .c file into a .o file %.o : %.c ez80-clang --target=z180 -S -o $<.is $< sed -f asmscript.sed $<.is > $<.s z80-elf-as -march=z180 -o $@ $<.s rm $<.is $<.s ...asmscript.sed s/\tpublic/\tglobal/
Sorry, I was in the middle of moving and forgot to fix this.
Works good now. Thanks.
When compiling a very simple test program for z80 an incorrect 16 bit indexed load is generated by the compiler. This was correct in earlier version.
The test program:
Compiled with:
gave in a previous release this output:
and in the latest release I cloned and compiled, the following assembler output is generated.
The instruction that upsets the assembler (z80-elf-as) is:
which is correctly generated in an earlier release as:
Unfortunately Z80 and Z180 can't make a 16 bit indexed load.
Another thing that z80-elf-as don't understand is:
but that was fixed with a sed script used by the Makefile: