This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug rtl-optimization/25489] New: Suboptimal code generated for coparisons on Sparc


This code:

typedef struct {
  int protected_mode;
  int x;
} TScreen;

extern void ClearRight (TScreen *screen, int n);
extern void ClearLeft(TScreen * screen);
extern void ClearLine(TScreen * screen);

void
do_erase_line(TScreen * screen, int param, int mode)
{
    int saved_mode = screen->protected_mode;

    if (saved_mode == 1
        && saved_mode != mode)
        screen->protected_mode = 0;

    switch (param) {
    case -1:                    /* DEFAULT */
    case 0:
        ClearRight(screen, -1);
        break;
    case 1:
        ClearLeft(screen);
        break;
    case 2:
        ClearLine(screen);
        break;
    }
    screen->protected_mode = saved_mode;
}

is compiled to: (when using -O2 -mcpu=ultrasparc using gcc-4.0.2 and gcc-4.2)
do_erase_line:
        save    %sp, -112, %sp
        ld      [%i0], %l0
        xor     %l0, 1, %g1     <- from here
        xor     %l0, %i2, %i2
        subcc   %g0, %g1, %g0
        subx    %g0, -1, %g2
        subcc   %g0, %i2, %g0
        addx    %g0, 0, %g1
        andcc   %g2, %g1, %g0   <- to here
        bne,a,pt %icc, .LL2
         st     %g0, [%i0]
.LL2:
        cmp     %i1, 1
        be,pn   %icc, .LL6
         nop
[snip]


The code generated for the "if" can be better implemented
as (pseudoassembly):
 xor save_mode, 1, tmp1
 xnor save_mode, mode, tmp2
 orcc tmp1, tmp2

I don't know if this is a Sparc specific problem, or a general problem.


-- 
           Summary: Suboptimal code generated for coparisons on Sparc
           Product: gcc
           Version: 4.0.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: dann at godzilla dot ics dot uci dot edu
GCC target triplet: sparc-sun-solaris2.8


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25489


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]