https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92395
Bug ID: 92395 Summary: m68k-linux-gnu-gcc generates wrong code when the -mshort option is used Product: gcc Version: 7.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: i...@abp-labs.com Target Milestone: --- Created attachment 47189 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47189&action=edit C source file The option -mshort makes GCC m68k to use int size = 16-bit instead of 32-bit. But the pointers are also affected by this option and the asm code generated is buggy. Compiling the following test case gives: file a.c void f(char *begin, char *end) { do { *end-- = 0; } while (end > begin); } m68k-linux-gnu-gcc -S -O2 -fomit-frame-pointer a.c -o - .file "a.c" .text .align 2 .globl f .type f, @function f: move.l 4(%sp),%d0 move.l 8(%sp),%a0 .L2: clr.b (%a0) subq.l #1,%a0 cmp.l %d0,%a0 jhi .L2 rts .size f, .-f .ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0" .section .note.GNU-stack,"",@progbits m68k-linux-gnu-gcc -mshort -S -O2 -fomit-frame-pointer a.c -o - .file "a.c" .text .align 2 .globl f .type f, @function f: move.l 4(%sp),%d1 move.l 8(%sp),%a0 .L2: clr.b (%a0) move.l %a0,%d0 subq.l #1,%d0 add.l #65535,%a0 // Wrong code! cmp.l %d1,%d0 jhi .L2 rts .size f, .-f .ident "GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0" .section .note.GNU-stack,"",@progbits Another example with itoa function attached: m68k-linux-gnu-gcc -c itoa.c -Os -m68000 -Wall -mshort -fdata-sections -ffunction-sections -fomit-frame-pointer -fno-builtin -fno-ident -S -o - .file "itoa.c" .text .section .text.itoa,"ax",@progbits .align 2 .globl itoa .type itoa, @function itoa: movem.l #14384,-(%sp) move.w 24(%sp),%d0 move.l 26(%sp),%a0 move.w 30(%sp),%d1 move.w %d1,%d2 subq.w #2,%d2 cmp.w #14,%d2 jhi .L9 cmp.w #10,%d1 jne .L10 move.w %d0,%d3 jge .L4 neg.w %d3 .L4: move.w %d0,%d2 move.w %d3,%d0 .L3: move.l %a0,%a2 moveq #0,%d3 // moveq #-1,%d3 -> 32-bit OK not.w %d3 // remove this instruction lea digits.1019,%a3 .L5: ext.l %d0 divs.w %d1,%d0 move.l %d0,%d4 swap %d4 lea (1,%a2),%a1 move.b (%a3,%d4.w),(%a1,%d3.l) tst.w %d0 jne .L11 tst.w %d2 jge .L6 lea (2,%a2),%a1 move.b #45,1(%a2) .L6: lea (-1,%a1),%a2 move.l %a0,%a3 moveq #0,%d0 // moveq #-1,%d0 -> 32-bit OK not.w %d0 // remove this instruction .L7: cmp.l %a2,%a3 jcs .L8 .L2: clr.b (%a1) move.l %a0,%d0 movem.l (%sp)+,#3100 rts .L10: clr.w %d2 jra .L3 .L11: move.l %a1,%a2 jra .L5 .L8: move.b (%a2),%d1 move.b (%a3)+,(%a2) move.b %d1,(%a3,%d0.l) add.l #65535,%a2 // add.l #-1,%a2 -> 32-bit OK jra .L7 .L9: move.l %a0,%a1 jra .L2 .size itoa, .-itoa .section .rodata.digits.1019,"a",@progbits .type digits.1019, @object .size digits.1019, 17 digits.1019: .string "0123456789abcdef" .section .note.GNU-stack,"",@progbits