diff options
author | Chris Lattner <sabre@nondot.org> | 2011-02-18 05:35:49 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2011-02-18 05:35:49 +0000 |
commit | 0281731cc25e9b9fb8671ddfe4716e454b60f76b (patch) | |
tree | 9255515c627a86e0fa6f6905c6145ad969d8d1e4 | |
parent | 6b88c76f13855fe07eacb8c671e1f37e35a0670c (diff) | |
download | bcm5719-llvm-0281731cc25e9b9fb8671ddfe4716e454b60f76b.tar.gz bcm5719-llvm-0281731cc25e9b9fb8671ddfe4716e454b60f76b.zip |
add a poor division by constant case.
llvm-svn: 125832
-rw-r--r-- | llvm/lib/Target/X86/README.txt | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/README.txt b/llvm/lib/Target/X86/README.txt index 551d9f08526..a7a477d2d5b 100644 --- a/llvm/lib/Target/X86/README.txt +++ b/llvm/lib/Target/X86/README.txt @@ -1884,3 +1884,40 @@ _add32carry: ret //===---------------------------------------------------------------------===// + +This: +char t(char c) { + return c/3; +} + +Compiles to: $clang t.c -S -o - -O3 -mkernel -fomit-frame-pointer + +_t: ## @t + movslq %edi, %rax + imulq $-1431655765, %rax, %rcx ## imm = 0xFFFFFFFFAAAAAAAB + shrq $32, %rcx + addl %ecx, %eax + movl %eax, %ecx + shrl $31, %ecx + shrl %eax + addl %ecx, %eax + movsbl %al, %eax + ret + +GCC gets: + +_t: + movl $86, %eax + imulb %dil + shrw $8, %ax + sarb $7, %dil + subb %dil, %al + movsbl %al,%eax + ret + +which is nicer. This also happens for int, not just char. + +//===---------------------------------------------------------------------===// + + + |