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