summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-02-18 05:35:49 +0000
committerChris Lattner <sabre@nondot.org>2011-02-18 05:35:49 +0000
commit0281731cc25e9b9fb8671ddfe4716e454b60f76b (patch)
tree9255515c627a86e0fa6f6905c6145ad969d8d1e4
parent6b88c76f13855fe07eacb8c671e1f37e35a0670c (diff)
downloadbcm5719-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.txt37
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.
+
+//===---------------------------------------------------------------------===//
+
+
+
OpenPOWER on IntegriCloud