[Bug target/67057] New: [SH] Use negc to calculate 1-T+const_int
olegendo at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Jul 29 14:30:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67057
Bug ID: 67057
Summary: [SH] Use negc to calculate 1-T+const_int
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: olegendo at gcc dot gnu.org
Target Milestone: ---
The following
int foo (int a, int b)
{
return ((a & (1 << 25)) ? 5 : 4);
}
compiled with -O2 results in:
mov.l .L4,r1
mov #-1,r0
tst r1,r4
negc r0,r0
rts
add #4,r0 // r0 = 1 - T + 4
// = 5 - T
.L5:
.align 2
.L4:
.long 33554432
The negc insn calculates 0 - reg - T, which can be used to calculate const_int
+ T. In fact, it is already used to calculate 1 - T as a replacement for SH2A
movrt.
The resulting code should look something like this:
mov.l .L4,r1
mov #-5,r0
tst r1,r4
rts
negc r0,r0
Combine is looking for a pattern:
Failed to match this instruction:
(set (reg:SI 162 [ D.1652 ])
(plus:SI (zero_extract:SI (reg:SI 4 r4 [ a ])
(const_int 1 [0x1])
(const_int 25 [0x19]))
(const_int 4 [0x4])))
Which could be implemented with treg_set_expr.
More information about the Gcc-bugs
mailing list