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".

Reply via email to