add some notes
authorChris Lattner <sabre@nondot.org>
Thu, 10 May 2007 00:08:04 +0000 (00:08 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 10 May 2007 00:08:04 +0000 (00:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36965 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/README.txt

index 9ab17dc3ee93be1f23d199b3addea8d0d548186b..477838d0e5c5ea7a73e7442ac5f4cbe09744706d 100644 (file)
@@ -1094,5 +1094,33 @@ it should compile to a move from the stack slot directly into eax.  DAGCombine
 has this xform, but it is currently disabled until the alignment fields of 
 the load/store nodes are trustworthy.
 
+//===---------------------------------------------------------------------===//
+
+Sometimes it is better to codegen subtractions from a constant (e.g. 7-x) with
+a neg instead of a sub instruction.  Consider:
+
+int test(char X) { return 7-X; }
+
+we currently produce:
+_test:
+        movl $7, %eax
+        movsbl 4(%esp), %ecx
+        subl %ecx, %eax
+        ret
 
+We would use one fewer register if codegen'd as:
+
+        movsbl 4(%esp), %eax
+       neg %eax
+        add $7, %eax
+        ret
+
+Note that this isn't beneficial if the load can be folded into the sub.  In
+this case, we want a sub:
+
+int test(int X) { return 7-X; }
+_test:
+        movl $7, %eax
+        subl 4(%esp), %eax
+        ret