mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
more notes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25890 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bda54cdd47
commit
4d7db40ab1
@ -313,3 +313,57 @@ bool %X(int %X) {
|
||||
|
||||
We need to lower switch statements to tablejumps when appropriate instead of
|
||||
always into binary branch trees.
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
SSE doesn't have [mem] op= reg instructions. If we have an SSE instruction
|
||||
like this:
|
||||
|
||||
X += y
|
||||
|
||||
and the register allocator decides to spill X, it is cheaper to emit this as:
|
||||
|
||||
Y += [xslot]
|
||||
store Y -> [xslot]
|
||||
|
||||
than as:
|
||||
|
||||
tmp = [xslot]
|
||||
tmp += y
|
||||
store tmp -> [xslot]
|
||||
|
||||
..and this uses one fewer register (so this should be done at load folding
|
||||
time, not at spiller time). *Note* however that this can only be done
|
||||
if Y is dead. Here's a testcase:
|
||||
|
||||
%.str_3 = external global [15 x sbyte] ; <[15 x sbyte]*> [#uses=0]
|
||||
implementation ; Functions:
|
||||
declare void %printf(int, ...)
|
||||
void %main() {
|
||||
build_tree.exit:
|
||||
br label %no_exit.i7
|
||||
no_exit.i7: ; preds = %no_exit.i7, %build_tree.exit
|
||||
%tmp.0.1.0.i9 = phi double [ 0.000000e+00, %build_tree.exit ], [ %tmp.34.i18, %no_exit.i7 ] ; <double> [#uses=1]
|
||||
%tmp.0.0.0.i10 = phi double [ 0.000000e+00, %build_tree.exit ], [ %tmp.28.i16, %no_exit.i7 ] ; <double> [#uses=1]
|
||||
%tmp.28.i16 = add double %tmp.0.0.0.i10, 0.000000e+00
|
||||
%tmp.34.i18 = add double %tmp.0.1.0.i9, 0.000000e+00
|
||||
br bool false, label %Compute_Tree.exit23, label %no_exit.i7
|
||||
Compute_Tree.exit23: ; preds = %no_exit.i7
|
||||
tail call void (int, ...)* %printf( int 0 )
|
||||
store double %tmp.34.i18, double* null
|
||||
ret void
|
||||
}
|
||||
|
||||
We currently emit:
|
||||
|
||||
.BBmain_1:
|
||||
xorpd %XMM1, %XMM1
|
||||
addsd %XMM0, %XMM1
|
||||
*** movsd %XMM2, QWORD PTR [%ESP + 8]
|
||||
*** addsd %XMM2, %XMM1
|
||||
*** movsd QWORD PTR [%ESP + 8], %XMM2
|
||||
jmp .BBmain_1 # no_exit.i7
|
||||
|
||||
This is a bugpoint reduced testcase, which is why the testcase doesn't make
|
||||
much sense (e.g. its an infinite loop). :)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user