http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24209
Steven Bosscher <steven at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed|2005-10-05 11:06:49 |2013-04-18 11:06:49 CC|gcc-bugs at gcc dot gnu.org |steven at gcc dot gnu.org --- Comment #3 from Steven Bosscher <steven at gcc dot gnu.org> 2013-04-18 21:06:17 UTC --- Current trunk still picks that ldsb insn for the delay slot. Here's what it produces: .file "t.c" .section ".text" .align 4 .global PointToRowCol .type PointToRowCol, #function .proc 020 PointToRowCol: sethi %hi(term+4), %g1 sethi %hi(firstValidRow), %g2 ld [%g1+%lo(term+4)], %g1 ld [%g2+%lo(firstValidRow)], %g2 ld [%g1], %g4 ld [%g1+12], %g3 sub %o0, %g4, %o0 sra %o0, 31, %o5 wr %o5, 0, %y ld [%g3+4], %o5 nop nop sdiv %o0, %o5, %o0 cmp %o0, %g2 bl,a .L12 ldsb [%g1+16], %o4 sethi %hi(lastValidRow), %o5 ld [%o5+%lo(lastValidRow)], %o5 cmp %o0, %o5 bg .L10 mov %o0, %g2 .L2: ldsb [%g1+16], %o4 .L12: cmp %o4, 0 bne .L4 mov 0, %o5 ld [%g3+8], %o5 .L4: add %o5, %g4, %g4 sub %o1, %g4, %o1 sra %o1, 31, %g4 wr %g4, 0, %y ld [%g3], %g4 nop nop sdiv %o1, %g4, %o1 cmp %o1, 0 bl,a .L8 st %g2, [%o2] ld [%g1+4], %g1 add %g1, 1, %g1 cmp %o1, %g1 bg .L11 st %g2, [%o2] jmp %o7+8 st %o1, [%o3] .L11: mov %g1, %o1 jmp %o7+8 st %o1, [%o3] .L10: b .L2 mov %o5, %g2 .L8: mov 0, %o1 jmp %o7+8 st %o1, [%o3] .size PointToRowCol, .-PointToRowCol .ident "GCC: (GNU) 4.9.0 20130418 (experimental) [trunk revision 198052]" .section .note.GNU-stack,"",@progbits for this test case: typedef char Boolean; typedef struct { int width; } SbInfo; struct _vtwin { int f_width; int f_height; SbInfo sb_info; }; typedef struct { int border; int max_col; struct _vtwin *whichVwin; } TScreen; typedef struct _Misc { Boolean useRight; } Misc; typedef struct _XtermWidgetRec { TScreen screen; Misc misc; } XtermWidgetRec, *XtermWidget; extern int firstValidRow, lastValidRow; extern XtermWidget term; void PointToRowCol(int y, int x, int *r, int *c) { TScreen *screen = &term->screen; int row, col; row = (y - screen->border) / screen->whichVwin->f_height; if (row < firstValidRow) row = firstValidRow; else if (row > lastValidRow) row = lastValidRow; col = (x - (((term->misc.useRight) ? 0 : screen->whichVwin->sb_info.width) + screen->border) ) / screen->whichVwin->f_width; if (col < 0) col = 0; else if (col > screen->max_col + 1) col = screen->max_col + 1; *r = row; *c = col; } with options: "-mcpu=v8 -m32 -O2".