mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-04-08 14:37:40 +00:00
Updated remaining ref files.
This commit is contained in:
parent
9c9a39f109
commit
64d2d99488
8
src/test/ref/address-8.cfg
Normal file
8
src/test/ref/address-8.cfg
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] *((const nomodify byte*) SCREEN) ← *((const byte*) DATA)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
175
src/test/ref/address-8.log
Normal file
175
src/test/ref/address-8.log
Normal file
@ -0,0 +1,175 @@
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start
|
||||
*((const nomodify byte*) SCREEN + (number) 0) ← *((const byte*) DATA + (number) 0)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
call main
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
(const byte*) DATA[(number) $3e8] = { fill( $3e8, 0) }
|
||||
(const nomodify byte*) SCREEN = (byte*)(number) $400
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@return
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
||||
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) SCREEN + (number) 0) ← *((const byte*) DATA + (number) 0)
|
||||
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) SCREEN + (number) 0) ← *((const byte*) DATA + (unumber)(number) 0)
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant pointer cast (byte*) 1024
|
||||
Simplifying constant integer cast 0
|
||||
Simplifying constant integer cast 0
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (byte) 0
|
||||
Finalized unsigned number type (byte) 0
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Simplifying expression containing zero DATA in [0] *((const nomodify byte*) SCREEN + (byte) 0) ← *((const byte*) DATA + (byte) 0)
|
||||
Simplifying expression containing zero SCREEN in [0] *((const nomodify byte*) SCREEN + (byte) 0) ← *((const byte*) DATA)
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Removing unused procedure _start
|
||||
Removing unused procedure block _start
|
||||
Removing unused procedure block _start::@1
|
||||
Removing unused procedure block _start::@return
|
||||
Successful SSA optimization PassNEliminateEmptyStart
|
||||
CALL GRAPH
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] *((const nomodify byte*) SCREEN) ← *((const byte*) DATA)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) main()
|
||||
|
||||
Initial phi equivalence classes
|
||||
Complete equivalence classes
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
// File Comments
|
||||
// Test declaring an array variable as at a hard-coded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// [0] *((const nomodify byte*) SCREEN) ← *((const byte*) DATA) -- _deref_pbuc1=_deref_pbuc2
|
||||
lda DATA
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "DATA"
|
||||
// Data to be put on the screen
|
||||
DATA: .fill $3e8, 0
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [0] *((const nomodify byte*) SCREEN) ← *((const byte*) DATA) [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [main] best 17 combination
|
||||
Uplifting [] best 17 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test declaring an array variable as at a hard-coded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// [0] *((const nomodify byte*) SCREEN) ← *((const byte*) DATA) -- _deref_pbuc1=_deref_pbuc2
|
||||
lda DATA
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "DATA"
|
||||
// Data to be put on the screen
|
||||
DATA: .fill $3e8, 0
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(const byte*) DATA[(number) $3e8] = { fill( $3e8, 0) }
|
||||
(const nomodify byte*) SCREEN = (byte*) 1024
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 14
|
||||
|
||||
// File Comments
|
||||
// Test declaring an array variable as at a hard-coded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// SCREEN[0] = DATA[0]
|
||||
// [0] *((const nomodify byte*) SCREEN) ← *((const byte*) DATA) -- _deref_pbuc1=_deref_pbuc2
|
||||
lda DATA
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "DATA"
|
||||
// Data to be put on the screen
|
||||
DATA: .fill $3e8, 0
|
||||
|
5
src/test/ref/address-8.sym
Normal file
5
src/test/ref/address-8.sym
Normal file
@ -0,0 +1,5 @@
|
||||
(const byte*) DATA[(number) $3e8] = { fill( $3e8, 0) }
|
||||
(const nomodify byte*) SCREEN = (byte*) 1024
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
8
src/test/ref/address-9.cfg
Normal file
8
src/test/ref/address-9.cfg
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] *((const nomodify signed word*) SCREEN) ← *((const signed word*) DATA)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
192
src/test/ref/address-9.log
Normal file
192
src/test/ref/address-9.log
Normal file
@ -0,0 +1,192 @@
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start
|
||||
(number~) main::$0 ← (number) 0 * (const byte) SIZEOF_SIGNED_WORD
|
||||
*((const nomodify signed word*) SCREEN + (number~) main::$0) ← *((const signed word*) DATA + (number~) main::$0)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
call main
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
(const signed word*) DATA[(number) $3e8] = { fill( $3e8, 0) }
|
||||
(const nomodify signed word*) SCREEN = (signed word*)(number) $400
|
||||
(const byte) SIZEOF_SIGNED_WORD = (byte) 2
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@return
|
||||
(void()) main()
|
||||
(number~) main::$0
|
||||
(label) main::@return
|
||||
|
||||
Adding number conversion cast (unumber) 0 in (number~) main::$0 ← (number) 0 * (const byte) SIZEOF_SIGNED_WORD
|
||||
Adding number conversion cast (unumber) main::$0 in (number~) main::$0 ← (unumber)(number) 0 * (const byte) SIZEOF_SIGNED_WORD
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant pointer cast (signed word*) 1024
|
||||
Simplifying constant integer cast 0
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (byte) 0
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Inferred type updated to byte in (unumber~) main::$0 ← (byte) 0 * (const byte) SIZEOF_SIGNED_WORD
|
||||
Constant right-side identified [0] (byte~) main::$0 ← (byte) 0 * (const byte) SIZEOF_SIGNED_WORD
|
||||
Successful SSA optimization Pass2ConstantRValueConsolidation
|
||||
Constant (const byte) main::$0 = 0*SIZEOF_SIGNED_WORD
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_SIGNED_WORD in
|
||||
Successful SSA optimization PassNSimplifyConstantZero
|
||||
Simplifying expression containing zero DATA in [1] *((const nomodify signed word*) SCREEN + (const byte) main::$0) ← *((const signed word*) DATA + (const byte) main::$0)
|
||||
Simplifying expression containing zero SCREEN in [1] *((const nomodify signed word*) SCREEN + (const byte) main::$0) ← *((const signed word*) DATA)
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Eliminating unused constant (const byte) main::$0
|
||||
Eliminating unused constant (const byte) SIZEOF_SIGNED_WORD
|
||||
Successful SSA optimization PassNEliminateUnusedVars
|
||||
Removing unused procedure _start
|
||||
Removing unused procedure block _start
|
||||
Removing unused procedure block _start::@1
|
||||
Removing unused procedure block _start::@return
|
||||
Successful SSA optimization PassNEliminateEmptyStart
|
||||
CALL GRAPH
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] *((const nomodify signed word*) SCREEN) ← *((const signed word*) DATA)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) main()
|
||||
|
||||
Initial phi equivalence classes
|
||||
Complete equivalence classes
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
// File Comments
|
||||
// Test declaring an integer array variable as at a hard-coded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// [0] *((const nomodify signed word*) SCREEN) ← *((const signed word*) DATA) -- _deref_pwsc1=_deref_pwsc2
|
||||
lda DATA
|
||||
sta SCREEN
|
||||
lda DATA+1
|
||||
sta SCREEN+1
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "DATA"
|
||||
// Data to be put on the screen
|
||||
DATA: .fill 2*$3e8, 0
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [0] *((const nomodify signed word*) SCREEN) ← *((const signed word*) DATA) [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [main] best 25 combination
|
||||
Uplifting [] best 25 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test declaring an integer array variable as at a hard-coded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// [0] *((const nomodify signed word*) SCREEN) ← *((const signed word*) DATA) -- _deref_pwsc1=_deref_pwsc2
|
||||
lda DATA
|
||||
sta SCREEN
|
||||
lda DATA+1
|
||||
sta SCREEN+1
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "DATA"
|
||||
// Data to be put on the screen
|
||||
DATA: .fill 2*$3e8, 0
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(const signed word*) DATA[(number) $3e8] = { fill( $3e8, 0) }
|
||||
(const nomodify signed word*) SCREEN = (signed word*) 1024
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 22
|
||||
|
||||
// File Comments
|
||||
// Test declaring an integer array variable as at a hard-coded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// SCREEN[0] = DATA[0]
|
||||
// [0] *((const nomodify signed word*) SCREEN) ← *((const signed word*) DATA) -- _deref_pwsc1=_deref_pwsc2
|
||||
lda DATA
|
||||
sta SCREEN
|
||||
lda DATA+1
|
||||
sta SCREEN+1
|
||||
// main::@return
|
||||
// }
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "DATA"
|
||||
// Data to be put on the screen
|
||||
DATA: .fill 2*$3e8, 0
|
||||
|
5
src/test/ref/address-9.sym
Normal file
5
src/test/ref/address-9.sym
Normal file
@ -0,0 +1,5 @@
|
||||
(const signed word*) DATA[(number) $3e8] = { fill( $3e8, 0) }
|
||||
(const nomodify signed word*) SCREEN = (signed word*) 1024
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
8
src/test/ref/arrays-init-kasm-1.cfg
Normal file
8
src/test/ref/arrays-init-kasm-1.cfg
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] *((const byte*) SCREEN) ← *((const byte*) SINTAB)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
192
src/test/ref/arrays-init-kasm-1.log
Normal file
192
src/test/ref/arrays-init-kasm-1.log
Normal file
@ -0,0 +1,192 @@
|
||||
Inlined call call _init
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start::@1
|
||||
*((const byte*) SCREEN + (number) 0) ← *((const byte*) SINTAB + (number) 0)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
to:_start::_init1
|
||||
_start::_init1: scope:[_start] from _start
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start::_init1
|
||||
call main
|
||||
to:_start::@2
|
||||
_start::@2: scope:[_start] from _start::@1
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@2
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
(const byte*) SCREEN = (byte*)(number) $400
|
||||
(const byte*) SINTAB[(number) $100] = kickasm {{ .fill 256, 128 + 128*sin(i*2*PI/256)
|
||||
}}
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@2
|
||||
(label) _start::@return
|
||||
(label) _start::_init1
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
||||
Adding number conversion cast (unumber) 0 in *((const byte*) SCREEN + (number) 0) ← *((const byte*) SINTAB + (number) 0)
|
||||
Adding number conversion cast (unumber) 0 in *((const byte*) SCREEN + (number) 0) ← *((const byte*) SINTAB + (unumber)(number) 0)
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant pointer cast (byte*) 1024
|
||||
Simplifying constant integer cast 0
|
||||
Simplifying constant integer cast 0
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (byte) 0
|
||||
Finalized unsigned number type (byte) 0
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Simplifying expression containing zero SINTAB in [0] *((const byte*) SCREEN + (byte) 0) ← *((const byte*) SINTAB + (byte) 0)
|
||||
Simplifying expression containing zero SCREEN in [0] *((const byte*) SCREEN + (byte) 0) ← *((const byte*) SINTAB)
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Removing unused procedure _start
|
||||
Removing unused procedure block _start
|
||||
Removing unused procedure block _start::_init1
|
||||
Removing unused procedure block _start::@1
|
||||
Removing unused procedure block _start::@2
|
||||
Removing unused procedure block _start::@return
|
||||
Successful SSA optimization PassNEliminateEmptyStart
|
||||
CALL GRAPH
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] *((const byte*) SCREEN) ← *((const byte*) SINTAB)
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) main()
|
||||
|
||||
Initial phi equivalence classes
|
||||
Complete equivalence classes
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
// File Comments
|
||||
// Test initializing array using KickAssembler
|
||||
// Place array at hardcoded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// [0] *((const byte*) SCREEN) ← *((const byte*) SINTAB) -- _deref_pbuc1=_deref_pbuc2
|
||||
lda SINTAB
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "SINTAB"
|
||||
// Sinus table at an absolute address in memory
|
||||
SINTAB:
|
||||
.fill 256, 128 + 128*sin(i*2*PI/256)
|
||||
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [0] *((const byte*) SCREEN) ← *((const byte*) SINTAB) [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [main] best 17 combination
|
||||
Uplifting [] best 17 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test initializing array using KickAssembler
|
||||
// Place array at hardcoded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// [0] *((const byte*) SCREEN) ← *((const byte*) SINTAB) -- _deref_pbuc1=_deref_pbuc2
|
||||
lda SINTAB
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "SINTAB"
|
||||
// Sinus table at an absolute address in memory
|
||||
SINTAB:
|
||||
.fill 256, 128 + 128*sin(i*2*PI/256)
|
||||
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(const byte*) SCREEN = (byte*) 1024
|
||||
(const byte*) SINTAB[(number) $100] = kickasm {{ .fill 256, 128 + 128*sin(i*2*PI/256)
|
||||
}}
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 14
|
||||
|
||||
// File Comments
|
||||
// Test initializing array using KickAssembler
|
||||
// Place array at hardcoded address
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// SCREEN[0] = SINTAB[0]
|
||||
// [0] *((const byte*) SCREEN) ← *((const byte*) SINTAB) -- _deref_pbuc1=_deref_pbuc2
|
||||
lda SINTAB
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
.pc = $1000 "SINTAB"
|
||||
// Sinus table at an absolute address in memory
|
||||
SINTAB:
|
||||
.fill 256, 128 + 128*sin(i*2*PI/256)
|
||||
|
||||
|
6
src/test/ref/arrays-init-kasm-1.sym
Normal file
6
src/test/ref/arrays-init-kasm-1.sym
Normal file
@ -0,0 +1,6 @@
|
||||
(const byte*) SCREEN = (byte*) 1024
|
||||
(const byte*) SINTAB[(number) $100] = kickasm {{ .fill 256, 128 + 128*sin(i*2*PI/256)
|
||||
}}
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
11
src/test/ref/empty-function-0.cfg
Normal file
11
src/test/ref/empty-function-0.cfg
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[1] *((const nomodify byte*) SCREEN) ← (const byte) v#2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[2] return
|
||||
to:@return
|
253
src/test/ref/empty-function-0.log
Normal file
253
src/test/ref/empty-function-0.log
Normal file
@ -0,0 +1,253 @@
|
||||
Inlined call call _init
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start::@1
|
||||
(byte) v#12 ← phi( _start::@1/(byte) v#13 )
|
||||
call set
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
(byte) v#7 ← phi( main/(byte) v#3 )
|
||||
(byte) v#0 ← (byte) v#7
|
||||
*((const nomodify byte*) SCREEN + (number) 0) ← (byte) v#0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
(byte) v#8 ← phi( main::@1/(byte) v#0 )
|
||||
(byte) v#1 ← (byte) v#8
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) set()
|
||||
set: scope:[set] from main
|
||||
(byte) v#2 ← (number) 7
|
||||
to:set::@return
|
||||
set::@return: scope:[set] from set
|
||||
(byte) v#9 ← phi( set/(byte) v#2 )
|
||||
(byte) v#3 ← (byte) v#9
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
to:_start::_init1
|
||||
_start::_init1: scope:[_start] from _start
|
||||
(byte) v#4 ← (byte) 0
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start::_init1
|
||||
(byte) v#13 ← phi( _start::_init1/(byte) v#4 )
|
||||
call main
|
||||
to:_start::@2
|
||||
_start::@2: scope:[_start] from _start::@1
|
||||
(byte) v#10 ← phi( _start::@1/(byte) v#1 )
|
||||
(byte) v#5 ← (byte) v#10
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@2
|
||||
(byte) v#11 ← phi( _start::@2/(byte) v#5 )
|
||||
(byte) v#6 ← (byte) v#11
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
(const nomodify byte*) SCREEN = (byte*)(number) $400
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@2
|
||||
(label) _start::@return
|
||||
(label) _start::_init1
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
(void()) set()
|
||||
(label) set::@return
|
||||
(byte) v
|
||||
(byte) v#0
|
||||
(byte) v#1
|
||||
(byte) v#10
|
||||
(byte) v#11
|
||||
(byte) v#12
|
||||
(byte) v#13
|
||||
(byte) v#2
|
||||
(byte) v#3
|
||||
(byte) v#4
|
||||
(byte) v#5
|
||||
(byte) v#6
|
||||
(byte) v#7
|
||||
(byte) v#8
|
||||
(byte) v#9
|
||||
|
||||
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) SCREEN + (number) 0) ← (byte) v#0
|
||||
Adding number conversion cast (unumber) 7 in (byte) v#2 ← (number) 7
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Inlining cast (byte) v#2 ← (unumber)(number) 7
|
||||
Successful SSA optimization Pass2InlineCast
|
||||
Simplifying constant pointer cast (byte*) 1024
|
||||
Simplifying constant integer cast 0
|
||||
Simplifying constant integer cast 7
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (byte) 0
|
||||
Finalized unsigned number type (byte) 7
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Alias v#0 = v#7 v#8 v#1
|
||||
Alias v#2 = v#9 v#3
|
||||
Alias v#13 = v#4
|
||||
Alias v#10 = v#5 v#11 v#6
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Identical Phi Values (byte) v#12 (byte) v#13
|
||||
Identical Phi Values (byte) v#0 (byte) v#2
|
||||
Identical Phi Values (byte) v#10 (byte) v#0
|
||||
Successful SSA optimization Pass2IdenticalPhiElimination
|
||||
Constant (const byte) v#2 = 7
|
||||
Constant (const byte) v#13 = 0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Simplifying expression containing zero SCREEN in [3] *((const nomodify byte*) SCREEN + (byte) 0) ← (const byte) v#2
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Eliminating unused constant (const byte) v#13
|
||||
Successful SSA optimization PassNEliminateUnusedVars
|
||||
Removing call to empty procedure [0] call set
|
||||
Removing unused procedure set
|
||||
Removing unused procedure block set
|
||||
Removing unused procedure block set::@return
|
||||
Successful SSA optimization PassNEliminateEmptyProcedure
|
||||
Removing unused procedure _start
|
||||
Removing unused procedure block _start
|
||||
Removing unused procedure block _start::_init1
|
||||
Removing unused procedure block _start::@1
|
||||
Removing unused procedure block _start::@2
|
||||
Removing unused procedure block _start::@return
|
||||
Successful SSA optimization PassNEliminateEmptyStart
|
||||
Adding NOP phi() at start of main
|
||||
CALL GRAPH
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
Adding NOP phi() at start of main
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[1] *((const nomodify byte*) SCREEN) ← (const byte) v#2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[2] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) main()
|
||||
(byte) v
|
||||
|
||||
Initial phi equivalence classes
|
||||
Complete equivalence classes
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.const v = 7
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [1] *((const nomodify byte*) SCREEN) ← (const byte) v#2 -- _deref_pbuc1=vbuc2
|
||||
lda #v
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [2] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [1] *((const nomodify byte*) SCREEN) ← (const byte) v#2 [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [main] best 45 combination
|
||||
Uplifting [] best 45 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.const v = 7
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [1] *((const nomodify byte*) SCREEN) ← (const byte) v#2 -- _deref_pbuc1=vbuc2
|
||||
lda #v
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [2] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(const nomodify byte*) SCREEN = (byte*) 1024
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
(byte) v
|
||||
(const byte) v#2 v = (byte) 7
|
||||
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 12
|
||||
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.const v = 7
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// main::@1
|
||||
// SCREEN[0] = v
|
||||
// [1] *((const nomodify byte*) SCREEN) ← (const byte) v#2 -- _deref_pbuc1=vbuc2
|
||||
lda #v
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [2] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
7
src/test/ref/empty-function-0.sym
Normal file
7
src/test/ref/empty-function-0.sym
Normal file
@ -0,0 +1,7 @@
|
||||
(const nomodify byte*) SCREEN = (byte*) 1024
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
(byte) v
|
||||
(const byte) v#2 v = (byte) 7
|
||||
|
11
src/test/ref/empty-function-1.cfg
Normal file
11
src/test/ref/empty-function-1.cfg
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[1] *((const nomodify byte*) SCREEN) ← (byte) 'x'
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[2] return
|
||||
to:@return
|
190
src/test/ref/empty-function-1.log
Normal file
190
src/test/ref/empty-function-1.log
Normal file
@ -0,0 +1,190 @@
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start
|
||||
call empty
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
*((const nomodify byte*) SCREEN + (number) 0) ← (byte) 'x'
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) empty()
|
||||
empty: scope:[empty] from main
|
||||
to:empty::@return
|
||||
empty::@return: scope:[empty] from empty
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
call main
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
(const nomodify byte*) SCREEN = (byte*)(number) $400
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@return
|
||||
(void()) empty()
|
||||
(label) empty::@return
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
|
||||
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) SCREEN + (number) 0) ← (byte) 'x'
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant pointer cast (byte*) 1024
|
||||
Simplifying constant integer cast 0
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (byte) 0
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Simplifying expression containing zero SCREEN in [1] *((const nomodify byte*) SCREEN + (byte) 0) ← (byte) 'x'
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Removing call to empty procedure [0] call empty
|
||||
Removing unused procedure empty
|
||||
Removing unused procedure block empty
|
||||
Removing unused procedure block empty::@return
|
||||
Successful SSA optimization PassNEliminateEmptyProcedure
|
||||
Removing unused procedure _start
|
||||
Removing unused procedure block _start
|
||||
Removing unused procedure block _start::@1
|
||||
Removing unused procedure block _start::@return
|
||||
Successful SSA optimization PassNEliminateEmptyStart
|
||||
Adding NOP phi() at start of main
|
||||
CALL GRAPH
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
Adding NOP phi() at start of main
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[1] *((const nomodify byte*) SCREEN) ← (byte) 'x'
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[2] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) main()
|
||||
|
||||
Initial phi equivalence classes
|
||||
Complete equivalence classes
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [1] *((const nomodify byte*) SCREEN) ← (byte) 'x' -- _deref_pbuc1=vbuc2
|
||||
lda #'x'
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [2] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [1] *((const nomodify byte*) SCREEN) ← (byte) 'x' [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [main] best 45 combination
|
||||
Uplifting [] best 45 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [1] *((const nomodify byte*) SCREEN) ← (byte) 'x' -- _deref_pbuc1=vbuc2
|
||||
lda #'x'
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [2] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(const nomodify byte*) SCREEN = (byte*) 1024
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 12
|
||||
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
// main
|
||||
main: {
|
||||
// main::@1
|
||||
// SCREEN[0] = 'x'
|
||||
// [1] *((const nomodify byte*) SCREEN) ← (byte) 'x' -- _deref_pbuc1=vbuc2
|
||||
lda #'x'
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [2] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
5
src/test/ref/empty-function-1.sym
Normal file
5
src/test/ref/empty-function-1.sym
Normal file
@ -0,0 +1,5 @@
|
||||
(const nomodify byte*) SCREEN = (byte*) 1024
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
|
8
src/test/ref/empty-function-2.cfg
Normal file
8
src/test/ref/empty-function-2.cfg
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
156
src/test/ref/empty-function-2.log
Normal file
156
src/test/ref/empty-function-2.log
Normal file
@ -0,0 +1,156 @@
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start
|
||||
call empty
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) empty()
|
||||
empty: scope:[empty] from main
|
||||
to:empty::@return
|
||||
empty::@return: scope:[empty] from empty
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
call main
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@return
|
||||
(void()) empty()
|
||||
(label) empty::@return
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@return
|
||||
|
||||
Removing call to empty procedure [0] call empty
|
||||
Removing unused procedure empty
|
||||
Removing unused procedure block empty
|
||||
Removing unused procedure block empty::@return
|
||||
Successful SSA optimization PassNEliminateEmptyProcedure
|
||||
Removing unused procedure _start
|
||||
Removing unused procedure block _start
|
||||
Removing unused procedure block _start::@1
|
||||
Removing unused procedure block _start::@return
|
||||
Successful SSA optimization PassNEliminateEmptyStart
|
||||
Adding NOP phi() at start of main
|
||||
Adding NOP phi() at start of main::@1
|
||||
CALL GRAPH
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
Culled Empty Block (label) main::@1
|
||||
Adding NOP phi() at start of main
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[1] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) main()
|
||||
|
||||
Initial phi equivalence classes
|
||||
Complete equivalence classes
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// main() should not be removed!
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// main
|
||||
main: {
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main]
|
||||
Uplift Scope []
|
||||
|
||||
Uplifting [main] best 36 combination
|
||||
Uplifting [] best 36 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// main() should not be removed!
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// main
|
||||
main: {
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 6
|
||||
|
||||
// File Comments
|
||||
// Test removal of empty function
|
||||
// main() should not be removed!
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(main)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// main
|
||||
main: {
|
||||
// main::@return
|
||||
// }
|
||||
// [1] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
3
src/test/ref/empty-function-2.sym
Normal file
3
src/test/ref/empty-function-2.sym
Normal file
@ -0,0 +1,3 @@
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
|
60
src/test/ref/examples/krillload/krillload.cfg
Normal file
60
src/test/ref/examples/krillload/krillload.cfg
Normal file
@ -0,0 +1,60 @@
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
[1] call krill_install
|
||||
[2] (byte) krill_install::return#2 ← (byte) krill_install::return#0
|
||||
to:main::@6
|
||||
main::@6: scope:[main] from main
|
||||
[3] (byte) main::status#0 ← (byte) krill_install::return#2
|
||||
[4] if((byte) main::status#0==(const byte) KRILL_OK) goto main::@1
|
||||
to:main::@3
|
||||
main::@3: scope:[main] from main::@6
|
||||
[5] *((byte*)(const nomodify struct MOS6569_VICII*) VICII+(const byte) OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) ← (byte) 2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@3 main::@4 main::@5
|
||||
[6] return
|
||||
to:@return
|
||||
main::@1: scope:[main] from main::@6
|
||||
[7] phi()
|
||||
[8] call krill_loadraw
|
||||
[9] (byte) krill_loadraw::return#2 ← (byte) krill_loadraw::return#0
|
||||
to:main::@7
|
||||
main::@7: scope:[main] from main::@1
|
||||
[10] (byte) main::status#1 ← (byte) krill_loadraw::return#2
|
||||
[11] if((byte) main::status#1==(const byte) KRILL_OK) goto main::@2
|
||||
to:main::@4
|
||||
main::@4: scope:[main] from main::@7
|
||||
[12] *((byte*)(const nomodify struct MOS6569_VICII*) VICII+(const byte) OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) ← (byte) 2
|
||||
to:main::@return
|
||||
main::@2: scope:[main] from main::@7
|
||||
[13] *((byte*)(const nomodify struct MOS6569_VICII*) VICII+(const byte) OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) ← (byte) 1
|
||||
to:main::toSpritePtr1
|
||||
main::toSpritePtr1: scope:[main] from main::@2
|
||||
[14] phi()
|
||||
to:main::@5
|
||||
main::@5: scope:[main] from main::toSpritePtr1
|
||||
[15] *((const nomodify byte*) SPRITES_PTR) ← (const byte) main::toSpritePtr1_return#0
|
||||
[16] *((const nomodify byte*) SPRITES_COLOR) ← (const nomodify byte) GREEN
|
||||
[17] *((const nomodify byte*) SPRITES_XPOS) ← (byte) $15
|
||||
[18] *((const nomodify byte*) SPRITES_YPOS) ← (byte) $33
|
||||
to:main::@return
|
||||
|
||||
(byte()) krill_loadraw((byte*) krill_loadraw::filename)
|
||||
krill_loadraw: scope:[krill_loadraw] from main::@1
|
||||
[19] *((const nomodify byte**) krill_loadraw::fname) ← (const byte*) main::filename
|
||||
asm { ldxfname ldyfname+1 jsrKRILL_LOADER stastatus }
|
||||
[21] (byte) krill_loadraw::return#0 ← *((const nomodify byte*) krill_loadraw::status)
|
||||
to:krill_loadraw::@return
|
||||
krill_loadraw::@return: scope:[krill_loadraw] from krill_loadraw
|
||||
[22] return
|
||||
to:@return
|
||||
|
||||
(byte()) krill_install()
|
||||
krill_install: scope:[krill_install] from main
|
||||
asm { jsrKRILL_INSTALL stastatus }
|
||||
[24] (byte) krill_install::return#0 ← *((const nomodify byte*) krill_install::status)
|
||||
to:krill_install::@return
|
||||
krill_install::@return: scope:[krill_install] from krill_install
|
||||
[25] return
|
||||
to:@return
|
1352
src/test/ref/examples/krillload/krillload.log
Normal file
1352
src/test/ref/examples/krillload/krillload.log
Normal file
File diff suppressed because it is too large
Load Diff
148
src/test/ref/examples/krillload/krillload.sym
Normal file
148
src/test/ref/examples/krillload/krillload.sym
Normal file
@ -0,0 +1,148 @@
|
||||
(const nomodify byte) GREEN = (byte) 5
|
||||
(const byte*) KRILL_INSTALL[] = kickasm {{ .import c64 "install-c64.prg"
|
||||
}}
|
||||
(const byte*) KRILL_LOADER[] = kickasm {{ .import c64 "loader-c64.prg"
|
||||
}}
|
||||
(const byte) KRILL_OK = (number) 0
|
||||
(const byte) KrillStatus::KRILL_DEVICE_INCOMPATIBLE = (number) $fb
|
||||
(const byte) KrillStatus::KRILL_DEVICE_NOT_PRESENT = (number) $fe
|
||||
(const byte) KrillStatus::KRILL_FILE_NOT_FOUND = (number) $ff
|
||||
(const byte) KrillStatus::KRILL_GENERIC_KERNAL_ERROR = (number) $fd
|
||||
(const byte) KrillStatus::KRILL_OK = (number) 0
|
||||
(const byte) KrillStatus::KRILL_TOO_MANY_DEVICES = (number) $fc
|
||||
(byte) MOS6526_CIA::INTERRUPT
|
||||
(byte) MOS6526_CIA::PORT_A
|
||||
(byte) MOS6526_CIA::PORT_A_DDR
|
||||
(byte) MOS6526_CIA::PORT_B
|
||||
(byte) MOS6526_CIA::PORT_B_DDR
|
||||
(byte) MOS6526_CIA::SERIAL_DATA
|
||||
(word) MOS6526_CIA::TIMER_A
|
||||
(byte) MOS6526_CIA::TIMER_A_CONTROL
|
||||
(word) MOS6526_CIA::TIMER_B
|
||||
(byte) MOS6526_CIA::TIMER_B_CONTROL
|
||||
(byte) MOS6526_CIA::TOD_10THS
|
||||
(byte) MOS6526_CIA::TOD_HOURS
|
||||
(byte) MOS6526_CIA::TOD_MIN
|
||||
(byte) MOS6526_CIA::TOD_SEC
|
||||
(byte) MOS6569_VICII::BG_COLOR
|
||||
(byte) MOS6569_VICII::BG_COLOR1
|
||||
(byte) MOS6569_VICII::BG_COLOR2
|
||||
(byte) MOS6569_VICII::BG_COLOR3
|
||||
(byte) MOS6569_VICII::BORDER_COLOR
|
||||
(byte) MOS6569_VICII::CONTROL1
|
||||
(byte) MOS6569_VICII::CONTROL2
|
||||
(byte) MOS6569_VICII::IRQ_ENABLE
|
||||
(byte) MOS6569_VICII::IRQ_STATUS
|
||||
(byte) MOS6569_VICII::LIGHTPEN_X
|
||||
(byte) MOS6569_VICII::LIGHTPEN_Y
|
||||
(byte) MOS6569_VICII::MEMORY
|
||||
(byte) MOS6569_VICII::RASTER
|
||||
(byte) MOS6569_VICII::SPRITE0_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE0_X
|
||||
(byte) MOS6569_VICII::SPRITE0_Y
|
||||
(byte) MOS6569_VICII::SPRITE1_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE1_X
|
||||
(byte) MOS6569_VICII::SPRITE1_Y
|
||||
(byte) MOS6569_VICII::SPRITE2_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE2_X
|
||||
(byte) MOS6569_VICII::SPRITE2_Y
|
||||
(byte) MOS6569_VICII::SPRITE3_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE3_X
|
||||
(byte) MOS6569_VICII::SPRITE3_Y
|
||||
(byte) MOS6569_VICII::SPRITE4_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE4_X
|
||||
(byte) MOS6569_VICII::SPRITE4_Y
|
||||
(byte) MOS6569_VICII::SPRITE5_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE5_X
|
||||
(byte) MOS6569_VICII::SPRITE5_Y
|
||||
(byte) MOS6569_VICII::SPRITE6_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE6_X
|
||||
(byte) MOS6569_VICII::SPRITE6_Y
|
||||
(byte) MOS6569_VICII::SPRITE7_COLOR
|
||||
(byte) MOS6569_VICII::SPRITE7_X
|
||||
(byte) MOS6569_VICII::SPRITE7_Y
|
||||
(byte) MOS6569_VICII::SPRITES_BG_COLLISION
|
||||
(byte) MOS6569_VICII::SPRITES_COLLISION
|
||||
(byte) MOS6569_VICII::SPRITES_ENABLE
|
||||
(byte) MOS6569_VICII::SPRITES_EXPAND_X
|
||||
(byte) MOS6569_VICII::SPRITES_EXPAND_Y
|
||||
(byte) MOS6569_VICII::SPRITES_MC
|
||||
(byte) MOS6569_VICII::SPRITES_MCOLOR1
|
||||
(byte) MOS6569_VICII::SPRITES_MCOLOR2
|
||||
(byte) MOS6569_VICII::SPRITES_PRIORITY
|
||||
(byte) MOS6569_VICII::SPRITES_XMSB
|
||||
(byte) MOS6581_SID::CH1_ATTACK_DECAY
|
||||
(byte) MOS6581_SID::CH1_CONTROL
|
||||
(word) MOS6581_SID::CH1_FREQ
|
||||
(word) MOS6581_SID::CH1_PULSE_WIDTH
|
||||
(byte) MOS6581_SID::CH1_SUSTAIN_RELEASE
|
||||
(byte) MOS6581_SID::CH2_ATTACK_DECAY
|
||||
(byte) MOS6581_SID::CH2_CONTROL
|
||||
(word) MOS6581_SID::CH2_FREQ
|
||||
(word) MOS6581_SID::CH2_PULSE_WIDTH
|
||||
(byte) MOS6581_SID::CH2_SUSTAIN_RELEASE
|
||||
(byte) MOS6581_SID::CH3_ATTACK_DECAY
|
||||
(byte) MOS6581_SID::CH3_CONTROL
|
||||
(byte) MOS6581_SID::CH3_ENV
|
||||
(word) MOS6581_SID::CH3_FREQ
|
||||
(byte) MOS6581_SID::CH3_OSC
|
||||
(word) MOS6581_SID::CH3_PULSE_WIDTH
|
||||
(byte) MOS6581_SID::CH3_SUSTAIN_RELEASE
|
||||
(byte) MOS6581_SID::FILTER_CUTOFF_HIGH
|
||||
(byte) MOS6581_SID::FILTER_CUTOFF_LOW
|
||||
(byte) MOS6581_SID::FILTER_SETUP
|
||||
(byte) MOS6581_SID::POT_X
|
||||
(byte) MOS6581_SID::POT_Y
|
||||
(byte) MOS6581_SID::VOLUME_FILTER_MODE
|
||||
(const byte) OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = (byte) $20
|
||||
(const byte) OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = (byte) $15
|
||||
(const nomodify byte*) SCREEN = (byte*) 1024
|
||||
(const byte*) SPRITE[(number) $40] = kickasm {{ .var pic = LoadPicture("sprite.png", List().add($000000, $ffffff))
|
||||
.for (var y=0; y<21; y++)
|
||||
.for (var x=0;x<3; x++)
|
||||
.byte pic.getSinglecolorByte(x,y)
|
||||
}}
|
||||
(const nomodify byte*) SPRITES_COLOR = (byte*) 53287
|
||||
(const nomodify byte*) SPRITES_PTR = (const nomodify byte*) SCREEN+(const nomodify word) SPRITE_PTRS
|
||||
(const nomodify byte*) SPRITES_XPOS = (byte*) 53248
|
||||
(const nomodify byte*) SPRITES_YPOS = (byte*) 53249
|
||||
(const nomodify word) SPRITE_PTRS = (word) $3f8
|
||||
(const nomodify struct MOS6569_VICII*) VICII = (struct MOS6569_VICII*) 53248
|
||||
(byte()) krill_install()
|
||||
(label) krill_install::@return
|
||||
(byte) krill_install::return
|
||||
(byte) krill_install::return#0 reg byte a 4.333333333333333
|
||||
(byte) krill_install::return#2 reg byte a 4.0
|
||||
(const nomodify byte*) krill_install::status = (byte*) 255
|
||||
(byte()) krill_loadraw((byte*) krill_loadraw::filename)
|
||||
(label) krill_loadraw::@return
|
||||
(byte*) krill_loadraw::filename
|
||||
(const nomodify byte**) krill_loadraw::fname = (byte**) 254
|
||||
(byte) krill_loadraw::return
|
||||
(byte) krill_loadraw::return#0 reg byte a 4.333333333333333
|
||||
(byte) krill_loadraw::return#2 reg byte a 4.0
|
||||
(const nomodify byte*) krill_loadraw::status = (byte*) 255
|
||||
(void()) main()
|
||||
(label) main::@1
|
||||
(label) main::@2
|
||||
(label) main::@3
|
||||
(label) main::@4
|
||||
(label) main::@5
|
||||
(label) main::@6
|
||||
(label) main::@7
|
||||
(label) main::@return
|
||||
(const byte*) main::filename[(byte) 7] = (byte*) "sprite"pm
|
||||
(byte) main::status
|
||||
(byte) main::status#0 reg byte a 4.0
|
||||
(byte) main::status#1 reg byte a 4.0
|
||||
(label) main::toSpritePtr1
|
||||
(byte) main::toSpritePtr1_return
|
||||
(const byte) main::toSpritePtr1_return#0 toSpritePtr1_return = (byte)(word)(const byte*) SPRITE/(byte) $40
|
||||
(byte*) main::toSpritePtr1_sprite
|
||||
|
||||
reg byte a [ krill_install::return#2 ]
|
||||
reg byte a [ main::status#0 ]
|
||||
reg byte a [ krill_loadraw::return#2 ]
|
||||
reg byte a [ main::status#1 ]
|
||||
reg byte a [ krill_loadraw::return#0 ]
|
||||
reg byte a [ krill_install::return#0 ]
|
25
src/test/ref/test-comments-global.cfg
Normal file
25
src/test/ref/test-comments-global.cfg
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
[0] phi()
|
||||
to:_start::_init1
|
||||
_start::_init1: scope:[_start] from _start
|
||||
[1] (byte*) screen ← (byte*) 1024
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start::_init1
|
||||
[2] phi()
|
||||
[3] call main
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@1
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start::@1
|
||||
[5] *((byte*) screen) ← (byte) 'a'
|
||||
[6] (byte*) screen ← ++ (byte*) screen
|
||||
[7] *((byte*) screen) ← (byte) 'a'
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[8] return
|
||||
to:@return
|
309
src/test/ref/test-comments-global.log
Normal file
309
src/test/ref/test-comments-global.log
Normal file
@ -0,0 +1,309 @@
|
||||
Inlined call call _init
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start::@1
|
||||
*((byte*) screen) ← (byte) 'a'
|
||||
(byte*) screen ← ++ (byte*) screen
|
||||
*((byte*) screen) ← (byte) 'a'
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
return
|
||||
to:@return
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
to:_start::_init1
|
||||
_start::_init1: scope:[_start] from _start
|
||||
(byte*) screen ← (byte*)(number) $400
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start::_init1
|
||||
call main
|
||||
to:_start::@2
|
||||
_start::@2: scope:[_start] from _start::@1
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@2
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@2
|
||||
(label) _start::@return
|
||||
(label) _start::_init1
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
(byte*) screen loadstore
|
||||
|
||||
Simplifying constant pointer cast (byte*) 1024
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Adding NOP phi() at start of _start
|
||||
Adding NOP phi() at start of _start::@1
|
||||
Adding NOP phi() at start of _start::@2
|
||||
CALL GRAPH
|
||||
Calls in [_start] to main:3
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
Culled Empty Block (label) _start::@2
|
||||
Adding NOP phi() at start of _start
|
||||
Adding NOP phi() at start of _start::@1
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
(void()) _start()
|
||||
_start: scope:[_start] from
|
||||
[0] phi()
|
||||
to:_start::_init1
|
||||
_start::_init1: scope:[_start] from _start
|
||||
[1] (byte*) screen ← (byte*) 1024
|
||||
to:_start::@1
|
||||
_start::@1: scope:[_start] from _start::_init1
|
||||
[2] phi()
|
||||
[3] call main
|
||||
to:_start::@return
|
||||
_start::@return: scope:[_start] from _start::@1
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
(void()) main()
|
||||
main: scope:[main] from _start::@1
|
||||
[5] *((byte*) screen) ← (byte) 'a'
|
||||
[6] (byte*) screen ← ++ (byte*) screen
|
||||
[7] *((byte*) screen) ← (byte) 'a'
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[8] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
(void()) _start()
|
||||
(void()) main()
|
||||
(byte*) screen loadstore 11.5
|
||||
|
||||
Initial phi equivalence classes
|
||||
Added variable screen to live range equivalence class [ screen ]
|
||||
Complete equivalence classes
|
||||
[ screen ]
|
||||
Allocated zp[2]:2 [ screen ]
|
||||
|
||||
INITIAL ASM
|
||||
Target platform is c64basic / MOS6502X
|
||||
// File Comments
|
||||
// Tests that global variables with initializer gets their comments
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(_start)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen (should become a var-comment in ASM)
|
||||
.label screen = 2
|
||||
// _start
|
||||
_start: {
|
||||
jmp _init1
|
||||
// _start::_init1
|
||||
_init1:
|
||||
// [1] (byte*) screen ← (byte*) 1024 -- pbuz1=pbuc1
|
||||
lda #<$400
|
||||
sta.z screen
|
||||
lda #>$400
|
||||
sta.z screen+1
|
||||
// [2] phi from _start::_init1 to _start::@1 [phi:_start::_init1->_start::@1]
|
||||
__b1_from__init1:
|
||||
jmp __b1
|
||||
// _start::@1
|
||||
__b1:
|
||||
// [3] call main
|
||||
jsr main
|
||||
jmp __breturn
|
||||
// _start::@return
|
||||
__breturn:
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
// The program entry point
|
||||
main: {
|
||||
// [5] *((byte*) screen) ← (byte) 'a' -- _deref_pbuz1=vbuc1
|
||||
// Put 'a' in screen
|
||||
lda #'a'
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
// [6] (byte*) screen ← ++ (byte*) screen -- pbuz1=_inc_pbuz1
|
||||
inc.z screen
|
||||
bne !+
|
||||
inc.z screen+1
|
||||
!:
|
||||
// [7] *((byte*) screen) ← (byte) 'a' -- _deref_pbuz1=vbuc1
|
||||
// Put another 'a' in screen
|
||||
lda #'a'
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [8] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [1] (byte*) screen ← (byte*) 1024 [ screen ] ( [ screen ] { } ) always clobbers reg byte a
|
||||
Statement [5] *((byte*) screen) ← (byte) 'a' [ screen ] ( main:3 [ screen ] { } ) always clobbers reg byte a reg byte y
|
||||
Statement [7] *((byte*) screen) ← (byte) 'a' [ ] ( main:3 [ ] { } ) always clobbers reg byte a reg byte y
|
||||
Potential registers zp[2]:2 [ screen ] : zp[2]:2 ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [] 11.5: zp[2]:2 [ screen ]
|
||||
Uplift Scope [main]
|
||||
Uplift Scope [_start]
|
||||
|
||||
Uplifting [] best 99 combination zp[2]:2 [ screen ]
|
||||
Uplifting [main] best 99 combination
|
||||
Uplifting [_start] best 99 combination
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Tests that global variables with initializer gets their comments
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(_start)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen (should become a var-comment in ASM)
|
||||
.label screen = 2
|
||||
// _start
|
||||
_start: {
|
||||
jmp _init1
|
||||
// _start::_init1
|
||||
_init1:
|
||||
// [1] (byte*) screen ← (byte*) 1024 -- pbuz1=pbuc1
|
||||
lda #<$400
|
||||
sta.z screen
|
||||
lda #>$400
|
||||
sta.z screen+1
|
||||
// [2] phi from _start::_init1 to _start::@1 [phi:_start::_init1->_start::@1]
|
||||
__b1_from__init1:
|
||||
jmp __b1
|
||||
// _start::@1
|
||||
__b1:
|
||||
// [3] call main
|
||||
jsr main
|
||||
jmp __breturn
|
||||
// _start::@return
|
||||
__breturn:
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
// The program entry point
|
||||
main: {
|
||||
// [5] *((byte*) screen) ← (byte) 'a' -- _deref_pbuz1=vbuc1
|
||||
// Put 'a' in screen
|
||||
lda #'a'
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
// [6] (byte*) screen ← ++ (byte*) screen -- pbuz1=_inc_pbuz1
|
||||
inc.z screen
|
||||
bne !+
|
||||
inc.z screen+1
|
||||
!:
|
||||
// [7] *((byte*) screen) ← (byte) 'a' -- _deref_pbuz1=vbuc1
|
||||
// Put another 'a' in screen
|
||||
lda #'a'
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [8] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp _init1
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __b1_from__init1:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
Removing instruction _init1:
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@return
|
||||
(label) _start::_init1
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
(byte*) screen loadstore zp[2]:2 11.5
|
||||
|
||||
zp[2]:2 [ screen ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 60
|
||||
|
||||
// File Comments
|
||||
// Tests that global variables with initializer gets their comments
|
||||
// Upstart
|
||||
.pc = $801 "Basic"
|
||||
:BasicUpstart(_start)
|
||||
.pc = $80d "Program"
|
||||
// Global Constants & labels
|
||||
// The screen (should become a var-comment in ASM)
|
||||
.label screen = 2
|
||||
// _start
|
||||
_start: {
|
||||
// _start::_init1
|
||||
// screen = 0x0400
|
||||
// [1] (byte*) screen ← (byte*) 1024 -- pbuz1=pbuc1
|
||||
lda #<$400
|
||||
sta.z screen
|
||||
lda #>$400
|
||||
sta.z screen+1
|
||||
// [2] phi from _start::_init1 to _start::@1 [phi:_start::_init1->_start::@1]
|
||||
// _start::@1
|
||||
// [3] call main
|
||||
jsr main
|
||||
// _start::@return
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
// The program entry point
|
||||
main: {
|
||||
// *screen = 'a'
|
||||
// [5] *((byte*) screen) ← (byte) 'a' -- _deref_pbuz1=vbuc1
|
||||
// Put 'a' in screen
|
||||
lda #'a'
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
// screen++;
|
||||
// [6] (byte*) screen ← ++ (byte*) screen -- pbuz1=_inc_pbuz1
|
||||
inc.z screen
|
||||
bne !+
|
||||
inc.z screen+1
|
||||
!:
|
||||
// *screen = 'a'
|
||||
// [7] *((byte*) screen) ← (byte) 'a' -- _deref_pbuz1=vbuc1
|
||||
// Put another 'a' in screen
|
||||
lda #'a'
|
||||
ldy #0
|
||||
sta (screen),y
|
||||
// main::@return
|
||||
// }
|
||||
// [8] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
9
src/test/ref/test-comments-global.sym
Normal file
9
src/test/ref/test-comments-global.sym
Normal file
@ -0,0 +1,9 @@
|
||||
(void()) _start()
|
||||
(label) _start::@1
|
||||
(label) _start::@return
|
||||
(label) _start::_init1
|
||||
(void()) main()
|
||||
(label) main::@return
|
||||
(byte*) screen loadstore zp[2]:2 11.5
|
||||
|
||||
zp[2]:2 [ screen ]
|
Loading…
x
Reference in New Issue
Block a user