mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
idiom recognition should catch this.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114304 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
702917d4e8
commit
313a94c3d0
@ -2,6 +2,38 @@ Target Independent Opportunities:
|
|||||||
|
|
||||||
//===---------------------------------------------------------------------===//
|
//===---------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
We should recognize idioms for add-with-carry and turn it into the appropriate
|
||||||
|
intrinsics. This example:
|
||||||
|
|
||||||
|
unsigned add32carry(unsigned sum, unsigned x) {
|
||||||
|
unsigned z = sum + x;
|
||||||
|
if (sum + x < x)
|
||||||
|
z++;
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
Compiles to: clang t.c -S -o - -O3 -fomit-frame-pointer -m64 -mkernel
|
||||||
|
|
||||||
|
_add32carry: ## @add32carry
|
||||||
|
addl %esi, %edi
|
||||||
|
cmpl %esi, %edi
|
||||||
|
sbbl %eax, %eax
|
||||||
|
andl $1, %eax
|
||||||
|
addl %edi, %eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
with clang, but to:
|
||||||
|
|
||||||
|
_add32carry:
|
||||||
|
leal (%rsi,%rdi), %eax
|
||||||
|
cmpl %esi, %eax
|
||||||
|
adcl $0, %eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
with gcc.
|
||||||
|
|
||||||
|
//===---------------------------------------------------------------------===//
|
||||||
|
|
||||||
Dead argument elimination should be enhanced to handle cases when an argument is
|
Dead argument elimination should be enhanced to handle cases when an argument is
|
||||||
dead to an externally visible function. Though the argument can't be removed
|
dead to an externally visible function. Though the argument can't be removed
|
||||||
from the externally visible function, the caller doesn't need to pass it in.
|
from the externally visible function, the caller doesn't need to pass it in.
|
||||||
|
Loading…
Reference in New Issue
Block a user