add a poor division by constant case.

llvm-svn: 125832
This commit is contained in:
Chris Lattner 2011-02-18 05:35:49 +00:00
parent 6b88c76f13
commit 0281731cc2
1 changed files with 37 additions and 0 deletions

View File

@ -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.
//===---------------------------------------------------------------------===//