This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Question about RTL for bitwise AND
- From: "Matt Lee" <reachmatt dot lee at gmail dot com>
- To: gcc-help at gcc dot gnu dot org
- Date: Thu, 13 Apr 2006 09:57:11 -0700
- Subject: Question about RTL for bitwise AND
Hi,
I am using powerpc-eabi-gcc (version 3.4.1) and I have a question
about the RTL that is produced for,
test.c
int a;
if (a & 2) {
// Do something
} else
// Do something else
}
I see in test.c.01.rtl,
(insn 12 11 13 (set (reg:SI 122)
(lshiftrt:SI (reg:SI 121)
(const_int 1 [0x1]))) -1 (nil)
(nil))
(insn 13 12 14 (parallel [
(set (reg:SI 123)
(and:SI (reg:SI 122)
(const_int 1 [0x1])))
(clobber (scratch:CC))
]) -1 (nil)
(nil))
My question is, why is a logical shift right required? Wouldn't a
direct bit-wise AND with const_int 2 suffice?
I am wondering if I am missing some C expression rules here? This
seems to be happening only for one-hot encoded bitwise ANDs.
For e.g, if the expression is (a & 3), then I only see RTL generated
for the bitwise AND and there is no right shift. I am using -O3 -S as
compiler switches.
I do see other architectures produce only the bitwise AND even for
one-hot encoded immediate operands such as 0x2.
This is causing problems in my (other) port where I can do only
single-bit shifts. In the worst case, a & 0x80000000 the final
assembly contains 31 right shifts. This is a big optimization problem.
Any advice is much helpful.
thanks,
Matt