summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-02-17 04:20:13 +0000
committerChris Lattner <sabre@nondot.org>2006-02-17 04:20:13 +0000
commit67c21b6c46cfe6d8ec40105f17b010b4750deb29 (patch)
tree13bbcdfe87e8da3a2ddfbcd90d891149286c5624
parent0d62ebd13ffa0705f98654f62aa405e16007f4ff (diff)
downloadbcm5719-llvm-67c21b6c46cfe6d8ec40105f17b010b4750deb29.tar.gz
bcm5719-llvm-67c21b6c46cfe6d8ec40105f17b010b4750deb29.zip
add note about div by power of 2
llvm-svn: 26253
-rw-r--r--llvm/lib/Target/X86/README.txt32
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/README.txt b/llvm/lib/Target/X86/README.txt
index 5a2da2d3d26..bab702e96e3 100644
--- a/llvm/lib/Target/X86/README.txt
+++ b/llvm/lib/Target/X86/README.txt
@@ -443,3 +443,35 @@ when we can spare a register. It reduces code size.
It's not clear whether we should use pxor or xorps / xorpd to clear XMM
registers. The choice may depend on subtarget information. We should do some
more experiments on different x86 machines.
+
+//===---------------------------------------------------------------------===//
+
+Evaluate what the best way to codegen sdiv X, (2^C) is. For X/8, we currently
+get this:
+
+int %test1(int %X) {
+ %Y = div int %X, 8
+ ret int %Y
+}
+
+_test1:
+ movl 4(%esp), %eax
+ movl %eax, %ecx
+ sarl $31, %ecx
+ shrl $29, %ecx
+ addl %ecx, %eax
+ sarl $3, %eax
+ ret
+
+GCC knows several different ways to codegen it, one of which is this:
+
+_test1:
+ movl 4(%esp), %eax
+ cmpl $-1, %eax
+ leal 7(%eax), %ecx
+ cmovle %ecx, %eax
+ sarl $3, %eax
+ ret
+
+which is probably slower, but it's interesting at least :)
+
OpenPOWER on IntegriCloud