mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-10-11 12:23:45 +00:00
Added test for lda #>0 / lda #<0.
This commit is contained in:
parent
d1d6724e0b
commit
7d08159fb2
24
src/main/java/dk/camelot64/kickc/test/ref/immzero.asm
Normal file
24
src/main/java/dk/camelot64/kickc/test/ref/immzero.asm
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
jsr main
|
||||||
|
main: {
|
||||||
|
.label w = 2
|
||||||
|
lda #<0
|
||||||
|
sta w
|
||||||
|
lda #>0
|
||||||
|
sta w+1
|
||||||
|
ldx #0
|
||||||
|
b1:
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc w
|
||||||
|
sta w
|
||||||
|
bcc !+
|
||||||
|
inc w+1
|
||||||
|
!:
|
||||||
|
inx
|
||||||
|
cpx #$b
|
||||||
|
bne b1
|
||||||
|
rts
|
||||||
|
}
|
19
src/main/java/dk/camelot64/kickc/test/ref/immzero.cfg
Normal file
19
src/main/java/dk/camelot64/kickc/test/ref/immzero.cfg
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[0] call main param-assignment [ ] ( )
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[1] phi() [ ] ( main:0 [ ] )
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
[2] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word) 0 main::@1/(word) main::w#1 ) [ main::i#1 main::w#2 ] ( main:0 [ main::i#1 main::w#2 ] )
|
||||||
|
[2] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::j#1 ) [ main::i#1 main::w#2 ] ( main:0 [ main::i#1 main::w#2 ] )
|
||||||
|
[3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] )
|
||||||
|
[4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] )
|
||||||
|
[5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] )
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
[6] return [ ] ( main:0 [ ] )
|
||||||
|
to:@return
|
857
src/main/java/dk/camelot64/kickc/test/ref/immzero.log
Normal file
857
src/main/java/dk/camelot64/kickc/test/ref/immzero.log
Normal file
@ -0,0 +1,857 @@
|
|||||||
|
// Tests that immediate zero values are reused - even when assigning to words
|
||||||
|
void main() {
|
||||||
|
byte i = 0;
|
||||||
|
word w = (word)0;
|
||||||
|
for ( byte j : 0..10) {
|
||||||
|
i = j;
|
||||||
|
w = w + j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PROGRAM
|
||||||
|
proc (void()) main()
|
||||||
|
(byte) main::i ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word~) main::$0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w ← (word~) main::$0
|
||||||
|
(byte) main::j ← (byte/signed byte/word/signed word) 0
|
||||||
|
main::@1:
|
||||||
|
(byte) main::i ← (byte) main::j
|
||||||
|
(word~) main::$1 ← (word) main::w + (byte) main::j
|
||||||
|
(word) main::w ← (word~) main::$1
|
||||||
|
(byte) main::j ← ++ (byte) main::j
|
||||||
|
(boolean~) main::$2 ← (byte) main::j != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
main::@return:
|
||||||
|
return
|
||||||
|
endproc // main()
|
||||||
|
call main
|
||||||
|
|
||||||
|
SYMBOLS
|
||||||
|
(void()) main()
|
||||||
|
(word~) main::$0
|
||||||
|
(word~) main::$1
|
||||||
|
(boolean~) main::$2
|
||||||
|
(label) main::@1
|
||||||
|
(label) main::@return
|
||||||
|
(byte) main::i
|
||||||
|
(byte) main::j
|
||||||
|
(word) main::w
|
||||||
|
|
||||||
|
INITIAL CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from
|
||||||
|
(byte) main::i ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word~) main::$0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w ← (word~) main::$0
|
||||||
|
(byte) main::j ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(byte) main::i ← (byte) main::j
|
||||||
|
(word~) main::$1 ← (word) main::w + (byte) main::j
|
||||||
|
(word) main::w ← (word~) main::$1
|
||||||
|
(byte) main::j ← ++ (byte) main::j
|
||||||
|
(boolean~) main::$2 ← (byte) main::j != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
to:main::@2
|
||||||
|
main::@2: scope:[main] from main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@2
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
Removing empty block main::@2
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from
|
||||||
|
(byte) main::i ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word~) main::$0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w ← (word~) main::$0
|
||||||
|
(byte) main::j ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(byte) main::i ← (byte) main::j
|
||||||
|
(word~) main::$1 ← (word) main::w + (byte) main::j
|
||||||
|
(word) main::w ← (word~) main::$1
|
||||||
|
(byte) main::j ← ++ (byte) main::j
|
||||||
|
(boolean~) main::$2 ← (byte) main::j != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
PROCEDURE MODIFY VARIABLE ANALYSIS
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
(byte) main::i ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word~) main::$0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w ← (word~) main::$0
|
||||||
|
(byte) main::j ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(byte) main::i ← (byte) main::j
|
||||||
|
(word~) main::$1 ← (word) main::w + (byte) main::j
|
||||||
|
(word) main::w ← (word~) main::$1
|
||||||
|
(byte) main::j ← ++ (byte) main::j
|
||||||
|
(boolean~) main::$2 ← (byte) main::j != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
Completing Phi functions...
|
||||||
|
CONTROL FLOW GRAPH SSA
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word~) main::$0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w#0 ← (word~) main::$0
|
||||||
|
(byte) main::j#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
|
||||||
|
(byte) main::j#2 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 )
|
||||||
|
(byte) main::i#1 ← (byte) main::j#2
|
||||||
|
(word~) main::$1 ← (word) main::w#2 + (byte) main::j#2
|
||||||
|
(word) main::w#1 ← (word~) main::$1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::j#2
|
||||||
|
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word~) main::$0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w#0 ← (word~) main::$0
|
||||||
|
(byte) main::j#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
|
||||||
|
(byte) main::j#2 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 )
|
||||||
|
(byte) main::i#1 ← (byte) main::j#2
|
||||||
|
(word~) main::$1 ← (word) main::w#2 + (byte) main::j#2
|
||||||
|
(word) main::w#1 ← (word~) main::$1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::j#2
|
||||||
|
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@2
|
||||||
|
@2: scope:[] from @1
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @2
|
||||||
|
|
||||||
|
INITIAL SSA SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @2
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(word~) main::$0
|
||||||
|
(word~) main::$1
|
||||||
|
(boolean~) main::$2
|
||||||
|
(label) main::@1
|
||||||
|
(label) main::@return
|
||||||
|
(byte) main::i
|
||||||
|
(byte) main::i#0
|
||||||
|
(byte) main::i#1
|
||||||
|
(byte) main::j
|
||||||
|
(byte) main::j#0
|
||||||
|
(byte) main::j#1
|
||||||
|
(byte) main::j#2
|
||||||
|
(word) main::w
|
||||||
|
(word) main::w#0
|
||||||
|
(word) main::w#1
|
||||||
|
(word) main::w#2
|
||||||
|
|
||||||
|
Culled Empty Block (label) @2
|
||||||
|
Succesful SSA optimization Pass2CullEmptyBlocks
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word~) main::$0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w#0 ← (word~) main::$0
|
||||||
|
(byte) main::j#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
|
||||||
|
(byte) main::j#2 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 )
|
||||||
|
(byte) main::i#1 ← (byte) main::j#2
|
||||||
|
(word~) main::$1 ← (word) main::w#2 + (byte) main::j#2
|
||||||
|
(word) main::w#1 ← (word~) main::$1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::j#2
|
||||||
|
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
Alias (word) main::w#0 = (word~) main::$0
|
||||||
|
Alias (byte) main::i#1 = (byte) main::j#2
|
||||||
|
Alias (word) main::w#1 = (word~) main::$1
|
||||||
|
Succesful SSA optimization Pass2AliasElimination
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w#0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) main::j#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
|
||||||
|
(byte) main::i#1 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 )
|
||||||
|
(word) main::w#1 ← (word) main::w#2 + (byte) main::i#1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::i#1
|
||||||
|
(boolean~) main::$2 ← (byte) main::j#1 != (byte/signed byte/word/signed word) 11
|
||||||
|
if((boolean~) main::$2) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
Simple Condition (boolean~) main::$2 if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1
|
||||||
|
Succesful SSA optimization Pass2ConditionalJumpSimplification
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
(byte) main::i#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
(word) main::w#0 ← ((word)) (byte/signed byte/word/signed word) 0
|
||||||
|
(byte) main::j#0 ← (byte/signed byte/word/signed word) 0
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(word) main::w#2 ← phi( main/(word) main::w#0 main::@1/(word) main::w#1 )
|
||||||
|
(byte) main::i#1 ← phi( main/(byte) main::j#0 main::@1/(byte) main::j#1 )
|
||||||
|
(word) main::w#1 ← (word) main::w#2 + (byte) main::i#1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::i#1
|
||||||
|
if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
Constant (const byte) main::i#0 = 0
|
||||||
|
Constant (const word) main::w#0 = ((word))0
|
||||||
|
Constant (const byte) main::j#0 = 0
|
||||||
|
Succesful SSA optimization Pass2ConstantIdentification
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(word) main::w#2 ← phi( main/(const word) main::w#0 main::@1/(word) main::w#1 )
|
||||||
|
(byte) main::i#1 ← phi( main/(const byte) main::j#0 main::@1/(byte) main::j#1 )
|
||||||
|
(word) main::w#1 ← (word) main::w#2 + (byte) main::i#1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::i#1
|
||||||
|
if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
Inlining constant with var siblings (const byte) main::i#0
|
||||||
|
Inlining constant with var siblings (const word) main::w#0
|
||||||
|
Inlining constant with var siblings (const word) main::w#0
|
||||||
|
Inlining constant with var siblings (const byte) main::j#0
|
||||||
|
Constant inlined main::i#0 = (byte/signed byte/word/signed word) 0
|
||||||
|
Constant inlined main::j#0 = (byte/signed byte/word/signed word) 0
|
||||||
|
Constant inlined main::w#0 = ((word))(byte/signed byte/word/signed word) 0
|
||||||
|
Succesful SSA optimization Pass2ConstantInlining
|
||||||
|
CONTROL FLOW GRAPH
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
(word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word) 0 main::@1/(word) main::w#1 )
|
||||||
|
(byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::j#1 )
|
||||||
|
(word) main::w#1 ← (word) main::w#2 + (byte) main::i#1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::i#1
|
||||||
|
if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
|
||||||
|
FINAL SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@1
|
||||||
|
(label) main::@return
|
||||||
|
(byte) main::i
|
||||||
|
(byte) main::i#1
|
||||||
|
(byte) main::j
|
||||||
|
(byte) main::j#1
|
||||||
|
(word) main::w
|
||||||
|
(word) main::w#1
|
||||||
|
(word) main::w#2
|
||||||
|
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@1 main::@return
|
||||||
|
Added new block during phi lifting main::@3(between main::@1 and main::@1)
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@1 main::@return main::@3
|
||||||
|
CONTROL FLOW GRAPH - PHI LIFTED
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
call main param-assignment
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@3
|
||||||
|
(word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word) 0 main::@3/(word~) main::w#3 )
|
||||||
|
(byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::j#3 )
|
||||||
|
(word) main::w#1 ← (word) main::w#2 + (byte) main::i#1
|
||||||
|
(byte) main::j#1 ← ++ (byte) main::i#1
|
||||||
|
if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@3
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
return
|
||||||
|
to:@return
|
||||||
|
main::@3: scope:[main] from main::@1
|
||||||
|
(byte~) main::j#3 ← (byte) main::j#1
|
||||||
|
(word~) main::w#3 ← (word) main::w#1
|
||||||
|
to:main::@1
|
||||||
|
|
||||||
|
Adding NOP phi() at start of main
|
||||||
|
CALL GRAPH
|
||||||
|
Calls in [] to main:0
|
||||||
|
|
||||||
|
Propagating live ranges...
|
||||||
|
Propagating live ranges...
|
||||||
|
Propagating live ranges...
|
||||||
|
Propagating live ranges...
|
||||||
|
Propagating live ranges...
|
||||||
|
CONTROL FLOW GRAPH - LIVE RANGES FOUND
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[0] call main param-assignment [ ]
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[1] phi() [ ]
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@3
|
||||||
|
[2] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word) 0 main::@3/(word~) main::w#3 ) [ main::i#1 main::w#2 ]
|
||||||
|
[2] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word) 0 main::@3/(byte~) main::j#3 ) [ main::i#1 main::w#2 ]
|
||||||
|
[3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ]
|
||||||
|
[4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::w#1 main::j#1 ]
|
||||||
|
[5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@3 [ main::w#1 main::j#1 ]
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
[6] return [ ]
|
||||||
|
to:@return
|
||||||
|
main::@3: scope:[main] from main::@1
|
||||||
|
[7] (byte~) main::j#3 ← (byte) main::j#1 [ main::j#3 main::w#1 ]
|
||||||
|
[8] (word~) main::w#3 ← (word) main::w#1 [ main::j#3 main::w#3 ]
|
||||||
|
to:main::@1
|
||||||
|
|
||||||
|
Created 2 initial phi equivalence classes
|
||||||
|
Coalesced [7] main::j#3 ← main::j#1
|
||||||
|
Coalesced [8] main::w#3 ← main::w#1
|
||||||
|
Coalesced down to 2 phi equivalence classes
|
||||||
|
Culled Empty Block (label) main::@3
|
||||||
|
Block Sequence Planned @begin @1 @end main main::@1 main::@return
|
||||||
|
Adding NOP phi() at start of main
|
||||||
|
Propagating live ranges...
|
||||||
|
Propagating live ranges...
|
||||||
|
Propagating live ranges...
|
||||||
|
CONTROL FLOW GRAPH - BEFORE EFFECTIVE LIVE RANGES
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[0] call main param-assignment [ ]
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[1] phi() [ ]
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
[2] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word) 0 main::@1/(word) main::w#1 ) [ main::i#1 main::w#2 ]
|
||||||
|
[2] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::j#1 ) [ main::i#1 main::w#2 ]
|
||||||
|
[3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ]
|
||||||
|
[4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ]
|
||||||
|
[5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ]
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
[6] return [ ]
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
CONTROL FLOW GRAPH - PHI MEM COALESCED
|
||||||
|
@begin: scope:[] from
|
||||||
|
to:@1
|
||||||
|
@1: scope:[] from @begin
|
||||||
|
[0] call main param-assignment [ ] ( )
|
||||||
|
to:@end
|
||||||
|
@end: scope:[] from @1
|
||||||
|
main: scope:[main] from @1
|
||||||
|
[1] phi() [ ] ( main:0 [ ] )
|
||||||
|
to:main::@1
|
||||||
|
main::@1: scope:[main] from main main::@1
|
||||||
|
[2] (word) main::w#2 ← phi( main/((word))(byte/signed byte/word/signed word) 0 main::@1/(word) main::w#1 ) [ main::i#1 main::w#2 ] ( main:0 [ main::i#1 main::w#2 ] )
|
||||||
|
[2] (byte) main::i#1 ← phi( main/(byte/signed byte/word/signed word) 0 main::@1/(byte) main::j#1 ) [ main::i#1 main::w#2 ] ( main:0 [ main::i#1 main::w#2 ] )
|
||||||
|
[3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] )
|
||||||
|
[4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] )
|
||||||
|
[5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] )
|
||||||
|
to:main::@return
|
||||||
|
main::@return: scope:[main] from main::@1
|
||||||
|
[6] return [ ] ( main:0 [ ] )
|
||||||
|
to:@return
|
||||||
|
|
||||||
|
DOMINATORS
|
||||||
|
@begin dominated by @begin
|
||||||
|
@1 dominated by @1 @begin
|
||||||
|
@end dominated by @1 @begin @end
|
||||||
|
main dominated by @1 @begin main
|
||||||
|
main::@1 dominated by @1 @begin main::@1 main
|
||||||
|
main::@return dominated by main::@return @1 @begin main::@1 main
|
||||||
|
|
||||||
|
Found back edge: Loop head: main::@1 tails: main::@1 blocks: null
|
||||||
|
Populated: Loop head: main::@1 tails: main::@1 blocks: main::@1
|
||||||
|
NATURAL LOOPS
|
||||||
|
Loop head: main::@1 tails: main::@1 blocks: main::@1
|
||||||
|
|
||||||
|
Found 0 loops in scope []
|
||||||
|
Found 1 loops in scope [main]
|
||||||
|
Loop head: main::@1 tails: main::@1 blocks: main::@1
|
||||||
|
NATURAL LOOPS WITH DEPTH
|
||||||
|
Loop head: main::@1 tails: main::@1 blocks: main::@1 depth: 1
|
||||||
|
|
||||||
|
|
||||||
|
VARIABLE REGISTER WEIGHTS
|
||||||
|
(void()) main()
|
||||||
|
(byte) main::i
|
||||||
|
(byte) main::i#1 16.5
|
||||||
|
(byte) main::j
|
||||||
|
(byte) main::j#1 16.5
|
||||||
|
(word) main::w
|
||||||
|
(word) main::w#1 7.333333333333333
|
||||||
|
(word) main::w#2 22.0
|
||||||
|
|
||||||
|
Initial phi equivalence classes
|
||||||
|
[ main::i#1 main::j#1 ]
|
||||||
|
[ main::w#2 main::w#1 ]
|
||||||
|
Complete equivalence classes
|
||||||
|
[ main::i#1 main::j#1 ]
|
||||||
|
[ main::w#2 main::w#1 ]
|
||||||
|
Allocated zp ZP_BYTE:2 [ main::i#1 main::j#1 ]
|
||||||
|
Allocated zp ZP_WORD:3 [ main::w#2 main::w#1 ]
|
||||||
|
INITIAL ASM
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
bbegin:
|
||||||
|
jmp b1
|
||||||
|
//SEG3 @1
|
||||||
|
b1:
|
||||||
|
//SEG4 [0] call main param-assignment [ ] ( )
|
||||||
|
//SEG5 [1] phi from @1 to main [phi:@1->main]
|
||||||
|
main_from_b1:
|
||||||
|
jsr main
|
||||||
|
jmp bend
|
||||||
|
//SEG6 @end
|
||||||
|
bend:
|
||||||
|
//SEG7 main
|
||||||
|
main: {
|
||||||
|
.label i = 2
|
||||||
|
.label w = 3
|
||||||
|
.label j = 2
|
||||||
|
//SEG8 [2] phi from main to main::@1 [phi:main->main::@1]
|
||||||
|
b1_from_main:
|
||||||
|
//SEG9 [2] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- zpwo1=cowo1
|
||||||
|
lda #<0
|
||||||
|
sta w
|
||||||
|
lda #>0
|
||||||
|
sta w+1
|
||||||
|
//SEG10 [2] phi (byte) main::i#1 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#1] -- zpby1=coby1
|
||||||
|
lda #0
|
||||||
|
sta i
|
||||||
|
jmp b1
|
||||||
|
//SEG11 [2] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||||
|
b1_from_b1:
|
||||||
|
//SEG12 [2] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||||
|
//SEG13 [2] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||||
|
jmp b1
|
||||||
|
//SEG14 main::@1
|
||||||
|
b1:
|
||||||
|
//SEG15 [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) -- zpwo1=zpwo1_plus_zpby1
|
||||||
|
lda i
|
||||||
|
clc
|
||||||
|
adc w
|
||||||
|
sta w
|
||||||
|
bcc !+
|
||||||
|
inc w+1
|
||||||
|
!:
|
||||||
|
//SEG16 [4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- zpby1=_inc_zpby1
|
||||||
|
inc j
|
||||||
|
//SEG17 [5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- zpby1_neq_coby1_then_la1
|
||||||
|
lda j
|
||||||
|
cmp #$b
|
||||||
|
bne b1_from_b1
|
||||||
|
jmp breturn
|
||||||
|
//SEG18 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG19 [6] return [ ] ( main:0 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||||
|
Statement [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) always clobbers reg byte a
|
||||||
|
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#1 main::j#1 ]
|
||||||
|
Statement [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) always clobbers reg byte a
|
||||||
|
Potential registers zp ZP_BYTE:2 [ main::i#1 main::j#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y ,
|
||||||
|
Potential registers zp ZP_WORD:3 [ main::w#2 main::w#1 ] : zp ZP_WORD:3 ,
|
||||||
|
|
||||||
|
REGISTER UPLIFT SCOPES
|
||||||
|
Uplift Scope [main] 33: zp ZP_BYTE:2 [ main::i#1 main::j#1 ] 29.33: zp ZP_WORD:3 [ main::w#2 main::w#1 ]
|
||||||
|
Uplift Scope []
|
||||||
|
|
||||||
|
Uplifting [main] best 515 combination reg byte x [ main::i#1 main::j#1 ] zp ZP_WORD:3 [ main::w#2 main::w#1 ]
|
||||||
|
Uplifting [] best 515 combination
|
||||||
|
Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ main::w#2 main::w#1 ]
|
||||||
|
Removing instruction jmp b1
|
||||||
|
Removing instruction jmp bend
|
||||||
|
Removing instruction jmp b1
|
||||||
|
Removing instruction jmp breturn
|
||||||
|
Succesful ASM optimization Pass5NextJumpElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
bbegin:
|
||||||
|
//SEG3 @1
|
||||||
|
b1:
|
||||||
|
//SEG4 [0] call main param-assignment [ ] ( )
|
||||||
|
//SEG5 [1] phi from @1 to main [phi:@1->main]
|
||||||
|
main_from_b1:
|
||||||
|
jsr main
|
||||||
|
//SEG6 @end
|
||||||
|
bend:
|
||||||
|
//SEG7 main
|
||||||
|
main: {
|
||||||
|
.label w = 2
|
||||||
|
//SEG8 [2] phi from main to main::@1 [phi:main->main::@1]
|
||||||
|
b1_from_main:
|
||||||
|
//SEG9 [2] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- zpwo1=cowo1
|
||||||
|
lda #<0
|
||||||
|
sta w
|
||||||
|
lda #>0
|
||||||
|
sta w+1
|
||||||
|
//SEG10 [2] phi (byte) main::i#1 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#1] -- xby=coby1
|
||||||
|
ldx #0
|
||||||
|
jmp b1
|
||||||
|
//SEG11 [2] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||||
|
b1_from_b1:
|
||||||
|
//SEG12 [2] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||||
|
//SEG13 [2] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||||
|
//SEG14 main::@1
|
||||||
|
b1:
|
||||||
|
//SEG15 [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) -- zpwo1=zpwo1_plus_xby
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc w
|
||||||
|
sta w
|
||||||
|
bcc !+
|
||||||
|
inc w+1
|
||||||
|
!:
|
||||||
|
//SEG16 [4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby=_inc_xby
|
||||||
|
inx
|
||||||
|
//SEG17 [5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby_neq_coby1_then_la1
|
||||||
|
cpx #$b
|
||||||
|
bne b1_from_b1
|
||||||
|
//SEG18 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG19 [6] return [ ] ( main:0 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
Replacing label b1_from_b1 with b1
|
||||||
|
Removing instruction bbegin:
|
||||||
|
Removing instruction main_from_b1:
|
||||||
|
Removing instruction b1_from_b1:
|
||||||
|
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 @1
|
||||||
|
b1:
|
||||||
|
//SEG4 [0] call main param-assignment [ ] ( )
|
||||||
|
//SEG5 [1] phi from @1 to main [phi:@1->main]
|
||||||
|
jsr main
|
||||||
|
//SEG6 @end
|
||||||
|
bend:
|
||||||
|
//SEG7 main
|
||||||
|
main: {
|
||||||
|
.label w = 2
|
||||||
|
//SEG8 [2] phi from main to main::@1 [phi:main->main::@1]
|
||||||
|
b1_from_main:
|
||||||
|
//SEG9 [2] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- zpwo1=cowo1
|
||||||
|
lda #<0
|
||||||
|
sta w
|
||||||
|
lda #>0
|
||||||
|
sta w+1
|
||||||
|
//SEG10 [2] phi (byte) main::i#1 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#1] -- xby=coby1
|
||||||
|
ldx #0
|
||||||
|
jmp b1
|
||||||
|
//SEG11 [2] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||||
|
//SEG12 [2] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||||
|
//SEG13 [2] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||||
|
//SEG14 main::@1
|
||||||
|
b1:
|
||||||
|
//SEG15 [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) -- zpwo1=zpwo1_plus_xby
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc w
|
||||||
|
sta w
|
||||||
|
bcc !+
|
||||||
|
inc w+1
|
||||||
|
!:
|
||||||
|
//SEG16 [4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby=_inc_xby
|
||||||
|
inx
|
||||||
|
//SEG17 [5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby_neq_coby1_then_la1
|
||||||
|
cpx #$b
|
||||||
|
bne b1
|
||||||
|
//SEG18 main::@return
|
||||||
|
breturn:
|
||||||
|
//SEG19 [6] return [ ] ( main:0 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
Removing instruction b1:
|
||||||
|
Removing instruction bend:
|
||||||
|
Removing instruction b1_from_main:
|
||||||
|
Removing instruction breturn:
|
||||||
|
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 @1
|
||||||
|
//SEG4 [0] call main param-assignment [ ] ( )
|
||||||
|
//SEG5 [1] phi from @1 to main [phi:@1->main]
|
||||||
|
jsr main
|
||||||
|
//SEG6 @end
|
||||||
|
//SEG7 main
|
||||||
|
main: {
|
||||||
|
.label w = 2
|
||||||
|
//SEG8 [2] phi from main to main::@1 [phi:main->main::@1]
|
||||||
|
//SEG9 [2] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- zpwo1=cowo1
|
||||||
|
lda #<0
|
||||||
|
sta w
|
||||||
|
lda #>0
|
||||||
|
sta w+1
|
||||||
|
//SEG10 [2] phi (byte) main::i#1 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#1] -- xby=coby1
|
||||||
|
ldx #0
|
||||||
|
jmp b1
|
||||||
|
//SEG11 [2] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||||
|
//SEG12 [2] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||||
|
//SEG13 [2] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||||
|
//SEG14 main::@1
|
||||||
|
b1:
|
||||||
|
//SEG15 [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) -- zpwo1=zpwo1_plus_xby
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc w
|
||||||
|
sta w
|
||||||
|
bcc !+
|
||||||
|
inc w+1
|
||||||
|
!:
|
||||||
|
//SEG16 [4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby=_inc_xby
|
||||||
|
inx
|
||||||
|
//SEG17 [5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby_neq_coby1_then_la1
|
||||||
|
cpx #$b
|
||||||
|
bne b1
|
||||||
|
//SEG18 main::@return
|
||||||
|
//SEG19 [6] return [ ] ( main:0 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
Removing instruction jmp b1
|
||||||
|
Succesful ASM optimization Pass5NextJumpElimination
|
||||||
|
ASSEMBLER
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 @1
|
||||||
|
//SEG4 [0] call main param-assignment [ ] ( )
|
||||||
|
//SEG5 [1] phi from @1 to main [phi:@1->main]
|
||||||
|
jsr main
|
||||||
|
//SEG6 @end
|
||||||
|
//SEG7 main
|
||||||
|
main: {
|
||||||
|
.label w = 2
|
||||||
|
//SEG8 [2] phi from main to main::@1 [phi:main->main::@1]
|
||||||
|
//SEG9 [2] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- zpwo1=cowo1
|
||||||
|
lda #<0
|
||||||
|
sta w
|
||||||
|
lda #>0
|
||||||
|
sta w+1
|
||||||
|
//SEG10 [2] phi (byte) main::i#1 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#1] -- xby=coby1
|
||||||
|
ldx #0
|
||||||
|
//SEG11 [2] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||||
|
//SEG12 [2] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||||
|
//SEG13 [2] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||||
|
//SEG14 main::@1
|
||||||
|
b1:
|
||||||
|
//SEG15 [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) -- zpwo1=zpwo1_plus_xby
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc w
|
||||||
|
sta w
|
||||||
|
bcc !+
|
||||||
|
inc w+1
|
||||||
|
!:
|
||||||
|
//SEG16 [4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby=_inc_xby
|
||||||
|
inx
|
||||||
|
//SEG17 [5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby_neq_coby1_then_la1
|
||||||
|
cpx #$b
|
||||||
|
bne b1
|
||||||
|
//SEG18 main::@return
|
||||||
|
//SEG19 [6] return [ ] ( main:0 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
||||||
|
FINAL SYMBOL TABLE
|
||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@1
|
||||||
|
(label) main::@return
|
||||||
|
(byte) main::i
|
||||||
|
(byte) main::i#1 reg byte x 16.5
|
||||||
|
(byte) main::j
|
||||||
|
(byte) main::j#1 reg byte x 16.5
|
||||||
|
(word) main::w
|
||||||
|
(word) main::w#1 w zp ZP_WORD:2 7.333333333333333
|
||||||
|
(word) main::w#2 w zp ZP_WORD:2 22.0
|
||||||
|
|
||||||
|
reg byte x [ main::i#1 main::j#1 ]
|
||||||
|
zp ZP_WORD:2 [ main::w#2 main::w#1 ]
|
||||||
|
|
||||||
|
FINAL CODE
|
||||||
|
//SEG0 Basic Upstart
|
||||||
|
.pc = $801 "Basic"
|
||||||
|
:BasicUpstart(main)
|
||||||
|
.pc = $80d "Program"
|
||||||
|
//SEG1 Global Constants & labels
|
||||||
|
//SEG2 @begin
|
||||||
|
//SEG3 @1
|
||||||
|
//SEG4 [0] call main param-assignment [ ] ( )
|
||||||
|
//SEG5 [1] phi from @1 to main [phi:@1->main]
|
||||||
|
jsr main
|
||||||
|
//SEG6 @end
|
||||||
|
//SEG7 main
|
||||||
|
main: {
|
||||||
|
.label w = 2
|
||||||
|
//SEG8 [2] phi from main to main::@1 [phi:main->main::@1]
|
||||||
|
//SEG9 [2] phi (word) main::w#2 = ((word))(byte/signed byte/word/signed word) 0 [phi:main->main::@1#0] -- zpwo1=cowo1
|
||||||
|
lda #<0
|
||||||
|
sta w
|
||||||
|
lda #>0
|
||||||
|
sta w+1
|
||||||
|
//SEG10 [2] phi (byte) main::i#1 = (byte/signed byte/word/signed word) 0 [phi:main->main::@1#1] -- xby=coby1
|
||||||
|
ldx #0
|
||||||
|
//SEG11 [2] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||||
|
//SEG12 [2] phi (word) main::w#2 = (word) main::w#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||||
|
//SEG13 [2] phi (byte) main::i#1 = (byte) main::j#1 [phi:main::@1->main::@1#1] -- register_copy
|
||||||
|
//SEG14 main::@1
|
||||||
|
b1:
|
||||||
|
//SEG15 [3] (word) main::w#1 ← (word) main::w#2 + (byte) main::i#1 [ main::i#1 main::w#1 ] ( main:0 [ main::i#1 main::w#1 ] ) -- zpwo1=zpwo1_plus_xby
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc w
|
||||||
|
sta w
|
||||||
|
bcc !+
|
||||||
|
inc w+1
|
||||||
|
!:
|
||||||
|
//SEG16 [4] (byte) main::j#1 ← ++ (byte) main::i#1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby=_inc_xby
|
||||||
|
inx
|
||||||
|
//SEG17 [5] if((byte) main::j#1!=(byte/signed byte/word/signed word) 11) goto main::@1 [ main::j#1 main::w#1 ] ( main:0 [ main::j#1 main::w#1 ] ) -- xby_neq_coby1_then_la1
|
||||||
|
cpx #$b
|
||||||
|
bne b1
|
||||||
|
//SEG18 main::@return
|
||||||
|
//SEG19 [6] return [ ] ( main:0 [ ] )
|
||||||
|
rts
|
||||||
|
}
|
||||||
|
|
16
src/main/java/dk/camelot64/kickc/test/ref/immzero.sym
Normal file
16
src/main/java/dk/camelot64/kickc/test/ref/immzero.sym
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
(label) @1
|
||||||
|
(label) @begin
|
||||||
|
(label) @end
|
||||||
|
(void()) main()
|
||||||
|
(label) main::@1
|
||||||
|
(label) main::@return
|
||||||
|
(byte) main::i
|
||||||
|
(byte) main::i#1 reg byte x 16.5
|
||||||
|
(byte) main::j
|
||||||
|
(byte) main::j#1 reg byte x 16.5
|
||||||
|
(word) main::w
|
||||||
|
(word) main::w#1 w zp ZP_WORD:2 7.333333333333333
|
||||||
|
(word) main::w#2 w zp ZP_WORD:2 22.0
|
||||||
|
|
||||||
|
reg byte x [ main::i#1 main::j#1 ]
|
||||||
|
zp ZP_WORD:2 [ main::w#2 main::w#1 ]
|
Loading…
Reference in New Issue
Block a user