This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/11831] New: [ARM] Logical expression evaluation with condition fields
- From: "alga at rgai dot hu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 6 Aug 2003 09:35:44 -0000
- Subject: [Bug target/11831] New: [ARM] Logical expression evaluation with condition fields
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
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}