This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/36473] Generate bit test (bt) instructions
- From: "ubizjak at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 9 Jun 2008 11:39:16 -0000
- Subject: [Bug target/36473] Generate bit test (bt) instructions
- References: <bug-36473-1649@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #1 from ubizjak at gmail dot com 2008-06-09 11:39 -------
Created an attachment (id=15741)
--> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=15741&action=view)
Proposed patch
Following code:
--cut here--
void foo (void);
int test (int x, int n)
{
if (x & (1 << n))
foo ();
return 0;
}
--cut here--
compiles using -O2 to:
test:
subl $12, %esp
movl 16(%esp), %eax
movl 20(%esp), %ecx
sarl %cl, %eax
testb $1, %al
je .L2
call foo
.L2:
xorl %eax, %eax
addl $12, %esp
ret
With attached patch, following code is produced:
test:
subl $12, %esp
movl 20(%esp), %edx
movl 16(%esp), %eax
btl %edx, %eax
jnc .L2
call foo
.L2:
xorl %eax, %eax
addl $12, %esp
ret
Attached patch doesn't have TARGET_USE_BT insn predicates, and it generates bt
instructions by default. It was used to bootstrap gcc on i686-pc-linux-gnu,
where it converts >1800 shift-and-test sequences into eqivalent bt instruction.
The patch as is was bootstrapped and regression tested on x86_64-pc-linux-gnu
as well as i686-pc-linux-gnu.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36473