[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