This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/52338] New: shorter abs thumb2 code sequences
- From: "carrot at google dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 22 Feb 2012 08:20:32 +0000
- Subject: [Bug target/52338] New: shorter abs thumb2 code sequences
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52338
Bug #: 52338
Summary: shorter abs thumb2 code sequences
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: carrot@google.com
Target: arm-linux-androideabi
Compile the following code with options -march=armv7-a -mthumb -Os
char placex[] = {1, 2, 3, 4};
char placey[] = {5, 6, 7, 8};
int t0k(int b, int w)
{
int h1 = placex[b] - placex[w];
int h2 = placey[b] - placey[w];
if (h1 < 0) h1 = -h1;
if (h2 < 0) h2 = -h2;
return h1 + h2;
}
GCC 4.7 generates:
t0k:
ldr r3, .L2
push {r4, lr}
ldrb r4, [r3, r0] @ zero_extendqisi2
adds r0, r3, r0
ldrb r2, [r3, r1] @ zero_extendqisi2
adds r3, r3, r1
ldrb r0, [r0, #4] @ zero_extendqisi2
ldrb r3, [r3, #4] @ zero_extendqisi2
subs r2, r4, r2
subs r3, r0, r3
eor r0, r2, r2, asr #31 // abs(h1)
sub r0, r0, r2, asr #31 // abs(h1)
cmp r3, #0 // abs(h2)
it lt // abs(h2)
rsblt r3, r3, #0 // abs(h2)
adds r0, r0, r3
pop {r4, pc}
It's interesting that gcc generats two different code sequence for abs(h1) and
abs(h2).
After carefully studying the insn pattern "*thumb2_abssi2", I got the
impression that the selection of code sequence is depends on if the result
register is same as source register. If they are same, the cmp code sequence is
used, otherwise the pure arithmetic code sequence is used.
But the cmp code sequence can also be used when the source is not the same as
target register, and may result in smaller code size, like in this case.
Another question is there any performance differences between these two
different code sequences?