mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Add README entry; based on testcase from Bill Hart.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105878 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2dcf6d6019
commit
8c47d3b73f
@ -1863,3 +1863,47 @@ LLVM prefers comparisons with zero over non-zero in general, but in this
|
|||||||
case it choses instead to keep the max operation obvious.
|
case it choses instead to keep the max operation obvious.
|
||||||
|
|
||||||
//===---------------------------------------------------------------------===//
|
//===---------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
Take the following testcase on x86-64 (similar testcases exist for all targets
|
||||||
|
with addc/adde):
|
||||||
|
|
||||||
|
define void @a(i64* nocapture %s, i64* nocapture %t, i64 %a, i64 %b,
|
||||||
|
i64 %c) nounwind {
|
||||||
|
entry:
|
||||||
|
%0 = zext i64 %a to i128 ; <i128> [#uses=1]
|
||||||
|
%1 = zext i64 %b to i128 ; <i128> [#uses=1]
|
||||||
|
%2 = add i128 %1, %0 ; <i128> [#uses=2]
|
||||||
|
%3 = zext i64 %c to i128 ; <i128> [#uses=1]
|
||||||
|
%4 = shl i128 %3, 64 ; <i128> [#uses=1]
|
||||||
|
%5 = add i128 %4, %2 ; <i128> [#uses=1]
|
||||||
|
%6 = lshr i128 %5, 64 ; <i128> [#uses=1]
|
||||||
|
%7 = trunc i128 %6 to i64 ; <i64> [#uses=1]
|
||||||
|
store i64 %7, i64* %s, align 8
|
||||||
|
%8 = trunc i128 %2 to i64 ; <i64> [#uses=1]
|
||||||
|
store i64 %8, i64* %t, align 8
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
Generated code:
|
||||||
|
addq %rcx, %rdx
|
||||||
|
movl $0, %eax
|
||||||
|
adcq $0, %rax
|
||||||
|
addq %r8, %rax
|
||||||
|
movq %rax, (%rdi)
|
||||||
|
movq %rdx, (%rsi)
|
||||||
|
ret
|
||||||
|
|
||||||
|
Expected code:
|
||||||
|
addq %rcx, %rdx
|
||||||
|
adcq $0, %r8
|
||||||
|
movq %r8, (%rdi)
|
||||||
|
movq %rdx, (%rsi)
|
||||||
|
ret
|
||||||
|
|
||||||
|
The generated SelectionDAG has an ADD of an ADDE, where both operands of the
|
||||||
|
ADDE are zero. Replacing one of the operands of the ADDE with the other operand
|
||||||
|
of the ADD, and replacing the ADD with the ADDE, should give the desired result.
|
||||||
|
|
||||||
|
(That said, we are doing a lot better than gcc on this testcase. :) )
|
||||||
|
|
||||||
|
//===---------------------------------------------------------------------===//
|
||||||
|
Loading…
Reference in New Issue
Block a user