[Bug target/11831] New: [ARM] Logical expression evaluation with condition fields

alga at rgai dot hu gcc-bugzilla@gcc.gnu.org
Wed Aug 6 09:35:00 GMT 2003


PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org.

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

           Summary: [ARM] Logical expression evaluation with condition
                    fields
           Product: gcc
           Version: 3.4
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: alga at rgai dot hu
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: arm-unknown-elf

For translating a compound logical expression GCC uses an ldm instruction to
interrupt the evaluation of conditions fields. When optimizing for size
it would be promising to use condition fields instead of the ldm, if possible.

--- c example ---
int func(char*);
int foo (char* name)
{
   int n = func (name);
   return
      (name[n-4] == 'a' &&
       name[n-3] == 'b' &&
       name[n-2] == 'c' &&
       name[n-1] == 'd');
}

--- arm code ---
foo:
 mov ip, sp
 stmfd sp!, {r4, fp, ip, lr, pc}
 sub fp, ip, #4
 mov r4, r0
 bl func
 add r4, r4, r0
 ldrb r3, [r4, #-4]
 cmp r3, #97
 mov r0, #0 <- OLD
 ldmneea fp, {r4, fp, sp, pc} <- OLD
 ldrb r3, [r4, #-3] <- OLD
 cmp r3, #98 <- OLD
 ldmneea fp, {r4, fp, sp, pc} <- OLD
 ldrb r3, [r4, #-2] <- OLD
 cmp r3, #99 <- OLD
 ldmneea fp, {r4, fp, sp, pc} <- OLD
 ldrb r3, [r4, #-1] <- OLD
 cmp r3, #100 <- OLD
 movne r0, #0
 moveq r0, #1
 ldmea fp, {r4, fp, sp, pc}

--- possible solution ---
foo:
 mov ip, sp
 stmfd sp!, {r4, fp, ip, lr, pc}
 sub fp, ip, #4
 mov r4, r0
 bl func
 add r4, r4, r0
 ldrb r3, [r4, #-4]
 cmp r3, #97
 ldreqb r3, [r4, #-3] <- NEW
 cmpeq r3, #98 <- NEW
 ldreqb r3, [r4, #-2] <- NEW
 cmpeq r3, #99 <- NEW
 ldreqb r3, [r4, #-1] <- NEW
 cmpeq r3, #100 <- NEW
 movne r0, #0
 moveq r0, #1
 ldmea fp, {r4, fp, sp, pc}



More information about the Gcc-bugs mailing list