add a poor division by constant case.
authorChris Lattner <sabre@nondot.org>
Fri, 18 Feb 2011 05:35:49 +0000 (05:35 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 18 Feb 2011 05:35:49 +0000 (05:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125832 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/README.txt

index 551d9f08526be96a42526114d125401b6275229c..a7a477d2d5b833b5509af047cf454fd7fb865b1c 100644 (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.
+
+//===---------------------------------------------------------------------===//
+
+
+