diff options
author | Chris Lattner <sabre@nondot.org> | 2006-02-17 04:20:13 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-02-17 04:20:13 +0000 |
commit | 67c21b6c46cfe6d8ec40105f17b010b4750deb29 (patch) | |
tree | 13bbcdfe87e8da3a2ddfbcd90d891149286c5624 | |
parent | 0d62ebd13ffa0705f98654f62aa405e16007f4ff (diff) | |
download | bcm5719-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.txt | 32 |
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 :) + |