mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-04-10 13:38:18 +00:00
far calls
This commit is contained in:
parent
8801a3e5e2
commit
2f2028f3a1
2
pom.xml
2
pom.xml
@ -167,7 +167,7 @@
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>0.8.7</version>
|
||||
<version>0.8.8</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>pre-unit-test</id>
|
||||
|
27
src/test/ref/procedure-callingconvention-phi-far-0.asm
Normal file
27
src/test/ref/procedure-callingconvention-phi-far-0.asm
Normal file
@ -0,0 +1,27 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-phi-far-0.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
main: {
|
||||
// plus('0', 7)
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// SCREEN[0] = plus('0', 7)
|
||||
lda #plus.return
|
||||
sta SCREEN
|
||||
// }
|
||||
rts
|
||||
}
|
||||
// char plus(char a, char b)
|
||||
plus: {
|
||||
.const a = '0'
|
||||
.const b = 7
|
||||
.label return = a+b
|
||||
rts
|
||||
}
|
20
src/test/ref/procedure-callingconvention-phi-far-0.cfg
Normal file
20
src/test/ref/procedure-callingconvention-phi-far-0.cfg
Normal file
@ -0,0 +1,20 @@
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
[1] call plus
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[2] *SCREEN = plus::return#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[3] return
|
||||
to:@return
|
||||
|
||||
__far(bank) char plus(char a , char b)
|
||||
plus: scope:[plus] from main
|
||||
[4] phi()
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[5] return
|
||||
to:@return
|
292
src/test/ref/procedure-callingconvention-phi-far-0.log
Normal file
292
src/test/ref/procedure-callingconvention-phi-far-0.log
Normal file
@ -0,0 +1,292 @@
|
||||
Far call main::$0 = call plus('0', 7)
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start
|
||||
plus::a#0 = '0'
|
||||
plus::b#0 = 7
|
||||
call plus
|
||||
plus::return#0 = plus::return#2
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
plus::return#3 = phi( main/plus::return#0 )
|
||||
main::$0 = plus::return#3
|
||||
SCREEN[0] = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) char plus(char a , char b)
|
||||
plus: scope:[plus] from main
|
||||
plus::b#1 = phi( main/plus::b#0 )
|
||||
plus::a#1 = phi( main/plus::a#0 )
|
||||
plus::$0 = plus::a#1 + plus::b#1
|
||||
plus::return#1 = plus::$0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
plus::return#4 = phi( plus/plus::return#1 )
|
||||
plus::return#2 = plus::return#4
|
||||
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
|
||||
__constant char * const SCREEN = (char *)$400
|
||||
void __start()
|
||||
void main()
|
||||
char main::$0
|
||||
__far(bank) char plus(char a , char b)
|
||||
char plus::$0
|
||||
char plus::a
|
||||
char plus::a#0
|
||||
char plus::a#1
|
||||
char plus::b
|
||||
char plus::b#0
|
||||
char plus::b#1
|
||||
char plus::return
|
||||
char plus::return#0
|
||||
char plus::return#1
|
||||
char plus::return#2
|
||||
char plus::return#3
|
||||
char plus::return#4
|
||||
|
||||
Adding number conversion cast (unumber) 7 in plus::b#0 = 7
|
||||
Adding number conversion cast (unumber) 0 in SCREEN[0] = main::$0
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Inlining cast plus::b#0 = (unumber)7
|
||||
Successful SSA optimization Pass2InlineCast
|
||||
Simplifying constant pointer cast (char *) 1024
|
||||
Simplifying constant integer cast 7
|
||||
Simplifying constant integer cast 0
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 7
|
||||
Finalized unsigned number type (char) 0
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Alias plus::return#0 = plus::return#3
|
||||
Alias plus::return#1 = plus::$0 plus::return#4 plus::return#2
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Identical Phi Values plus::a#1 plus::a#0
|
||||
Identical Phi Values plus::b#1 plus::b#0
|
||||
Successful SSA optimization Pass2IdenticalPhiElimination
|
||||
Constant plus::a#0 = '0'
|
||||
Constant plus::b#0 = 7
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Simplifying expression containing zero SCREEN in [5] SCREEN[0] = main::$0
|
||||
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
|
||||
Constant right-side identified [5] plus::return#1 = plus::a#0 + plus::b#0
|
||||
Successful SSA optimization Pass2ConstantRValueConsolidation
|
||||
Constant plus::return#1 = plus::a#0+plus::b#0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Constant plus::return#0 = plus::return#1
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Constant main::$0 = plus::return#0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Inlining constant with different constant siblings plus::return#0
|
||||
Constant inlined plus::return#0 = plus::return#1
|
||||
Constant inlined main::$0 = plus::return#1
|
||||
Successful SSA optimization Pass2ConstantInlining
|
||||
Adding NOP phi() at start of main
|
||||
Adding NOP phi() at start of plus
|
||||
CALL GRAPH
|
||||
Calls in [main] to plus:1
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
Adding NOP phi() at start of main
|
||||
Adding NOP phi() at start of plus
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[0] phi()
|
||||
[1] call plus
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main
|
||||
[2] *SCREEN = plus::return#1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[3] return
|
||||
to:@return
|
||||
|
||||
__far(bank) char plus(char a , char b)
|
||||
plus: scope:[plus] from main
|
||||
[4] phi()
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[5] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
void main()
|
||||
__far(bank) char plus(char a , char b)
|
||||
char plus::a
|
||||
char plus::b
|
||||
char plus::return
|
||||
|
||||
Initial phi equivalence classes
|
||||
Complete equivalence classes
|
||||
Warning! Unknown fragment for statement [1] call plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-far-0.c:6:17:
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Potential register analysis [1] call plus missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [1] call plus [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement [2] *SCREEN = plus::return#1 [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [main]
|
||||
Uplift Scope [plus]
|
||||
Uplift Scope []
|
||||
|
||||
Warning! Unknown fragment for statement [1] call plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-far-0.c:6:17:
|
||||
Uplifting [main] best 54 combination
|
||||
Warning! Unknown fragment for statement [1] call plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-far-0.c:6:17:
|
||||
Uplifting [plus] best 54 combination
|
||||
Warning! Unknown fragment for statement [1] call plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-far-0.c:6:17:
|
||||
Uplifting [] best 54 combination
|
||||
Warning! Unknown fragment for statement [1] call plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-far-0.c:6:17:
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-phi-far-0.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// main
|
||||
main: {
|
||||
// [1] call plus
|
||||
// [4] phi from main to plus [phi:main->plus]
|
||||
plus_from_main:
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [2] *SCREEN = plus::return#1 -- _deref_pbuc1=vbuc2
|
||||
lda #plus.return
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [3] return
|
||||
rts
|
||||
}
|
||||
// plus
|
||||
// char plus(char a, char b)
|
||||
plus: {
|
||||
.const a = '0'
|
||||
.const b = 7
|
||||
.label return = a+b
|
||||
jmp __breturn
|
||||
// plus::@return
|
||||
__breturn:
|
||||
// [5] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction plus_from_main:
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
void main()
|
||||
__far(bank) char plus(char a , char b)
|
||||
char plus::a
|
||||
__constant char plus::a#0 = '0' // a
|
||||
char plus::b
|
||||
__constant char plus::b#0 = 7 // b
|
||||
char plus::return
|
||||
__constant char plus::return#1 = plus::a#0+plus::b#0 // return
|
||||
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 18
|
||||
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-phi-far-0.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// main
|
||||
main: {
|
||||
// plus('0', 7)
|
||||
// [1] call plus
|
||||
// [4] phi from main to plus [phi:main->plus]
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// main::@1
|
||||
// SCREEN[0] = plus('0', 7)
|
||||
// [2] *SCREEN = plus::return#1 -- _deref_pbuc1=vbuc2
|
||||
lda #plus.return
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [3] return
|
||||
rts
|
||||
}
|
||||
// plus
|
||||
// char plus(char a, char b)
|
||||
plus: {
|
||||
.const a = '0'
|
||||
.const b = 7
|
||||
.label return = a+b
|
||||
// plus::@return
|
||||
// [5] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
10
src/test/ref/procedure-callingconvention-phi-far-0.sym
Normal file
10
src/test/ref/procedure-callingconvention-phi-far-0.sym
Normal file
@ -0,0 +1,10 @@
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
void main()
|
||||
__far(bank) char plus(char a , char b)
|
||||
char plus::a
|
||||
__constant char plus::a#0 = '0' // a
|
||||
char plus::b
|
||||
__constant char plus::b#0 = 7 // b
|
||||
char plus::return
|
||||
__constant char plus::return#1 = plus::a#0+plus::b#0 // return
|
||||
|
45
src/test/ref/procedure-callingconvention-stack-far-0.asm
Normal file
45
src/test/ref/procedure-callingconvention-stack-far-0.asm
Normal file
@ -0,0 +1,45 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-0.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// return a+b;
|
||||
clc
|
||||
adc.z a
|
||||
// }
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
rts
|
||||
}
|
||||
main: {
|
||||
// plus('0', 7)
|
||||
lda #'0'
|
||||
pha
|
||||
lda #7
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
pla
|
||||
// SCREEN[0] = plus('0', 7)
|
||||
sta SCREEN
|
||||
// }
|
||||
rts
|
||||
}
|
24
src/test/ref/procedure-callingconvention-stack-far-0.cfg
Normal file
24
src/test/ref/procedure-callingconvention-stack-far-0.cfg
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
[0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
[1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
[2] plus::return#0 = plus::a#0 + plus::b#0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[5] stackpush(char) = '0'
|
||||
[6] stackpush(char) = 7
|
||||
[7] callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
[9] main::$0 = stackpull(char)
|
||||
[10] *SCREEN = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[11] return
|
||||
to:@return
|
469
src/test/ref/procedure-callingconvention-stack-far-0.log
Normal file
469
src/test/ref/procedure-callingconvention-stack-far-0.log
Normal file
@ -0,0 +1,469 @@
|
||||
Adding parameter assignment in __stackcall procedure plus::b = param(plus::b)
|
||||
Adding parameter assignment in __stackcall procedure plus::a = param(plus::a)
|
||||
Far call main::$0 = call plus('0', 7)
|
||||
Calling convention __stackcall adding prepare/execute/finalize for main::$0 = call plus('0', 7)
|
||||
Calling convention STACK_CALL replacing param(plus::a) with stackidx(char,plus::OFFSET_STACK_A)
|
||||
Calling convention STACK_CALL replacing param(plus::b) with stackidx(char,plus::OFFSET_STACK_B)
|
||||
Calling convention STACK_CALL adding stack return stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return
|
||||
Calling convention STACK_CALL adding stack pull main::$0 = stackpull(char)
|
||||
Calling convention STACK_CALL adding stack push stackpush(char) = '0'
|
||||
Calling convention STACK_CALL adding stack push stackpush(char) = 7
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start
|
||||
stackpush(char) = '0'
|
||||
stackpush(char) = 7
|
||||
callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
main::$0 = stackpull(char)
|
||||
SCREEN[0] = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
plus::$0 = plus::a#0 + plus::b#0
|
||||
plus::return#0 = plus::$0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
plus::return#1 = phi( plus/plus::return#0 )
|
||||
stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#1
|
||||
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
|
||||
__constant char * const SCREEN = (char *)$400
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
void main()
|
||||
char main::$0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
char plus::$0
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0
|
||||
char plus::b
|
||||
char plus::b#0
|
||||
char plus::return
|
||||
char plus::return#0
|
||||
char plus::return#1
|
||||
|
||||
Adding number conversion cast (unumber) 7 in stackpush(char) = 7
|
||||
Adding number conversion cast (unumber) 0 in SCREEN[0] = main::$0
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Inlining cast stackpush(char) = (unumber)7
|
||||
Successful SSA optimization Pass2InlineCast
|
||||
Simplifying constant pointer cast (char *) 1024
|
||||
Simplifying constant integer cast 7
|
||||
Simplifying constant integer cast 0
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 7
|
||||
Finalized unsigned number type (char) 0
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Alias plus::return#0 = plus::$0 plus::return#1
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Simplifying expression containing zero SCREEN in [5] SCREEN[0] = main::$0
|
||||
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
|
||||
Finalized unsigned number type (char) 1
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
CALL GRAPH
|
||||
Calls in [main] to plus:7
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
[0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
[1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
[2] plus::return#0 = plus::a#0 + plus::b#0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[5] stackpush(char) = '0'
|
||||
[6] stackpush(char) = 7
|
||||
[7] callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
[9] main::$0 = stackpull(char)
|
||||
[10] *SCREEN = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[11] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
void main()
|
||||
char main::$0 // 4.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
char plus::a
|
||||
char plus::a#0 // 11.0
|
||||
char plus::b
|
||||
char plus::b#0 // 22.0
|
||||
char plus::return
|
||||
char plus::return#0 // 22.0
|
||||
|
||||
Initial phi equivalence classes
|
||||
Added variable plus::a#0 to live range equivalence class [ plus::a#0 ]
|
||||
Added variable plus::b#0 to live range equivalence class [ plus::b#0 ]
|
||||
Added variable plus::return#0 to live range equivalence class [ plus::return#0 ]
|
||||
Added variable main::$0 to live range equivalence class [ main::$0 ]
|
||||
Complete equivalence classes
|
||||
[ plus::a#0 ]
|
||||
[ plus::b#0 ]
|
||||
[ plus::return#0 ]
|
||||
[ main::$0 ]
|
||||
Allocated zp[1]:2 [ plus::b#0 ]
|
||||
Allocated zp[1]:3 [ plus::return#0 ]
|
||||
Allocated zp[1]:4 [ plus::a#0 ]
|
||||
Allocated zp[1]:5 [ main::$0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) [ plus::a#0 ] ( plus:7 [ plus::a#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) [ plus::a#0 plus::b#0 ] ( plus:7 [ plus::a#0 plus::b#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:4 [ plus::a#0 ]
|
||||
Removing always clobbered register reg byte x as potential for zp[1]:4 [ plus::a#0 ]
|
||||
Statement [2] plus::return#0 = plus::a#0 + plus::b#0 [ plus::return#0 ] ( plus:7 [ plus::return#0 ] { } ) always clobbers reg byte a
|
||||
Statement [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 [ ] ( plus:7 [ ] { } ) always clobbers reg byte x
|
||||
Statement [5] stackpush(char) = '0' [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Statement [6] stackpush(char) = 7 [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [7] callexecute plus missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [7] callexecute plus [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement sideeffect stackpullpadding(1) always clobbers reg byte a
|
||||
Statement [9] main::$0 = stackpull(char) [ main::$0 ] ( [ main::$0 ] { } ) always clobbers reg byte a
|
||||
Statement [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) [ plus::a#0 ] ( plus:7 [ plus::a#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) [ plus::a#0 plus::b#0 ] ( plus:7 [ plus::a#0 plus::b#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [2] plus::return#0 = plus::a#0 + plus::b#0 [ plus::return#0 ] ( plus:7 [ plus::return#0 ] { } ) always clobbers reg byte a
|
||||
Statement [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 [ ] ( plus:7 [ ] { } ) always clobbers reg byte x
|
||||
Statement [5] stackpush(char) = '0' [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Statement [6] stackpush(char) = 7 [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [7] callexecute plus missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [7] callexecute plus [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement sideeffect stackpullpadding(1) always clobbers reg byte a
|
||||
Statement [9] main::$0 = stackpull(char) [ main::$0 ] ( [ main::$0 ] { } ) always clobbers reg byte a
|
||||
Potential registers zp[1]:4 [ plus::a#0 ] : zp[1]:4 , reg byte y ,
|
||||
Potential registers zp[1]:2 [ plus::b#0 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:3 [ plus::return#0 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:5 [ main::$0 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [plus] 22: zp[1]:2 [ plus::b#0 ] 22: zp[1]:3 [ plus::return#0 ] 11: zp[1]:4 [ plus::a#0 ]
|
||||
Uplift Scope [main] 4: zp[1]:5 [ main::$0 ]
|
||||
Uplift Scope []
|
||||
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Uplifting [plus] best 73 combination reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ] zp[1]:4 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Uplifting [main] best 67 combination reg byte a [ main::$0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Uplifting [] best 67 combination
|
||||
Attempting to uplift remaining variables inzp[1]:4 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
Uplifting [plus] best 67 combination zp[1]:4 [ plus::a#0 ]
|
||||
Allocated (was zp[1]:4) zp[1]:2 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-0.c:6:17:
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-0.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
// Global Constants & labels
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// plus
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
// [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) -- vbuz1=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
// [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) -- vbuaa=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// [2] plus::return#0 = plus::a#0 + plus::b#0 -- vbuaa=vbuz1_plus_vbuaa
|
||||
clc
|
||||
adc.z a
|
||||
jmp __breturn
|
||||
// plus::@return
|
||||
__breturn:
|
||||
// [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 -- _stackidxbyte_vbuc1=vbuaa
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
// [5] stackpush(char) = '0' -- _stackpushbyte_=vbuc1
|
||||
lda #'0'
|
||||
pha
|
||||
// [6] stackpush(char) = 7 -- _stackpushbyte_=vbuc1
|
||||
lda #7
|
||||
pha
|
||||
// [7] callexecute plus
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(1) -- _stackpullpadding_1
|
||||
pla
|
||||
// [9] main::$0 = stackpull(char) -- vbuaa=_stackpullbyte_
|
||||
pla
|
||||
// [10] *SCREEN = main::$0 -- _deref_pbuc1=vbuaa
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [11] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void main()
|
||||
char main::$0 // reg byte a 4.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0 // a zp[1]:2 11.0
|
||||
char plus::b
|
||||
char plus::b#0 // reg byte a 22.0
|
||||
char plus::return
|
||||
char plus::return#0 // reg byte a 22.0
|
||||
|
||||
zp[1]:2 [ plus::a#0 ]
|
||||
reg byte a [ plus::b#0 ]
|
||||
reg byte a [ plus::return#0 ]
|
||||
reg byte a [ main::$0 ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 61
|
||||
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-0.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
// Global Constants & labels
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// plus
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
// [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) -- vbuz1=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
// [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) -- vbuaa=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// return a+b;
|
||||
// [2] plus::return#0 = plus::a#0 + plus::b#0 -- vbuaa=vbuz1_plus_vbuaa
|
||||
clc
|
||||
adc.z a
|
||||
// plus::@return
|
||||
// }
|
||||
// [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 -- _stackidxbyte_vbuc1=vbuaa
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
// plus('0', 7)
|
||||
// [5] stackpush(char) = '0' -- _stackpushbyte_=vbuc1
|
||||
lda #'0'
|
||||
pha
|
||||
// [6] stackpush(char) = 7 -- _stackpushbyte_=vbuc1
|
||||
lda #7
|
||||
pha
|
||||
// [7] callexecute plus
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(1) -- _stackpullpadding_1
|
||||
pla
|
||||
// [9] main::$0 = stackpull(char) -- vbuaa=_stackpullbyte_
|
||||
pla
|
||||
// SCREEN[0] = plus('0', 7)
|
||||
// [10] *SCREEN = main::$0 -- _deref_pbuc1=vbuaa
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [11] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
19
src/test/ref/procedure-callingconvention-stack-far-0.sym
Normal file
19
src/test/ref/procedure-callingconvention-stack-far-0.sym
Normal file
@ -0,0 +1,19 @@
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void main()
|
||||
char main::$0 // reg byte a 4.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0 // a zp[1]:2 11.0
|
||||
char plus::b
|
||||
char plus::b#0 // reg byte a 22.0
|
||||
char plus::return
|
||||
char plus::return#0 // reg byte a 22.0
|
||||
|
||||
zp[1]:2 [ plus::a#0 ]
|
||||
reg byte a [ plus::b#0 ]
|
||||
reg byte a [ plus::return#0 ]
|
||||
reg byte a [ main::$0 ]
|
45
src/test/ref/procedure-callingconvention-stack-far-1.asm
Normal file
45
src/test/ref/procedure-callingconvention-stack-far-1.asm
Normal file
@ -0,0 +1,45 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-1.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// return a+b;
|
||||
clc
|
||||
adc.z a
|
||||
// }
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
rts
|
||||
}
|
||||
main: {
|
||||
// plus('0', 7)
|
||||
lda #'0'
|
||||
pha
|
||||
lda #7
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
pla
|
||||
// SCREEN[0] = plus('0', 7)
|
||||
sta SCREEN
|
||||
// }
|
||||
rts
|
||||
}
|
24
src/test/ref/procedure-callingconvention-stack-far-1.cfg
Normal file
24
src/test/ref/procedure-callingconvention-stack-far-1.cfg
Normal file
@ -0,0 +1,24 @@
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
[0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
[1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
[2] plus::return#0 = plus::a#0 + plus::b#0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[5] stackpush(char) = '0'
|
||||
[6] stackpush(char) = 7
|
||||
[7] callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
[9] main::$0 = stackpull(char)
|
||||
[10] *SCREEN = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[11] return
|
||||
to:@return
|
469
src/test/ref/procedure-callingconvention-stack-far-1.log
Normal file
469
src/test/ref/procedure-callingconvention-stack-far-1.log
Normal file
@ -0,0 +1,469 @@
|
||||
Adding parameter assignment in __stackcall procedure plus::b = param(plus::b)
|
||||
Adding parameter assignment in __stackcall procedure plus::a = param(plus::a)
|
||||
Far call main::$0 = call plus('0', 7)
|
||||
Calling convention __stackcall adding prepare/execute/finalize for main::$0 = call plus('0', 7)
|
||||
Calling convention STACK_CALL replacing param(plus::a) with stackidx(char,plus::OFFSET_STACK_A)
|
||||
Calling convention STACK_CALL replacing param(plus::b) with stackidx(char,plus::OFFSET_STACK_B)
|
||||
Calling convention STACK_CALL adding stack return stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return
|
||||
Calling convention STACK_CALL adding stack pull main::$0 = stackpull(char)
|
||||
Calling convention STACK_CALL adding stack push stackpush(char) = '0'
|
||||
Calling convention STACK_CALL adding stack push stackpush(char) = 7
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start
|
||||
stackpush(char) = '0'
|
||||
stackpush(char) = 7
|
||||
callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
main::$0 = stackpull(char)
|
||||
SCREEN[0] = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
plus::$0 = plus::a#0 + plus::b#0
|
||||
plus::return#0 = plus::$0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
plus::return#1 = phi( plus/plus::return#0 )
|
||||
stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#1
|
||||
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
|
||||
__constant char * const SCREEN = (char *)$400
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
void main()
|
||||
char main::$0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
char plus::$0
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0
|
||||
char plus::b
|
||||
char plus::b#0
|
||||
char plus::return
|
||||
char plus::return#0
|
||||
char plus::return#1
|
||||
|
||||
Adding number conversion cast (unumber) 7 in stackpush(char) = 7
|
||||
Adding number conversion cast (unumber) 0 in SCREEN[0] = main::$0
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Inlining cast stackpush(char) = (unumber)7
|
||||
Successful SSA optimization Pass2InlineCast
|
||||
Simplifying constant pointer cast (char *) 1024
|
||||
Simplifying constant integer cast 7
|
||||
Simplifying constant integer cast 0
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 7
|
||||
Finalized unsigned number type (char) 0
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Alias plus::return#0 = plus::$0 plus::return#1
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Simplifying expression containing zero SCREEN in [5] SCREEN[0] = main::$0
|
||||
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
|
||||
Finalized unsigned number type (char) 1
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
CALL GRAPH
|
||||
Calls in [main] to plus:7
|
||||
|
||||
Created 0 initial phi equivalence classes
|
||||
Coalesced down to 0 phi equivalence classes
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
[0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
[1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
[2] plus::return#0 = plus::a#0 + plus::b#0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[5] stackpush(char) = '0'
|
||||
[6] stackpush(char) = 7
|
||||
[7] callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
[9] main::$0 = stackpull(char)
|
||||
[10] *SCREEN = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[11] return
|
||||
to:@return
|
||||
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
void main()
|
||||
char main::$0 // 4.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
char plus::a
|
||||
char plus::a#0 // 11.0
|
||||
char plus::b
|
||||
char plus::b#0 // 22.0
|
||||
char plus::return
|
||||
char plus::return#0 // 22.0
|
||||
|
||||
Initial phi equivalence classes
|
||||
Added variable plus::a#0 to live range equivalence class [ plus::a#0 ]
|
||||
Added variable plus::b#0 to live range equivalence class [ plus::b#0 ]
|
||||
Added variable plus::return#0 to live range equivalence class [ plus::return#0 ]
|
||||
Added variable main::$0 to live range equivalence class [ main::$0 ]
|
||||
Complete equivalence classes
|
||||
[ plus::a#0 ]
|
||||
[ plus::b#0 ]
|
||||
[ plus::return#0 ]
|
||||
[ main::$0 ]
|
||||
Allocated zp[1]:2 [ plus::b#0 ]
|
||||
Allocated zp[1]:3 [ plus::return#0 ]
|
||||
Allocated zp[1]:4 [ plus::a#0 ]
|
||||
Allocated zp[1]:5 [ main::$0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) [ plus::a#0 ] ( plus:7 [ plus::a#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) [ plus::a#0 plus::b#0 ] ( plus:7 [ plus::a#0 plus::b#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:4 [ plus::a#0 ]
|
||||
Removing always clobbered register reg byte x as potential for zp[1]:4 [ plus::a#0 ]
|
||||
Statement [2] plus::return#0 = plus::a#0 + plus::b#0 [ plus::return#0 ] ( plus:7 [ plus::return#0 ] { } ) always clobbers reg byte a
|
||||
Statement [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 [ ] ( plus:7 [ ] { } ) always clobbers reg byte x
|
||||
Statement [5] stackpush(char) = '0' [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Statement [6] stackpush(char) = 7 [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [7] callexecute plus missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [7] callexecute plus [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement sideeffect stackpullpadding(1) always clobbers reg byte a
|
||||
Statement [9] main::$0 = stackpull(char) [ main::$0 ] ( [ main::$0 ] { } ) always clobbers reg byte a
|
||||
Statement [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) [ plus::a#0 ] ( plus:7 [ plus::a#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) [ plus::a#0 plus::b#0 ] ( plus:7 [ plus::a#0 plus::b#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [2] plus::return#0 = plus::a#0 + plus::b#0 [ plus::return#0 ] ( plus:7 [ plus::return#0 ] { } ) always clobbers reg byte a
|
||||
Statement [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 [ ] ( plus:7 [ ] { } ) always clobbers reg byte x
|
||||
Statement [5] stackpush(char) = '0' [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Statement [6] stackpush(char) = 7 [ ] ( [ ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [7] callexecute plus missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [7] callexecute plus [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement sideeffect stackpullpadding(1) always clobbers reg byte a
|
||||
Statement [9] main::$0 = stackpull(char) [ main::$0 ] ( [ main::$0 ] { } ) always clobbers reg byte a
|
||||
Potential registers zp[1]:4 [ plus::a#0 ] : zp[1]:4 , reg byte y ,
|
||||
Potential registers zp[1]:2 [ plus::b#0 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:3 [ plus::return#0 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:5 [ main::$0 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [plus] 22: zp[1]:2 [ plus::b#0 ] 22: zp[1]:3 [ plus::return#0 ] 11: zp[1]:4 [ plus::a#0 ]
|
||||
Uplift Scope [main] 4: zp[1]:5 [ main::$0 ]
|
||||
Uplift Scope []
|
||||
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Uplifting [plus] best 73 combination reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ] zp[1]:4 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Uplifting [main] best 67 combination reg byte a [ main::$0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Uplifting [] best 67 combination
|
||||
Attempting to uplift remaining variables inzp[1]:4 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
Uplifting [plus] best 67 combination zp[1]:4 [ plus::a#0 ]
|
||||
Allocated (was zp[1]:4) zp[1]:2 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [7] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-1.c:6:17:
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-1.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
// Global Constants & labels
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// plus
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
// [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) -- vbuz1=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
// [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) -- vbuaa=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// [2] plus::return#0 = plus::a#0 + plus::b#0 -- vbuaa=vbuz1_plus_vbuaa
|
||||
clc
|
||||
adc.z a
|
||||
jmp __breturn
|
||||
// plus::@return
|
||||
__breturn:
|
||||
// [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 -- _stackidxbyte_vbuc1=vbuaa
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
// [5] stackpush(char) = '0' -- _stackpushbyte_=vbuc1
|
||||
lda #'0'
|
||||
pha
|
||||
// [6] stackpush(char) = 7 -- _stackpushbyte_=vbuc1
|
||||
lda #7
|
||||
pha
|
||||
// [7] callexecute plus
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(1) -- _stackpullpadding_1
|
||||
pla
|
||||
// [9] main::$0 = stackpull(char) -- vbuaa=_stackpullbyte_
|
||||
pla
|
||||
// [10] *SCREEN = main::$0 -- _deref_pbuc1=vbuaa
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [11] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void main()
|
||||
char main::$0 // reg byte a 4.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0 // a zp[1]:2 11.0
|
||||
char plus::b
|
||||
char plus::b#0 // reg byte a 22.0
|
||||
char plus::return
|
||||
char plus::return#0 // reg byte a 22.0
|
||||
|
||||
zp[1]:2 [ plus::a#0 ]
|
||||
reg byte a [ plus::b#0 ]
|
||||
reg byte a [ plus::return#0 ]
|
||||
reg byte a [ main::$0 ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 61
|
||||
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-1.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
// Global Constants & labels
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// plus
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
// [0] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) -- vbuz1=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
// [1] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) -- vbuaa=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// return a+b;
|
||||
// [2] plus::return#0 = plus::a#0 + plus::b#0 -- vbuaa=vbuz1_plus_vbuaa
|
||||
clc
|
||||
adc.z a
|
||||
// plus::@return
|
||||
// }
|
||||
// [3] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 -- _stackidxbyte_vbuc1=vbuaa
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
// plus('0', 7)
|
||||
// [5] stackpush(char) = '0' -- _stackpushbyte_=vbuc1
|
||||
lda #'0'
|
||||
pha
|
||||
// [6] stackpush(char) = 7 -- _stackpushbyte_=vbuc1
|
||||
lda #7
|
||||
pha
|
||||
// [7] callexecute plus
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(1) -- _stackpullpadding_1
|
||||
pla
|
||||
// [9] main::$0 = stackpull(char) -- vbuaa=_stackpullbyte_
|
||||
pla
|
||||
// SCREEN[0] = plus('0', 7)
|
||||
// [10] *SCREEN = main::$0 -- _deref_pbuc1=vbuaa
|
||||
sta SCREEN
|
||||
// main::@return
|
||||
// }
|
||||
// [11] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
19
src/test/ref/procedure-callingconvention-stack-far-1.sym
Normal file
19
src/test/ref/procedure-callingconvention-stack-far-1.sym
Normal file
@ -0,0 +1,19 @@
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void main()
|
||||
char main::$0 // reg byte a 4.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0 // a zp[1]:2 11.0
|
||||
char plus::b
|
||||
char plus::b#0 // reg byte a 22.0
|
||||
char plus::return
|
||||
char plus::return#0 // reg byte a 22.0
|
||||
|
||||
zp[1]:2 [ plus::a#0 ]
|
||||
reg byte a [ plus::b#0 ]
|
||||
reg byte a [ plus::return#0 ]
|
||||
reg byte a [ main::$0 ]
|
72
src/test/ref/procedure-callingconvention-stack-far-2.asm
Normal file
72
src/test/ref/procedure-callingconvention-stack-far-2.asm
Normal file
@ -0,0 +1,72 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// A slightly more complex call
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-2.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.label i = 4
|
||||
.segment Code
|
||||
__start: {
|
||||
// char i = 0
|
||||
lda #0
|
||||
sta.z i
|
||||
jsr main
|
||||
rts
|
||||
}
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// i++;
|
||||
inc.z i
|
||||
// return a+b;
|
||||
clc
|
||||
adc.z a
|
||||
// }
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
rts
|
||||
}
|
||||
main: {
|
||||
.label a = 3
|
||||
lda #0
|
||||
sta.z a
|
||||
__b1:
|
||||
// char v = a+1
|
||||
ldx.z a
|
||||
inx
|
||||
// char w = plus('0', v)
|
||||
lda #'0'
|
||||
pha
|
||||
txa
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
pla
|
||||
// w+a
|
||||
clc
|
||||
adc.z a
|
||||
// SCREEN[i] = w+a
|
||||
ldy.z i
|
||||
sta SCREEN,y
|
||||
// for(char a:0..1)
|
||||
inc.z a
|
||||
lda #2
|
||||
cmp.z a
|
||||
bne __b1
|
||||
// }
|
||||
rts
|
||||
}
|
48
src/test/ref/procedure-callingconvention-stack-far-2.cfg
Normal file
48
src/test/ref/procedure-callingconvention-stack-far-2.cfg
Normal file
@ -0,0 +1,48 @@
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
[0] phi()
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
[1] i = 0
|
||||
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
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
[5] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
[6] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
[7] i = ++ i
|
||||
[8] plus::return#0 = plus::a#0 + plus::b#0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[9] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0
|
||||
[10] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start::@1
|
||||
[11] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[12] main::a#2 = phi( main/0, main::@1/main::a#1 )
|
||||
[13] main::v#0 = main::a#2 + 1
|
||||
[14] stackpush(char) = '0'
|
||||
[15] stackpush(char) = main::v#0
|
||||
[16] callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
[18] main::w#0 = stackpull(char)
|
||||
[19] main::$2 = main::w#0 + main::a#2
|
||||
[20] SCREEN[i] = main::$2
|
||||
[21] main::a#1 = ++ main::a#2
|
||||
[22] if(main::a#1!=2) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[23] return
|
||||
to:@return
|
851
src/test/ref/procedure-callingconvention-stack-far-2.log
Normal file
851
src/test/ref/procedure-callingconvention-stack-far-2.log
Normal file
@ -0,0 +1,851 @@
|
||||
Converting variable modified inside __stackcall procedure plus() to load/store i
|
||||
Adding parameter assignment in __stackcall procedure plus::b = param(plus::b)
|
||||
Adding parameter assignment in __stackcall procedure plus::a = param(plus::a)
|
||||
Inlined call call __init
|
||||
Far call main::w = call plus('0', main::v)
|
||||
Eliminating unused variable with no statement main::$0
|
||||
Eliminating unused variable with no statement main::$1
|
||||
Calling convention __stackcall adding prepare/execute/finalize for main::w = call plus('0', main::v)
|
||||
Calling convention STACK_CALL replacing param(plus::a) with stackidx(char,plus::OFFSET_STACK_A)
|
||||
Calling convention STACK_CALL replacing param(plus::b) with stackidx(char,plus::OFFSET_STACK_B)
|
||||
Calling convention STACK_CALL adding stack return stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return
|
||||
Calling convention STACK_CALL adding stack pull main::w = stackpull(char)
|
||||
Calling convention STACK_CALL adding stack push stackpush(char) = '0'
|
||||
Calling convention STACK_CALL adding stack push stackpush(char) = main::v
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start::@1
|
||||
main::a#0 = 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
main::a#2 = phi( main/main::a#0, main::@1/main::a#1 )
|
||||
main::v#0 = main::a#2 + 1
|
||||
stackpush(char) = '0'
|
||||
stackpush(char) = main::v#0
|
||||
callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
main::w#0 = stackpull(char)
|
||||
main::$2 = main::w#0 + main::a#2
|
||||
SCREEN[i] = main::$2
|
||||
main::a#1 = main::a#2 + rangenext(0,1)
|
||||
main::$3 = main::a#1 != rangelast(0,1)
|
||||
if(main::$3) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
i = ++ i
|
||||
plus::$0 = plus::a#0 + plus::b#0
|
||||
plus::return#0 = plus::$0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
plus::return#1 = phi( plus/plus::return#0 )
|
||||
stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#1
|
||||
return
|
||||
to:@return
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
i = 0
|
||||
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
|
||||
__constant char * const SCREEN = (char *)$400
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
__loadstore char i
|
||||
void main()
|
||||
char main::$2
|
||||
bool main::$3
|
||||
char main::a
|
||||
char main::a#0
|
||||
char main::a#1
|
||||
char main::a#2
|
||||
char main::v
|
||||
char main::v#0
|
||||
char main::w
|
||||
char main::w#0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
char plus::$0
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0
|
||||
char plus::b
|
||||
char plus::b#0
|
||||
char plus::return
|
||||
char plus::return#0
|
||||
char plus::return#1
|
||||
|
||||
Adding number conversion cast (unumber) 1 in main::v#0 = main::a#2 + 1
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant pointer cast (char *) 1024
|
||||
Simplifying constant integer cast 1
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 1
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Alias plus::return#0 = plus::$0 plus::return#1
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Simple Condition main::$3 [12] if(main::a#1!=rangelast(0,1)) goto main::@1
|
||||
Successful SSA optimization Pass2ConditionalJumpSimplification
|
||||
Constant main::a#0 = 0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Resolved ranged next value [10] main::a#1 = ++ main::a#2 to ++
|
||||
Resolved ranged comparison value [12] if(main::a#1!=rangelast(0,1)) goto main::@1 to 2
|
||||
Adding number conversion cast (unumber) 2 in if(main::a#1!=2) goto main::@1
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant integer cast 2
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 2
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Inlining constant with var siblings main::a#0
|
||||
Constant inlined main::a#0 = 0
|
||||
Successful SSA optimization Pass2ConstantInlining
|
||||
Finalized unsigned number type (char) 1
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Added new block during phi lifting main::@2(between main::@1 and main::@1)
|
||||
Adding NOP phi() at start of __start
|
||||
Adding NOP phi() at start of __start::@1
|
||||
Adding NOP phi() at start of __start::@2
|
||||
Adding NOP phi() at start of main
|
||||
CALL GRAPH
|
||||
Calls in [__start] to main:3
|
||||
Calls in [main] to plus:17
|
||||
|
||||
Created 1 initial phi equivalence classes
|
||||
Coalesced [25] main::a#3 = main::a#1
|
||||
Coalesced down to 1 phi equivalence classes
|
||||
Culled Empty Block label __start::@2
|
||||
Culled Empty Block label main::@2
|
||||
Adding NOP phi() at start of __start
|
||||
Adding NOP phi() at start of __start::@1
|
||||
Adding NOP phi() at start of main
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
[0] phi()
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
[1] i = 0
|
||||
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
|
||||
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
plus: scope:[plus] from
|
||||
[5] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A)
|
||||
[6] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B)
|
||||
[7] i = ++ i
|
||||
[8] plus::return#0 = plus::a#0 + plus::b#0
|
||||
to:plus::@return
|
||||
plus::@return: scope:[plus] from plus
|
||||
[9] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0
|
||||
[10] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from __start::@1
|
||||
[11] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[12] main::a#2 = phi( main/0, main::@1/main::a#1 )
|
||||
[13] main::v#0 = main::a#2 + 1
|
||||
[14] stackpush(char) = '0'
|
||||
[15] stackpush(char) = main::v#0
|
||||
[16] callexecute plus
|
||||
sideeffect stackpullpadding(1)
|
||||
[18] main::w#0 = stackpull(char)
|
||||
[19] main::$2 = main::w#0 + main::a#2
|
||||
[20] SCREEN[i] = main::$2
|
||||
[21] main::a#1 = ++ main::a#2
|
||||
[22] if(main::a#1!=2) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[23] return
|
||||
to:@return
|
||||
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@1 blocks: main::@1 in scope plus
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
void __start()
|
||||
__loadstore char i // 105.24999999999999
|
||||
void main()
|
||||
char main::$2 // 202.0
|
||||
char main::a
|
||||
char main::a#1 // 151.5
|
||||
char main::a#2 // 44.888888888888886
|
||||
char main::v
|
||||
char main::v#0 // 101.0
|
||||
char main::w
|
||||
char main::w#0 // 202.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
char plus::a
|
||||
char plus::a#0 // 667.3333333333334
|
||||
char plus::b
|
||||
char plus::b#0 // 1001.0
|
||||
char plus::return
|
||||
char plus::return#0 // 2002.0
|
||||
|
||||
Initial phi equivalence classes
|
||||
[ main::a#2 main::a#1 ]
|
||||
Added variable i to live range equivalence class [ i ]
|
||||
Added variable plus::a#0 to live range equivalence class [ plus::a#0 ]
|
||||
Added variable plus::b#0 to live range equivalence class [ plus::b#0 ]
|
||||
Added variable plus::return#0 to live range equivalence class [ plus::return#0 ]
|
||||
Added variable main::v#0 to live range equivalence class [ main::v#0 ]
|
||||
Added variable main::w#0 to live range equivalence class [ main::w#0 ]
|
||||
Added variable main::$2 to live range equivalence class [ main::$2 ]
|
||||
Complete equivalence classes
|
||||
[ main::a#2 main::a#1 ]
|
||||
[ i ]
|
||||
[ plus::a#0 ]
|
||||
[ plus::b#0 ]
|
||||
[ plus::return#0 ]
|
||||
[ main::v#0 ]
|
||||
[ main::w#0 ]
|
||||
[ main::$2 ]
|
||||
Allocated zp[1]:2 [ plus::return#0 ]
|
||||
Allocated zp[1]:3 [ plus::b#0 ]
|
||||
Allocated zp[1]:4 [ plus::a#0 ]
|
||||
Allocated zp[1]:5 [ main::w#0 ]
|
||||
Allocated zp[1]:6 [ main::$2 ]
|
||||
Allocated zp[1]:7 [ main::a#2 main::a#1 ]
|
||||
Allocated zp[1]:8 [ i ]
|
||||
Allocated zp[1]:9 [ main::v#0 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [1] i = 0 [ i ] ( [ i ] { } ) always clobbers reg byte a
|
||||
Statement [5] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) [ i plus::a#0 ] ( main:3::plus:16 [ main::a#2 i plus::a#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:7 [ main::a#2 main::a#1 ]
|
||||
Removing always clobbered register reg byte x as potential for zp[1]:7 [ main::a#2 main::a#1 ]
|
||||
Statement [6] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) [ i plus::a#0 plus::b#0 ] ( main:3::plus:16 [ main::a#2 i plus::a#0 plus::b#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:4 [ plus::a#0 ]
|
||||
Removing always clobbered register reg byte x as potential for zp[1]:4 [ plus::a#0 ]
|
||||
Statement [8] plus::return#0 = plus::a#0 + plus::b#0 [ i plus::return#0 ] ( main:3::plus:16 [ main::a#2 i plus::return#0 ] { } ) always clobbers reg byte a
|
||||
Statement [9] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 [ i ] ( main:3::plus:16 [ main::a#2 i ] { } ) always clobbers reg byte x
|
||||
Statement [14] stackpush(char) = '0' [ i main::a#2 main::v#0 ] ( main:3 [ i main::a#2 main::v#0 ] { } ) always clobbers reg byte a
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:9 [ main::v#0 ]
|
||||
Statement [15] stackpush(char) = main::v#0 [ i main::a#2 ] ( main:3 [ i main::a#2 ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [16] callexecute plus missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [16] callexecute plus [ i main::a#2 ] ( main:3 [ i main::a#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Removing always clobbered register reg byte y as potential for zp[1]:7 [ main::a#2 main::a#1 ]
|
||||
Statement sideeffect stackpullpadding(1) always clobbers reg byte a
|
||||
Statement [18] main::w#0 = stackpull(char) [ i main::a#2 main::w#0 ] ( main:3 [ i main::a#2 main::w#0 ] { } ) always clobbers reg byte a
|
||||
Statement [19] main::$2 = main::w#0 + main::a#2 [ i main::a#2 main::$2 ] ( main:3 [ i main::a#2 main::$2 ] { } ) always clobbers reg byte a
|
||||
Statement [20] SCREEN[i] = main::$2 [ i main::a#2 ] ( main:3 [ i main::a#2 ] { } ) always clobbers reg byte y
|
||||
Statement [22] if(main::a#1!=2) goto main::@1 [ i main::a#1 ] ( main:3 [ i main::a#1 ] { } ) always clobbers reg byte a
|
||||
Statement [1] i = 0 [ i ] ( [ i ] { } ) always clobbers reg byte a
|
||||
Statement [5] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) [ i plus::a#0 ] ( main:3::plus:16 [ main::a#2 i plus::a#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [6] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) [ i plus::a#0 plus::b#0 ] ( main:3::plus:16 [ main::a#2 i plus::a#0 plus::b#0 ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [8] plus::return#0 = plus::a#0 + plus::b#0 [ i plus::return#0 ] ( main:3::plus:16 [ main::a#2 i plus::return#0 ] { } ) always clobbers reg byte a
|
||||
Statement [9] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 [ i ] ( main:3::plus:16 [ main::a#2 i ] { } ) always clobbers reg byte x
|
||||
Statement [14] stackpush(char) = '0' [ i main::a#2 main::v#0 ] ( main:3 [ i main::a#2 main::v#0 ] { } ) always clobbers reg byte a
|
||||
Statement [15] stackpush(char) = main::v#0 [ i main::a#2 ] ( main:3 [ i main::a#2 ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [16] callexecute plus missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [16] callexecute plus [ i main::a#2 ] ( main:3 [ i main::a#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement sideeffect stackpullpadding(1) always clobbers reg byte a
|
||||
Statement [18] main::w#0 = stackpull(char) [ i main::a#2 main::w#0 ] ( main:3 [ i main::a#2 main::w#0 ] { } ) always clobbers reg byte a
|
||||
Statement [19] main::$2 = main::w#0 + main::a#2 [ i main::a#2 main::$2 ] ( main:3 [ i main::a#2 main::$2 ] { } ) always clobbers reg byte a
|
||||
Statement [20] SCREEN[i] = main::$2 [ i main::a#2 ] ( main:3 [ i main::a#2 ] { } ) always clobbers reg byte y
|
||||
Statement [22] if(main::a#1!=2) goto main::@1 [ i main::a#1 ] ( main:3 [ i main::a#1 ] { } ) always clobbers reg byte a
|
||||
Potential registers zp[1]:7 [ main::a#2 main::a#1 ] : zp[1]:7 ,
|
||||
Potential registers zp[1]:8 [ i ] : zp[1]:8 ,
|
||||
Potential registers zp[1]:4 [ plus::a#0 ] : zp[1]:4 , reg byte y ,
|
||||
Potential registers zp[1]:3 [ plus::b#0 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:2 [ plus::return#0 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:9 [ main::v#0 ] : zp[1]:9 , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:5 [ main::w#0 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:6 [ main::$2 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [plus] 2,002: zp[1]:2 [ plus::return#0 ] 1,001: zp[1]:3 [ plus::b#0 ] 667.33: zp[1]:4 [ plus::a#0 ]
|
||||
Uplift Scope [main] 202: zp[1]:5 [ main::w#0 ] 202: zp[1]:6 [ main::$2 ] 196.39: zp[1]:7 [ main::a#2 main::a#1 ] 101: zp[1]:9 [ main::v#0 ]
|
||||
Uplift Scope [] 105.25: zp[1]:8 [ i ]
|
||||
Uplift Scope [__start]
|
||||
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Uplifting [plus] best 885 combination reg byte a [ plus::return#0 ] reg byte a [ plus::b#0 ] zp[1]:4 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Uplifting [main] best 725 combination reg byte a [ main::w#0 ] reg byte a [ main::$2 ] zp[1]:7 [ main::a#2 main::a#1 ] reg byte x [ main::v#0 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Uplifting [] best 725 combination zp[1]:8 [ i ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Uplifting [__start] best 725 combination
|
||||
Attempting to uplift remaining variables inzp[1]:4 [ plus::a#0 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Uplifting [plus] best 725 combination zp[1]:4 [ plus::a#0 ]
|
||||
Attempting to uplift remaining variables inzp[1]:7 [ main::a#2 main::a#1 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Uplifting [main] best 725 combination zp[1]:7 [ main::a#2 main::a#1 ]
|
||||
Attempting to uplift remaining variables inzp[1]:8 [ i ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
Uplifting [] best 725 combination zp[1]:8 [ i ]
|
||||
Allocated (was zp[1]:4) zp[1]:2 [ plus::a#0 ]
|
||||
Allocated (was zp[1]:7) zp[1]:3 [ main::a#2 main::a#1 ]
|
||||
Allocated (was zp[1]:8) zp[1]:4 [ i ]
|
||||
Warning! Unknown fragment for statement [16] callexecute plus
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-2.c:11:9:
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// A slightly more complex call
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-2.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
// Global Constants & labels
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.label i = 4
|
||||
.segment Code
|
||||
// __start
|
||||
__start: {
|
||||
jmp __init1
|
||||
// __start::__init1
|
||||
__init1:
|
||||
// [1] i = 0 -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z i
|
||||
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
|
||||
__b1_from___init1:
|
||||
jmp __b1
|
||||
// __start::@1
|
||||
__b1:
|
||||
// [3] call main
|
||||
// [11] phi from __start::@1 to main [phi:__start::@1->main]
|
||||
main_from___b1:
|
||||
jsr main
|
||||
jmp __breturn
|
||||
// __start::@return
|
||||
__breturn:
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// plus
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
// [5] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) -- vbuz1=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
// [6] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) -- vbuaa=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// [7] i = ++ i -- vbuz1=_inc_vbuz1
|
||||
inc.z i
|
||||
// [8] plus::return#0 = plus::a#0 + plus::b#0 -- vbuaa=vbuz1_plus_vbuaa
|
||||
clc
|
||||
adc.z a
|
||||
jmp __breturn
|
||||
// plus::@return
|
||||
__breturn:
|
||||
// [9] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 -- _stackidxbyte_vbuc1=vbuaa
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
// [10] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
.label a = 3
|
||||
// [12] phi from main to main::@1 [phi:main->main::@1]
|
||||
__b1_from_main:
|
||||
// [12] phi main::a#2 = 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z a
|
||||
jmp __b1
|
||||
// [12] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||
__b1_from___b1:
|
||||
// [12] phi main::a#2 = main::a#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [13] main::v#0 = main::a#2 + 1 -- vbuxx=vbuz1_plus_1
|
||||
ldx.z a
|
||||
inx
|
||||
// [14] stackpush(char) = '0' -- _stackpushbyte_=vbuc1
|
||||
lda #'0'
|
||||
pha
|
||||
// [15] stackpush(char) = main::v#0 -- _stackpushbyte_=vbuxx
|
||||
txa
|
||||
pha
|
||||
// [16] callexecute plus
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(1) -- _stackpullpadding_1
|
||||
pla
|
||||
// [18] main::w#0 = stackpull(char) -- vbuaa=_stackpullbyte_
|
||||
pla
|
||||
// [19] main::$2 = main::w#0 + main::a#2 -- vbuaa=vbuaa_plus_vbuz1
|
||||
clc
|
||||
adc.z a
|
||||
// [20] SCREEN[i] = main::$2 -- pbuc1_derefidx_vbuz1=vbuaa
|
||||
ldy.z i
|
||||
sta SCREEN,y
|
||||
// [21] main::a#1 = ++ main::a#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z a
|
||||
// [22] if(main::a#1!=2) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
|
||||
lda #2
|
||||
cmp.z a
|
||||
bne __b1_from___b1
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [23] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __init1
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Replacing label __b1_from___b1 with __b1
|
||||
Removing instruction __b1_from___init1:
|
||||
Removing instruction main_from___b1:
|
||||
Removing instruction __b1_from___b1:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
Removing instruction __init1:
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __b1_from_main:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
Removing instruction jmp __b1
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
__loadstore char i // zp[1]:4 105.24999999999999
|
||||
void main()
|
||||
char main::$2 // reg byte a 202.0
|
||||
char main::a
|
||||
char main::a#1 // a zp[1]:3 151.5
|
||||
char main::a#2 // a zp[1]:3 44.888888888888886
|
||||
char main::v
|
||||
char main::v#0 // reg byte x 101.0
|
||||
char main::w
|
||||
char main::w#0 // reg byte a 202.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0 // a zp[1]:2 667.3333333333334
|
||||
char plus::b
|
||||
char plus::b#0 // reg byte a 1001.0
|
||||
char plus::return
|
||||
char plus::return#0 // reg byte a 2002.0
|
||||
|
||||
zp[1]:3 [ main::a#2 main::a#1 ]
|
||||
zp[1]:4 [ i ]
|
||||
zp[1]:2 [ plus::a#0 ]
|
||||
reg byte a [ plus::b#0 ]
|
||||
reg byte a [ plus::return#0 ]
|
||||
reg byte x [ main::v#0 ]
|
||||
reg byte a [ main::w#0 ]
|
||||
reg byte a [ main::$2 ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 596
|
||||
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// A slightly more complex call
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-2.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
// Global Constants & labels
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.label i = 4
|
||||
.segment Code
|
||||
// __start
|
||||
__start: {
|
||||
// __start::__init1
|
||||
// char i = 0
|
||||
// [1] i = 0 -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z i
|
||||
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
|
||||
// __start::@1
|
||||
// [3] call main
|
||||
// [11] phi from __start::@1 to main [phi:__start::@1->main]
|
||||
jsr main
|
||||
// __start::@return
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// plus
|
||||
// __register(A) char plus(__zp(2) char a, __register(A) char b)
|
||||
plus: {
|
||||
.const OFFSET_STACK_A = 1
|
||||
.const OFFSET_STACK_B = 0
|
||||
.const OFFSET_STACK_RETURN_1 = 1
|
||||
.label a = 2
|
||||
// [5] plus::a#0 = stackidx(char,plus::OFFSET_STACK_A) -- vbuz1=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_A,x
|
||||
sta.z a
|
||||
// [6] plus::b#0 = stackidx(char,plus::OFFSET_STACK_B) -- vbuaa=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_B,x
|
||||
// i++;
|
||||
// [7] i = ++ i -- vbuz1=_inc_vbuz1
|
||||
inc.z i
|
||||
// return a+b;
|
||||
// [8] plus::return#0 = plus::a#0 + plus::b#0 -- vbuaa=vbuz1_plus_vbuaa
|
||||
clc
|
||||
adc.z a
|
||||
// plus::@return
|
||||
// }
|
||||
// [9] stackidx(char,plus::OFFSET_STACK_RETURN_1) = plus::return#0 -- _stackidxbyte_vbuc1=vbuaa
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_1,x
|
||||
// [10] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
.label a = 3
|
||||
// [12] phi from main to main::@1 [phi:main->main::@1]
|
||||
// [12] phi main::a#2 = 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z a
|
||||
// [12] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||
// [12] phi main::a#2 = main::a#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||
// main::@1
|
||||
__b1:
|
||||
// char v = a+1
|
||||
// [13] main::v#0 = main::a#2 + 1 -- vbuxx=vbuz1_plus_1
|
||||
ldx.z a
|
||||
inx
|
||||
// char w = plus('0', v)
|
||||
// [14] stackpush(char) = '0' -- _stackpushbyte_=vbuc1
|
||||
lda #'0'
|
||||
pha
|
||||
// [15] stackpush(char) = main::v#0 -- _stackpushbyte_=vbuxx
|
||||
txa
|
||||
pha
|
||||
// [16] callexecute plus
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(1) -- _stackpullpadding_1
|
||||
pla
|
||||
// [18] main::w#0 = stackpull(char) -- vbuaa=_stackpullbyte_
|
||||
pla
|
||||
// w+a
|
||||
// [19] main::$2 = main::w#0 + main::a#2 -- vbuaa=vbuaa_plus_vbuz1
|
||||
clc
|
||||
adc.z a
|
||||
// SCREEN[i] = w+a
|
||||
// [20] SCREEN[i] = main::$2 -- pbuc1_derefidx_vbuz1=vbuaa
|
||||
ldy.z i
|
||||
sta SCREEN,y
|
||||
// for(char a:0..1)
|
||||
// [21] main::a#1 = ++ main::a#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z a
|
||||
// [22] if(main::a#1!=2) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
|
||||
lda #2
|
||||
cmp.z a
|
||||
bne __b1
|
||||
// main::@return
|
||||
// }
|
||||
// [23] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
32
src/test/ref/procedure-callingconvention-stack-far-2.sym
Normal file
32
src/test/ref/procedure-callingconvention-stack-far-2.sym
Normal file
@ -0,0 +1,32 @@
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
__loadstore char i // zp[1]:4 105.24999999999999
|
||||
void main()
|
||||
char main::$2 // reg byte a 202.0
|
||||
char main::a
|
||||
char main::a#1 // a zp[1]:3 151.5
|
||||
char main::a#2 // a zp[1]:3 44.888888888888886
|
||||
char main::v
|
||||
char main::v#0 // reg byte x 101.0
|
||||
char main::w
|
||||
char main::w#0 // reg byte a 202.0
|
||||
__far(bank) __stackcall char plus(char a , char b)
|
||||
__constant char plus::OFFSET_STACK_A = 1
|
||||
__constant char plus::OFFSET_STACK_B = 0
|
||||
__constant char plus::OFFSET_STACK_RETURN_1 = 1
|
||||
char plus::a
|
||||
char plus::a#0 // a zp[1]:2 667.3333333333334
|
||||
char plus::b
|
||||
char plus::b#0 // reg byte a 1001.0
|
||||
char plus::return
|
||||
char plus::return#0 // reg byte a 2002.0
|
||||
|
||||
zp[1]:3 [ main::a#2 main::a#1 ]
|
||||
zp[1]:4 [ i ]
|
||||
zp[1]:2 [ plus::a#0 ]
|
||||
reg byte a [ plus::b#0 ]
|
||||
reg byte a [ plus::return#0 ]
|
||||
reg byte x [ main::v#0 ]
|
||||
reg byte a [ main::w#0 ]
|
||||
reg byte a [ main::$2 ]
|
68
src/test/ref/procedure-callingconvention-stack-far-3.asm
Normal file
68
src/test/ref/procedure-callingconvention-stack-far-3.asm
Normal file
@ -0,0 +1,68 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// Recursive fibonacci
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-3.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// __register(A) char fib(__zp(2) char n)
|
||||
fib: {
|
||||
.const OFFSET_STACK_N = 0
|
||||
.const OFFSET_STACK_RETURN_0 = 0
|
||||
.label __4 = 3
|
||||
.label n = 2
|
||||
// return n;
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_N,x
|
||||
sta.z n
|
||||
// if (n == 0 || n == 1)
|
||||
beq __b1
|
||||
lda #1
|
||||
cmp.z n
|
||||
beq __b1
|
||||
// n-1
|
||||
lda.z n
|
||||
sec
|
||||
sbc #1
|
||||
// fib(n-1)
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
sta.z __4
|
||||
// n-2
|
||||
lda.z n
|
||||
sec
|
||||
sbc #2
|
||||
// fib(n-2)
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
// return (fib(n-1) + fib(n-2));
|
||||
clc
|
||||
adc.z __4
|
||||
__breturn:
|
||||
// }
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0,x
|
||||
rts
|
||||
__b1:
|
||||
lda.z n
|
||||
jmp __breturn
|
||||
}
|
||||
main: {
|
||||
// fib(5)
|
||||
lda #5
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
// *SCREEN = fib(5)
|
||||
sta SCREEN
|
||||
// }
|
||||
rts
|
||||
}
|
39
src/test/ref/procedure-callingconvention-stack-far-3.cfg
Normal file
39
src/test/ref/procedure-callingconvention-stack-far-3.cfg
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
__far(bank) __stackcall char fib(char n)
|
||||
fib: scope:[fib] from
|
||||
[0] fib::n#0 = stackidx(char,fib::OFFSET_STACK_N)
|
||||
[1] if(fib::n#0==0) goto fib::@1
|
||||
to:fib::@3
|
||||
fib::@3: scope:[fib] from fib
|
||||
[2] if(fib::n#0==1) goto fib::@1
|
||||
to:fib::@2
|
||||
fib::@2: scope:[fib] from fib::@3
|
||||
[3] fib::$3 = fib::n#0 - 1
|
||||
[4] stackpush(char) = fib::$3
|
||||
[5] callexecute fib
|
||||
[6] fib::$4 = stackpull(char)
|
||||
[7] fib::$5 = fib::n#0 - 2
|
||||
[8] stackpush(char) = fib::$5
|
||||
[9] callexecute fib
|
||||
[10] fib::$6 = stackpull(char)
|
||||
[11] fib::return#1 = fib::$4 + fib::$6
|
||||
to:fib::@return
|
||||
fib::@return: scope:[fib] from fib::@1 fib::@2
|
||||
[12] fib::return#2 = phi( fib::@1/fib::return#3, fib::@2/fib::return#1 )
|
||||
[13] stackidx(char,fib::OFFSET_STACK_RETURN_0) = fib::return#2
|
||||
[14] return
|
||||
to:@return
|
||||
fib::@1: scope:[fib] from fib fib::@3
|
||||
[15] fib::return#3 = fib::n#0
|
||||
to:fib::@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[16] stackpush(char) = 5
|
||||
[17] callexecute fib
|
||||
[18] main::$0 = stackpull(char)
|
||||
[19] *SCREEN = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[20] return
|
||||
to:@return
|
1527
src/test/ref/procedure-callingconvention-stack-far-3.log
Normal file
1527
src/test/ref/procedure-callingconvention-stack-far-3.log
Normal file
File diff suppressed because it is too large
Load Diff
25
src/test/ref/procedure-callingconvention-stack-far-3.sym
Normal file
25
src/test/ref/procedure-callingconvention-stack-far-3.sym
Normal file
@ -0,0 +1,25 @@
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
__far(bank) __stackcall char fib(char n)
|
||||
char fib::$3 // reg byte a 22.0
|
||||
char fib::$4 // zp[1]:3 1.375
|
||||
char fib::$5 // reg byte a 22.0
|
||||
char fib::$6 // reg byte a 22.0
|
||||
__constant char fib::OFFSET_STACK_N = 0
|
||||
__constant char fib::OFFSET_STACK_RETURN_0 = 0
|
||||
char fib::n
|
||||
char fib::n#0 // n zp[1]:2 5.5
|
||||
char fib::return
|
||||
char fib::return#1 // reg byte a 22.0
|
||||
char fib::return#2 // reg byte a 33.0
|
||||
char fib::return#3 // reg byte a 22.0
|
||||
void main()
|
||||
char main::$0 // reg byte a 4.0
|
||||
|
||||
reg byte a [ fib::return#2 fib::return#3 fib::return#1 ]
|
||||
zp[1]:2 [ fib::n#0 ]
|
||||
reg byte a [ fib::$3 ]
|
||||
zp[1]:3 [ fib::$4 ]
|
||||
reg byte a [ fib::$5 ]
|
||||
reg byte a [ fib::$6 ]
|
||||
reg byte a [ main::$0 ]
|
76
src/test/ref/procedure-callingconvention-stack-far-4.asm
Normal file
76
src/test/ref/procedure-callingconvention-stack-far-4.asm
Normal file
@ -0,0 +1,76 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// Illustrates live range problem with function variable printother::i and global variable val
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-4.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
.label SCREEN = $400
|
||||
.label val = 2
|
||||
.segment Code
|
||||
__start: {
|
||||
// char val = 0
|
||||
lda #0
|
||||
sta.z val
|
||||
jsr main
|
||||
rts
|
||||
}
|
||||
printother: {
|
||||
ldx #0
|
||||
__b1:
|
||||
// (SCREEN+40)[i]++;
|
||||
inc SCREEN+$28,x
|
||||
// for(char i:0..5)
|
||||
inx
|
||||
cpx #6
|
||||
bne __b1
|
||||
// }
|
||||
rts
|
||||
}
|
||||
incval: {
|
||||
// val++;
|
||||
inc.z val
|
||||
// }
|
||||
rts
|
||||
}
|
||||
printval: {
|
||||
// SCREEN[0] = val
|
||||
lda.z val
|
||||
sta SCREEN
|
||||
// }
|
||||
rts
|
||||
}
|
||||
ival: {
|
||||
// incval()
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// }
|
||||
rts
|
||||
}
|
||||
pval: {
|
||||
// printval()
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// }
|
||||
rts
|
||||
}
|
||||
main: {
|
||||
.label i = 3
|
||||
lda #0
|
||||
sta.z i
|
||||
__b1:
|
||||
// pval()
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// printother()
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// ival()
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// for(char i:0..5)
|
||||
inc.z i
|
||||
lda #6
|
||||
cmp.z i
|
||||
bne __b1
|
||||
// }
|
||||
rts
|
||||
}
|
79
src/test/ref/procedure-callingconvention-stack-far-4.cfg
Normal file
79
src/test/ref/procedure-callingconvention-stack-far-4.cfg
Normal file
@ -0,0 +1,79 @@
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
[0] phi()
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
[1] val = 0
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
[2] phi()
|
||||
[3] callexecute main
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@1
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void printother()
|
||||
printother: scope:[printother] from
|
||||
[5] phi()
|
||||
to:printother::@1
|
||||
printother::@1: scope:[printother] from printother printother::@1
|
||||
[6] printother::i#2 = phi( printother/0, printother::@1/printother::i#1 )
|
||||
[7] (SCREEN+$28)[printother::i#2] = ++ (SCREEN+$28)[printother::i#2]
|
||||
[8] printother::i#1 = ++ printother::i#2
|
||||
[9] if(printother::i#1!=6) goto printother::@1
|
||||
to:printother::@return
|
||||
printother::@return: scope:[printother] from printother::@1
|
||||
[10] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void incval()
|
||||
incval: scope:[incval] from
|
||||
[11] val = ++ val
|
||||
to:incval::@return
|
||||
incval::@return: scope:[incval] from incval
|
||||
[12] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void printval()
|
||||
printval: scope:[printval] from
|
||||
[13] *SCREEN = val
|
||||
to:printval::@return
|
||||
printval::@return: scope:[printval] from printval
|
||||
[14] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void ival()
|
||||
ival: scope:[ival] from
|
||||
[15] phi()
|
||||
[16] callexecute incval
|
||||
to:ival::@return
|
||||
ival::@return: scope:[ival] from ival
|
||||
[17] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void pval()
|
||||
pval: scope:[pval] from
|
||||
[18] phi()
|
||||
[19] callexecute printval
|
||||
to:pval::@return
|
||||
pval::@return: scope:[pval] from pval
|
||||
[20] return
|
||||
to:@return
|
||||
|
||||
__stackcall void main()
|
||||
main: scope:[main] from
|
||||
[21] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[22] main::i#2 = phi( main/0, main::@1/main::i#1 )
|
||||
[23] callexecute pval
|
||||
[24] callexecute printother
|
||||
[25] callexecute ival
|
||||
[26] main::i#1 = ++ main::i#2
|
||||
[27] if(main::i#1!=6) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[28] return
|
||||
to:@return
|
924
src/test/ref/procedure-callingconvention-stack-far-4.log
Normal file
924
src/test/ref/procedure-callingconvention-stack-far-4.log
Normal file
@ -0,0 +1,924 @@
|
||||
Converting variable modified inside __stackcall procedure main() to load/store val
|
||||
Inlined call call __init
|
||||
Far call main::$0 = call pval
|
||||
Far call main::$1 = call printother
|
||||
Far call main::$2 = call ival
|
||||
Far call pval::$0 = call printval
|
||||
Far call ival::$0 = call incval
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call pval
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call printother
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call ival
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call printval
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call incval
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call main
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
__stackcall void main()
|
||||
main: scope:[main] from
|
||||
main::i#0 = 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
main::i#2 = phi( main/main::i#0, main::@1/main::i#1 )
|
||||
callexecute pval
|
||||
callexecute printother
|
||||
callexecute ival
|
||||
main::i#1 = main::i#2 + rangenext(0,5)
|
||||
main::$3 = main::i#1 != rangelast(0,5)
|
||||
if(main::$3) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void pval()
|
||||
pval: scope:[pval] from
|
||||
callexecute printval
|
||||
to:pval::@return
|
||||
pval::@return: scope:[pval] from pval
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void ival()
|
||||
ival: scope:[ival] from
|
||||
callexecute incval
|
||||
to:ival::@return
|
||||
ival::@return: scope:[ival] from ival
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void printval()
|
||||
printval: scope:[printval] from
|
||||
SCREEN[0] = val
|
||||
to:printval::@return
|
||||
printval::@return: scope:[printval] from printval
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void incval()
|
||||
incval: scope:[incval] from
|
||||
val = ++ val
|
||||
to:incval::@return
|
||||
incval::@return: scope:[incval] from incval
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void printother()
|
||||
printother: scope:[printother] from
|
||||
printother::i#0 = 0
|
||||
to:printother::@1
|
||||
printother::@1: scope:[printother] from printother printother::@1
|
||||
printother::i#2 = phi( printother/printother::i#0, printother::@1/printother::i#1 )
|
||||
(SCREEN+$28)[printother::i#2] = ++ (SCREEN+$28)[printother::i#2]
|
||||
printother::i#1 = printother::i#2 + rangenext(0,5)
|
||||
printother::$1 = printother::i#1 != rangelast(0,5)
|
||||
if(printother::$1) goto printother::@1
|
||||
to:printother::@return
|
||||
printother::@return: scope:[printother] from printother::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
val = 0
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
callexecute main
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
__constant char * const SCREEN = (char *)$400
|
||||
void __start()
|
||||
__far(bank) __stackcall void incval()
|
||||
__far(bank) __stackcall void ival()
|
||||
__stackcall void main()
|
||||
bool main::$3
|
||||
char main::i
|
||||
char main::i#0
|
||||
char main::i#1
|
||||
char main::i#2
|
||||
__far(bank) __stackcall void printother()
|
||||
bool printother::$1
|
||||
char printother::i
|
||||
char printother::i#0
|
||||
char printother::i#1
|
||||
char printother::i#2
|
||||
__far(bank) __stackcall void printval()
|
||||
__far(bank) __stackcall void pval()
|
||||
__loadstore char val
|
||||
|
||||
Adding number conversion cast (unumber) 0 in SCREEN[0] = val
|
||||
Adding number conversion cast (unumber) $28 in (SCREEN+$28)[printother::i#2] = ++ (SCREEN+$28)[printother::i#2]
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant pointer cast (char *) 1024
|
||||
Simplifying constant integer cast 0
|
||||
Simplifying constant integer cast $28
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 0
|
||||
Finalized unsigned number type (char) $28
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Simple Condition main::$3 [7] if(main::i#1!=rangelast(0,5)) goto main::@1
|
||||
Simple Condition printother::$1 [22] if(printother::i#1!=rangelast(0,5)) goto printother::@1
|
||||
Successful SSA optimization Pass2ConditionalJumpSimplification
|
||||
Constant main::i#0 = 0
|
||||
Constant printother::i#0 = 0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Resolved ranged next value [5] main::i#1 = ++ main::i#2 to ++
|
||||
Resolved ranged comparison value [7] if(main::i#1!=rangelast(0,5)) goto main::@1 to 6
|
||||
Resolved ranged next value [20] printother::i#1 = ++ printother::i#2 to ++
|
||||
Resolved ranged comparison value [22] if(printother::i#1!=rangelast(0,5)) goto printother::@1 to 6
|
||||
Simplifying expression containing zero SCREEN in [13] SCREEN[0] = val
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Adding number conversion cast (unumber) 6 in if(main::i#1!=6) goto main::@1
|
||||
Adding number conversion cast (unumber) 6 in if(printother::i#1!=6) goto printother::@1
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant integer cast 6
|
||||
Simplifying constant integer cast 6
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 6
|
||||
Finalized unsigned number type (char) 6
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Inlining constant with var siblings main::i#0
|
||||
Inlining constant with var siblings printother::i#0
|
||||
Constant inlined main::i#0 = 0
|
||||
Constant inlined printother::i#0 = 0
|
||||
Successful SSA optimization Pass2ConstantInlining
|
||||
Added new block during phi lifting main::@2(between main::@1 and main::@1)
|
||||
Added new block during phi lifting printother::@2(between printother::@1 and printother::@1)
|
||||
Adding NOP phi() at start of __start
|
||||
Adding NOP phi() at start of __start::@1
|
||||
Adding NOP phi() at start of printother
|
||||
Adding NOP phi() at start of ival
|
||||
Adding NOP phi() at start of pval
|
||||
Adding NOP phi() at start of main
|
||||
CALL GRAPH
|
||||
Calls in [__start] to main:3
|
||||
Calls in [ival] to incval:17
|
||||
Calls in [pval] to printval:20
|
||||
Calls in [main] to pval:24 printother:25 ival:26
|
||||
|
||||
Created 2 initial phi equivalence classes
|
||||
Coalesced [11] printother::i#3 = printother::i#1
|
||||
Coalesced [30] main::i#3 = main::i#1
|
||||
Coalesced down to 2 phi equivalence classes
|
||||
Culled Empty Block label printother::@2
|
||||
Culled Empty Block label main::@2
|
||||
Adding NOP phi() at start of __start
|
||||
Adding NOP phi() at start of __start::@1
|
||||
Adding NOP phi() at start of printother
|
||||
Adding NOP phi() at start of ival
|
||||
Adding NOP phi() at start of pval
|
||||
Adding NOP phi() at start of main
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
[0] phi()
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
[1] val = 0
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
[2] phi()
|
||||
[3] callexecute main
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@1
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void printother()
|
||||
printother: scope:[printother] from
|
||||
[5] phi()
|
||||
to:printother::@1
|
||||
printother::@1: scope:[printother] from printother printother::@1
|
||||
[6] printother::i#2 = phi( printother/0, printother::@1/printother::i#1 )
|
||||
[7] (SCREEN+$28)[printother::i#2] = ++ (SCREEN+$28)[printother::i#2]
|
||||
[8] printother::i#1 = ++ printother::i#2
|
||||
[9] if(printother::i#1!=6) goto printother::@1
|
||||
to:printother::@return
|
||||
printother::@return: scope:[printother] from printother::@1
|
||||
[10] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void incval()
|
||||
incval: scope:[incval] from
|
||||
[11] val = ++ val
|
||||
to:incval::@return
|
||||
incval::@return: scope:[incval] from incval
|
||||
[12] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void printval()
|
||||
printval: scope:[printval] from
|
||||
[13] *SCREEN = val
|
||||
to:printval::@return
|
||||
printval::@return: scope:[printval] from printval
|
||||
[14] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void ival()
|
||||
ival: scope:[ival] from
|
||||
[15] phi()
|
||||
[16] callexecute incval
|
||||
to:ival::@return
|
||||
ival::@return: scope:[ival] from ival
|
||||
[17] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void pval()
|
||||
pval: scope:[pval] from
|
||||
[18] phi()
|
||||
[19] callexecute printval
|
||||
to:pval::@return
|
||||
pval::@return: scope:[pval] from pval
|
||||
[20] return
|
||||
to:@return
|
||||
|
||||
__stackcall void main()
|
||||
main: scope:[main] from
|
||||
[21] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@1
|
||||
[22] main::i#2 = phi( main/0, main::@1/main::i#1 )
|
||||
[23] callexecute pval
|
||||
[24] callexecute printother
|
||||
[25] callexecute ival
|
||||
[26] main::i#1 = ++ main::i#2
|
||||
[27] if(main::i#1!=6) goto main::@1
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[28] return
|
||||
to:@return
|
||||
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@1 blocks: main::@1 in scope printother
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@1 blocks: main::@1 in scope ival
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@1 blocks: main::@1 in scope pval
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@1 blocks: main::@1 in scope ival
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@1 blocks: main::@1 in scope pval
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
void __start()
|
||||
__far(bank) __stackcall void incval()
|
||||
__far(bank) __stackcall void ival()
|
||||
__stackcall void main()
|
||||
char main::i
|
||||
char main::i#1 // 151.5
|
||||
char main::i#2 // 50.5
|
||||
__far(bank) __stackcall void printother()
|
||||
char printother::i
|
||||
char printother::i#1 // 15001.5
|
||||
char printother::i#2 // 20002.0
|
||||
__far(bank) __stackcall void printval()
|
||||
__far(bank) __stackcall void pval()
|
||||
__loadstore char val // 1579.2105263157896
|
||||
|
||||
Initial phi equivalence classes
|
||||
[ printother::i#2 printother::i#1 ]
|
||||
[ main::i#2 main::i#1 ]
|
||||
Added variable val to live range equivalence class [ val ]
|
||||
Complete equivalence classes
|
||||
[ printother::i#2 printother::i#1 ]
|
||||
[ main::i#2 main::i#1 ]
|
||||
[ val ]
|
||||
Allocated zp[1]:2 [ printother::i#2 printother::i#1 ]
|
||||
Allocated zp[1]:3 [ val ]
|
||||
Allocated zp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [1] val = 0 [ val ] ( [ val ] { } ) always clobbers reg byte a
|
||||
Statement [13] *SCREEN = val [ val ] ( main:3::pval:23::printval:19 [ main::i#2 val ] { } ) always clobbers reg byte a
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Potential register analysis [16] callexecute incval missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [16] callexecute incval [ val ] ( main:3::ival:25 [ main::i#2 val ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Removing always clobbered register reg byte x as potential for zp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Removing always clobbered register reg byte y as potential for zp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Potential register analysis [19] callexecute printval missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [19] callexecute printval [ val ] ( main:3::pval:23 [ main::i#2 val ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Potential register analysis [23] callexecute pval missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [23] callexecute pval [ val main::i#2 ] ( main:3 [ val main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Potential register analysis [24] callexecute printother missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [24] callexecute printother [ val main::i#2 ] ( main:3 [ val main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Potential register analysis [25] callexecute ival missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [25] callexecute ival [ val main::i#2 ] ( main:3 [ val main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement [27] if(main::i#1!=6) goto main::@1 [ val main::i#1 ] ( main:3 [ val main::i#1 ] { } ) always clobbers reg byte a
|
||||
Statement [1] val = 0 [ val ] ( [ val ] { } ) always clobbers reg byte a
|
||||
Statement [13] *SCREEN = val [ val ] ( main:3::pval:23::printval:19 [ main::i#2 val ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [16] callexecute incval missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [16] callexecute incval [ val ] ( main:3::ival:25 [ main::i#2 val ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Potential register analysis [19] callexecute printval missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [19] callexecute printval [ val ] ( main:3::pval:23 [ main::i#2 val ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Potential register analysis [23] callexecute pval missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [23] callexecute pval [ val main::i#2 ] ( main:3 [ val main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Potential register analysis [24] callexecute printother missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [24] callexecute printother [ val main::i#2 ] ( main:3 [ val main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Potential register analysis [25] callexecute ival missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [25] callexecute ival [ val main::i#2 ] ( main:3 [ val main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement [27] if(main::i#1!=6) goto main::@1 [ val main::i#1 ] ( main:3 [ val main::i#1 ] { } ) always clobbers reg byte a
|
||||
Potential registers zp[1]:2 [ printother::i#2 printother::i#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:4 [ main::i#2 main::i#1 ] : zp[1]:4 ,
|
||||
Potential registers zp[1]:3 [ val ] : zp[1]:3 ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [printother] 35,003.5: zp[1]:2 [ printother::i#2 printother::i#1 ]
|
||||
Uplift Scope [] 1,579.21: zp[1]:3 [ val ]
|
||||
Uplift Scope [main] 202: zp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Uplift Scope [pval]
|
||||
Uplift Scope [ival]
|
||||
Uplift Scope [printval]
|
||||
Uplift Scope [incval]
|
||||
Uplift Scope [__start]
|
||||
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [printother] best 623 combination reg byte x [ printother::i#2 printother::i#1 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [] best 623 combination zp[1]:3 [ val ]
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [main] best 623 combination zp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [pval] best 623 combination
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [ival] best 623 combination
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [printval] best 623 combination
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [incval] best 623 combination
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [__start] best 623 combination
|
||||
Attempting to uplift remaining variables inzp[1]:3 [ val ]
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [] best 623 combination zp[1]:3 [ val ]
|
||||
Attempting to uplift remaining variables inzp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
Uplifting [main] best 623 combination zp[1]:4 [ main::i#2 main::i#1 ]
|
||||
Allocated (was zp[1]:3) zp[1]:2 [ val ]
|
||||
Allocated (was zp[1]:4) zp[1]:3 [ main::i#2 main::i#1 ]
|
||||
Warning! Unknown fragment for statement [16] callexecute incval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:23:5:
|
||||
Warning! Unknown fragment for statement [19] callexecute printval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:19:5:
|
||||
Warning! Unknown fragment for statement [23] callexecute pval
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:12:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute printother
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:13:9:
|
||||
Warning! Unknown fragment for statement [25] callexecute ival
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-4.c:14:9:
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Illustrates live range problem with function variable printother::i and global variable val
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-4.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
.label val = 2
|
||||
.segment Code
|
||||
// __start
|
||||
__start: {
|
||||
jmp __init1
|
||||
// __start::__init1
|
||||
__init1:
|
||||
// [1] val = 0 -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z val
|
||||
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
|
||||
__b1_from___init1:
|
||||
jmp __b1
|
||||
// __start::@1
|
||||
__b1:
|
||||
// [3] callexecute main -- call_vprc1
|
||||
jsr main
|
||||
jmp __breturn
|
||||
// __start::@return
|
||||
__breturn:
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// printother
|
||||
printother: {
|
||||
// [6] phi from printother to printother::@1 [phi:printother->printother::@1]
|
||||
__b1_from_printother:
|
||||
// [6] phi printother::i#2 = 0 [phi:printother->printother::@1#0] -- vbuxx=vbuc1
|
||||
ldx #0
|
||||
jmp __b1
|
||||
// [6] phi from printother::@1 to printother::@1 [phi:printother::@1->printother::@1]
|
||||
__b1_from___b1:
|
||||
// [6] phi printother::i#2 = printother::i#1 [phi:printother::@1->printother::@1#0] -- register_copy
|
||||
jmp __b1
|
||||
// printother::@1
|
||||
__b1:
|
||||
// [7] (SCREEN+$28)[printother::i#2] = ++ (SCREEN+$28)[printother::i#2] -- pbuc1_derefidx_vbuxx=_inc_pbuc1_derefidx_vbuxx
|
||||
inc SCREEN+$28,x
|
||||
// [8] printother::i#1 = ++ printother::i#2 -- vbuxx=_inc_vbuxx
|
||||
inx
|
||||
// [9] if(printother::i#1!=6) goto printother::@1 -- vbuxx_neq_vbuc1_then_la1
|
||||
cpx #6
|
||||
bne __b1_from___b1
|
||||
jmp __breturn
|
||||
// printother::@return
|
||||
__breturn:
|
||||
// [10] return
|
||||
rts
|
||||
}
|
||||
// incval
|
||||
incval: {
|
||||
// [11] val = ++ val -- vbuz1=_inc_vbuz1
|
||||
inc.z val
|
||||
jmp __breturn
|
||||
// incval::@return
|
||||
__breturn:
|
||||
// [12] return
|
||||
rts
|
||||
}
|
||||
// printval
|
||||
printval: {
|
||||
// [13] *SCREEN = val -- _deref_pbuc1=vbuz1
|
||||
lda.z val
|
||||
sta SCREEN
|
||||
jmp __breturn
|
||||
// printval::@return
|
||||
__breturn:
|
||||
// [14] return
|
||||
rts
|
||||
}
|
||||
// ival
|
||||
ival: {
|
||||
// [16] callexecute incval
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
jmp __breturn
|
||||
// ival::@return
|
||||
__breturn:
|
||||
// [17] return
|
||||
rts
|
||||
}
|
||||
// pval
|
||||
pval: {
|
||||
// [19] callexecute printval
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
jmp __breturn
|
||||
// pval::@return
|
||||
__breturn:
|
||||
// [20] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
.label i = 3
|
||||
// [22] phi from main to main::@1 [phi:main->main::@1]
|
||||
__b1_from_main:
|
||||
// [22] phi main::i#2 = 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z i
|
||||
jmp __b1
|
||||
// [22] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||
__b1_from___b1:
|
||||
// [22] phi main::i#2 = main::i#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [23] callexecute pval
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// [24] callexecute printother
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// [25] callexecute ival
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// [26] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z i
|
||||
// [27] if(main::i#1!=6) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
|
||||
lda #6
|
||||
cmp.z i
|
||||
bne __b1_from___b1
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [28] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __init1
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Replacing label __b1_from___b1 with __b1
|
||||
Replacing label __b1_from___b1 with __b1
|
||||
Removing instruction __b1_from___init1:
|
||||
Removing instruction __b1_from___b1:
|
||||
Removing instruction __b1_from___b1:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
Removing instruction __init1:
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __b1_from_printother:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __b1_from_main:
|
||||
Removing instruction __breturn:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __b1
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
void __start()
|
||||
__far(bank) __stackcall void incval()
|
||||
__far(bank) __stackcall void ival()
|
||||
__stackcall void main()
|
||||
char main::i
|
||||
char main::i#1 // i zp[1]:3 151.5
|
||||
char main::i#2 // i zp[1]:3 50.5
|
||||
__far(bank) __stackcall void printother()
|
||||
char printother::i
|
||||
char printother::i#1 // reg byte x 15001.5
|
||||
char printother::i#2 // reg byte x 20002.0
|
||||
__far(bank) __stackcall void printval()
|
||||
__far(bank) __stackcall void pval()
|
||||
__loadstore char val // zp[1]:2 1579.2105263157896
|
||||
|
||||
reg byte x [ printother::i#2 printother::i#1 ]
|
||||
zp[1]:3 [ main::i#2 main::i#1 ]
|
||||
zp[1]:2 [ val ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 395
|
||||
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Illustrates live range problem with function variable printother::i and global variable val
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-4.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
// Global Constants & labels
|
||||
.label SCREEN = $400
|
||||
.label val = 2
|
||||
.segment Code
|
||||
// __start
|
||||
__start: {
|
||||
// __start::__init1
|
||||
// char val = 0
|
||||
// [1] val = 0 -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z val
|
||||
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
|
||||
// __start::@1
|
||||
// [3] callexecute main -- call_vprc1
|
||||
jsr main
|
||||
// __start::@return
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// printother
|
||||
printother: {
|
||||
// [6] phi from printother to printother::@1 [phi:printother->printother::@1]
|
||||
// [6] phi printother::i#2 = 0 [phi:printother->printother::@1#0] -- vbuxx=vbuc1
|
||||
ldx #0
|
||||
// [6] phi from printother::@1 to printother::@1 [phi:printother::@1->printother::@1]
|
||||
// [6] phi printother::i#2 = printother::i#1 [phi:printother::@1->printother::@1#0] -- register_copy
|
||||
// printother::@1
|
||||
__b1:
|
||||
// (SCREEN+40)[i]++;
|
||||
// [7] (SCREEN+$28)[printother::i#2] = ++ (SCREEN+$28)[printother::i#2] -- pbuc1_derefidx_vbuxx=_inc_pbuc1_derefidx_vbuxx
|
||||
inc SCREEN+$28,x
|
||||
// for(char i:0..5)
|
||||
// [8] printother::i#1 = ++ printother::i#2 -- vbuxx=_inc_vbuxx
|
||||
inx
|
||||
// [9] if(printother::i#1!=6) goto printother::@1 -- vbuxx_neq_vbuc1_then_la1
|
||||
cpx #6
|
||||
bne __b1
|
||||
// printother::@return
|
||||
// }
|
||||
// [10] return
|
||||
rts
|
||||
}
|
||||
// incval
|
||||
incval: {
|
||||
// val++;
|
||||
// [11] val = ++ val -- vbuz1=_inc_vbuz1
|
||||
inc.z val
|
||||
// incval::@return
|
||||
// }
|
||||
// [12] return
|
||||
rts
|
||||
}
|
||||
// printval
|
||||
printval: {
|
||||
// SCREEN[0] = val
|
||||
// [13] *SCREEN = val -- _deref_pbuc1=vbuz1
|
||||
lda.z val
|
||||
sta SCREEN
|
||||
// printval::@return
|
||||
// }
|
||||
// [14] return
|
||||
rts
|
||||
}
|
||||
// ival
|
||||
ival: {
|
||||
// incval()
|
||||
// [16] callexecute incval
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// ival::@return
|
||||
// }
|
||||
// [17] return
|
||||
rts
|
||||
}
|
||||
// pval
|
||||
pval: {
|
||||
// printval()
|
||||
// [19] callexecute printval
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// pval::@return
|
||||
// }
|
||||
// [20] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
.label i = 3
|
||||
// [22] phi from main to main::@1 [phi:main->main::@1]
|
||||
// [22] phi main::i#2 = 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z i
|
||||
// [22] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
|
||||
// [22] phi main::i#2 = main::i#1 [phi:main::@1->main::@1#0] -- register_copy
|
||||
// main::@1
|
||||
__b1:
|
||||
// pval()
|
||||
// [23] callexecute pval
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// printother()
|
||||
// [24] callexecute printother
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// ival()
|
||||
// [25] callexecute ival
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// for(char i:0..5)
|
||||
// [26] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z i
|
||||
// [27] if(main::i#1!=6) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
|
||||
lda #6
|
||||
cmp.z i
|
||||
bne __b1
|
||||
// main::@return
|
||||
// }
|
||||
// [28] return
|
||||
rts
|
||||
}
|
||||
// File Data
|
||||
|
19
src/test/ref/procedure-callingconvention-stack-far-4.sym
Normal file
19
src/test/ref/procedure-callingconvention-stack-far-4.sym
Normal file
@ -0,0 +1,19 @@
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
void __start()
|
||||
__far(bank) __stackcall void incval()
|
||||
__far(bank) __stackcall void ival()
|
||||
__stackcall void main()
|
||||
char main::i
|
||||
char main::i#1 // i zp[1]:3 151.5
|
||||
char main::i#2 // i zp[1]:3 50.5
|
||||
__far(bank) __stackcall void printother()
|
||||
char printother::i
|
||||
char printother::i#1 // reg byte x 15001.5
|
||||
char printother::i#2 // reg byte x 20002.0
|
||||
__far(bank) __stackcall void printval()
|
||||
__far(bank) __stackcall void pval()
|
||||
__loadstore char val // zp[1]:2 1579.2105263157896
|
||||
|
||||
reg byte x [ printother::i#2 printother::i#1 ]
|
||||
zp[1]:3 [ main::i#2 main::i#1 ]
|
||||
zp[1]:2 [ val ]
|
110
src/test/ref/procedure-callingconvention-stack-far-5.asm
Normal file
110
src/test/ref/procedure-callingconvention-stack-far-5.asm
Normal file
@ -0,0 +1,110 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// Returning and passing struct values
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-5.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
.const OFFSET_STRUCT_POINT_Y = 1
|
||||
.const SIZEOF_STRUCT_POINT = 2
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.label idx = 4
|
||||
.segment Code
|
||||
__start: {
|
||||
// char idx = 0
|
||||
lda #0
|
||||
sta.z idx
|
||||
jsr main
|
||||
rts
|
||||
}
|
||||
// void print(__zp(2) struct Point p)
|
||||
print: {
|
||||
.const OFFSET_STACK_P = 0
|
||||
.label p = 2
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_P,x
|
||||
sta.z p
|
||||
lda STACK_BASE+OFFSET_STACK_P+1,x
|
||||
sta.z p+1
|
||||
// SCREEN[idx++] = p.x
|
||||
lda.z p
|
||||
ldy.z idx
|
||||
sta SCREEN,y
|
||||
// SCREEN[idx++] = p.x;
|
||||
inc.z idx
|
||||
// SCREEN[idx++] = p.y
|
||||
lda.z p+OFFSET_STRUCT_POINT_Y
|
||||
ldy.z idx
|
||||
sta SCREEN,y
|
||||
// SCREEN[idx++] = p.y;
|
||||
inc.z idx
|
||||
// }
|
||||
rts
|
||||
}
|
||||
// __zp(6) struct Point get(__register(X) char i)
|
||||
get: {
|
||||
.const OFFSET_STACK_I = 0
|
||||
.const OFFSET_STACK_RETURN_0 = 0
|
||||
.label return = 6
|
||||
.label p = 8
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_I,x
|
||||
tax
|
||||
// i/2
|
||||
txa
|
||||
lsr
|
||||
// struct Point p = { i, i/2 }
|
||||
stx.z p
|
||||
sta.z p+OFFSET_STRUCT_POINT_Y
|
||||
// return p;
|
||||
ldy #SIZEOF_STRUCT_POINT
|
||||
!:
|
||||
lda p-1,y
|
||||
sta return-1,y
|
||||
dey
|
||||
bne !-
|
||||
// }
|
||||
tsx
|
||||
lda.z return
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0,x
|
||||
lda.z return+1
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0+1,x
|
||||
rts
|
||||
}
|
||||
main: {
|
||||
.label p = 2
|
||||
.label i = 5
|
||||
lda #0
|
||||
sta.z i
|
||||
__b1:
|
||||
// for(char i=0;i<5;i++)
|
||||
lda.z i
|
||||
cmp #5
|
||||
bcc __b2
|
||||
// }
|
||||
rts
|
||||
__b2:
|
||||
// struct Point p = get(i)
|
||||
lda.z i
|
||||
pha
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
sta.z p
|
||||
pla
|
||||
sta.z p+1
|
||||
// print(p)
|
||||
pha
|
||||
lda.z p
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
pla
|
||||
// for(char i=0;i<5;i++)
|
||||
inc.z i
|
||||
jmp __b1
|
||||
}
|
62
src/test/ref/procedure-callingconvention-stack-far-5.cfg
Normal file
62
src/test/ref/procedure-callingconvention-stack-far-5.cfg
Normal file
@ -0,0 +1,62 @@
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
[0] phi()
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
[1] idx = 0
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
[2] phi()
|
||||
[3] callexecute main
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@1
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void print(struct Point p)
|
||||
print: scope:[print] from
|
||||
[5] print::p = stackidx(struct Point,print::OFFSET_STACK_P)
|
||||
[6] SCREEN[idx] = *((char *)&print::p)
|
||||
[7] idx = ++ idx
|
||||
[8] SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_Y)
|
||||
[9] idx = ++ idx
|
||||
to:print::@return
|
||||
print::@return: scope:[print] from print
|
||||
[10] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall struct Point get(char i)
|
||||
get: scope:[get] from
|
||||
[11] get::i#0 = stackidx(char,get::OFFSET_STACK_I)
|
||||
[12] get::$0 = get::i#0 >> 1
|
||||
[13] *((char *)&get::p) = get::i#0
|
||||
[14] *((char *)&get::p+OFFSET_STRUCT_POINT_Y) = get::$0
|
||||
[15] *(&get::return) = memcpy(*(&get::p), struct Point, SIZEOF_STRUCT_POINT)
|
||||
to:get::@return
|
||||
get::@return: scope:[get] from get
|
||||
[16] stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return
|
||||
[17] return
|
||||
to:@return
|
||||
|
||||
__stackcall void main()
|
||||
main: scope:[main] from
|
||||
[18] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2
|
||||
[19] main::i#2 = phi( main/0, main::@2/main::i#1 )
|
||||
[20] if(main::i#2<5) goto main::@2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[21] return
|
||||
to:@return
|
||||
main::@2: scope:[main] from main::@1
|
||||
[22] stackpush(char) = main::i#2
|
||||
sideeffect stackpushpadding(1)
|
||||
[24] callexecute get
|
||||
[25] main::p = stackpull(struct Point)
|
||||
[26] stackpush(struct Point) = main::p
|
||||
[27] callexecute print
|
||||
sideeffect stackpullpadding(2)
|
||||
[29] main::i#1 = ++ main::i#2
|
||||
to:main::@1
|
845
src/test/ref/procedure-callingconvention-stack-far-5.log
Normal file
845
src/test/ref/procedure-callingconvention-stack-far-5.log
Normal file
@ -0,0 +1,845 @@
|
||||
Converting variable modified inside __stackcall procedure main() to load/store idx
|
||||
Adding parameter assignment in __stackcall procedure get::i = param(get::i)
|
||||
Adding parameter assignment in __stackcall procedure print::p = param(print::p)
|
||||
Inlined call call __init
|
||||
Far call main::p = call get(main::i)
|
||||
Far call main::$2 = call print(main::p)
|
||||
Eliminating unused variable with no statement main::$1
|
||||
Calling convention __stackcall adding prepare/execute/finalize for main::p = call get(main::i)
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call print(main::p)
|
||||
Calling convention __stackcall adding prepare/execute/finalize for call main
|
||||
Calling convention STACK_CALL replacing param(get::i) with stackidx(char,get::OFFSET_STACK_I)
|
||||
Calling convention STACK_CALL replacing param(print::p) with stackidx(struct Point,print::OFFSET_STACK_P)
|
||||
Calling convention STACK_CALL adding stack return stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return
|
||||
Calling convention STACK_CALL adding stack pull main::p = stackpull(struct Point)
|
||||
Calling convention STACK_CALL adding stack push stackpush(char) = main::i
|
||||
Calling convention STACK_CALL adding stack push stackpush(struct Point) = main::p
|
||||
Removing C-classic struct-unwound assignment get::p = struct-unwound {*((char *)&get::p+OFFSET_STRUCT_POINT_X), *((char *)&get::p+OFFSET_STRUCT_POINT_Y)}
|
||||
Removing C-classic struct-unwound assignment get::return = struct-unwound {*(&get::return)}
|
||||
|
||||
CONTROL FLOW GRAPH SSA
|
||||
|
||||
__stackcall void main()
|
||||
main: scope:[main] from
|
||||
main::i#0 = 0
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2
|
||||
main::i#2 = phi( main/main::i#0, main::@2/main::i#1 )
|
||||
main::$0 = main::i#2 < 5
|
||||
if(main::$0) goto main::@2
|
||||
to:main::@return
|
||||
main::@2: scope:[main] from main::@1
|
||||
main::i#3 = phi( main::@1/main::i#2 )
|
||||
stackpush(char) = main::i#3
|
||||
sideeffect stackpushpadding(1)
|
||||
callexecute get
|
||||
main::p = stackpull(struct Point)
|
||||
stackpush(struct Point) = main::p
|
||||
callexecute print
|
||||
sideeffect stackpullpadding(2)
|
||||
main::i#1 = ++ main::i#3
|
||||
to:main::@1
|
||||
main::@return: scope:[main] from main::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall struct Point get(char i)
|
||||
get: scope:[get] from
|
||||
get::i#0 = stackidx(char,get::OFFSET_STACK_I)
|
||||
get::$0 = get::i#0 / 2
|
||||
*((char *)&get::p+OFFSET_STRUCT_POINT_X) = get::i#0
|
||||
*((char *)&get::p+OFFSET_STRUCT_POINT_Y) = get::$0
|
||||
*(&get::return) = memcpy(*(&get::p), struct Point, SIZEOF_STRUCT_POINT)
|
||||
to:get::@return
|
||||
get::@return: scope:[get] from get
|
||||
stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return
|
||||
return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void print(struct Point p)
|
||||
print: scope:[print] from
|
||||
print::p = stackidx(struct Point,print::OFFSET_STACK_P)
|
||||
SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_X)
|
||||
idx = ++ idx
|
||||
SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_Y)
|
||||
idx = ++ idx
|
||||
to:print::@return
|
||||
print::@return: scope:[print] from print
|
||||
return
|
||||
to:@return
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
idx = 0
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
callexecute main
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@1
|
||||
return
|
||||
to:@return
|
||||
|
||||
SYMBOL TABLE SSA
|
||||
__constant char OFFSET_STRUCT_POINT_X = 0
|
||||
__constant char OFFSET_STRUCT_POINT_Y = 1
|
||||
__constant char * const SCREEN = (char *)$400
|
||||
__constant char SIZEOF_STRUCT_POINT = 2
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
__far(bank) __stackcall struct Point get(char i)
|
||||
number get::$0
|
||||
__constant char get::OFFSET_STACK_I = 0
|
||||
__constant char get::OFFSET_STACK_RETURN_0 = 0
|
||||
char get::i
|
||||
char get::i#0
|
||||
__loadstore struct Point get::p
|
||||
__loadstore struct Point get::return
|
||||
__loadstore char idx
|
||||
__stackcall void main()
|
||||
bool main::$0
|
||||
char main::i
|
||||
char main::i#0
|
||||
char main::i#1
|
||||
char main::i#2
|
||||
char main::i#3
|
||||
__loadstore struct Point main::p
|
||||
__far(bank) __stackcall void print(struct Point p)
|
||||
__constant char print::OFFSET_STACK_P = 0
|
||||
__loadstore struct Point print::p
|
||||
|
||||
Adding number conversion cast (unumber) 5 in main::$0 = main::i#2 < 5
|
||||
Adding number conversion cast (unumber) 2 in get::$0 = get::i#0 / 2
|
||||
Adding number conversion cast (unumber) get::$0 in get::$0 = get::i#0 / (unumber)2
|
||||
Successful SSA optimization PassNAddNumberTypeConversions
|
||||
Simplifying constant pointer cast (char *) 1024
|
||||
Simplifying constant integer cast 5
|
||||
Simplifying constant integer cast 2
|
||||
Successful SSA optimization PassNCastSimplification
|
||||
Finalized unsigned number type (char) 5
|
||||
Finalized unsigned number type (char) 2
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Inferred type updated to char in get::$0 = get::i#0 / 2
|
||||
Alias main::i#2 = main::i#3
|
||||
Successful SSA optimization Pass2AliasElimination
|
||||
Simple Condition main::$0 [3] if(main::i#2<5) goto main::@2
|
||||
Successful SSA optimization Pass2ConditionalJumpSimplification
|
||||
Constant main::i#0 = 0
|
||||
Successful SSA optimization Pass2ConstantIdentification
|
||||
Simplifying expression containing zero (char *)&get::p in [15] *((char *)&get::p+OFFSET_STRUCT_POINT_X) = get::i#0
|
||||
Simplifying expression containing zero (char *)&print::p in [21] SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_X)
|
||||
Successful SSA optimization PassNSimplifyExpressionWithZero
|
||||
Eliminating unused constant OFFSET_STRUCT_POINT_X
|
||||
Successful SSA optimization PassNEliminateUnusedVars
|
||||
Rewriting division to use shift [12] get::$0 = get::i#0 / 2
|
||||
Successful SSA optimization Pass2MultiplyToShiftRewriting
|
||||
Inlining constant with var siblings main::i#0
|
||||
Constant inlined main::i#0 = 0
|
||||
Successful SSA optimization Pass2ConstantInlining
|
||||
Finalized unsigned number type (char) 1
|
||||
Finalized unsigned number type (char) 2
|
||||
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
||||
Adding NOP phi() at start of __start
|
||||
Adding NOP phi() at start of __start::@1
|
||||
Adding NOP phi() at start of main
|
||||
CALL GRAPH
|
||||
Calls in [__start] to main:3
|
||||
Calls in [main] to get:24 print:27
|
||||
|
||||
Created 1 initial phi equivalence classes
|
||||
Coalesced [30] main::i#4 = main::i#1
|
||||
Coalesced down to 1 phi equivalence classes
|
||||
Adding NOP phi() at start of __start
|
||||
Adding NOP phi() at start of __start::@1
|
||||
Adding NOP phi() at start of main
|
||||
|
||||
FINAL CONTROL FLOW GRAPH
|
||||
|
||||
void __start()
|
||||
__start: scope:[__start] from
|
||||
[0] phi()
|
||||
to:__start::__init1
|
||||
__start::__init1: scope:[__start] from __start
|
||||
[1] idx = 0
|
||||
to:__start::@1
|
||||
__start::@1: scope:[__start] from __start::__init1
|
||||
[2] phi()
|
||||
[3] callexecute main
|
||||
to:__start::@return
|
||||
__start::@return: scope:[__start] from __start::@1
|
||||
[4] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall void print(struct Point p)
|
||||
print: scope:[print] from
|
||||
[5] print::p = stackidx(struct Point,print::OFFSET_STACK_P)
|
||||
[6] SCREEN[idx] = *((char *)&print::p)
|
||||
[7] idx = ++ idx
|
||||
[8] SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_Y)
|
||||
[9] idx = ++ idx
|
||||
to:print::@return
|
||||
print::@return: scope:[print] from print
|
||||
[10] return
|
||||
to:@return
|
||||
|
||||
__far(bank) __stackcall struct Point get(char i)
|
||||
get: scope:[get] from
|
||||
[11] get::i#0 = stackidx(char,get::OFFSET_STACK_I)
|
||||
[12] get::$0 = get::i#0 >> 1
|
||||
[13] *((char *)&get::p) = get::i#0
|
||||
[14] *((char *)&get::p+OFFSET_STRUCT_POINT_Y) = get::$0
|
||||
[15] *(&get::return) = memcpy(*(&get::p), struct Point, SIZEOF_STRUCT_POINT)
|
||||
to:get::@return
|
||||
get::@return: scope:[get] from get
|
||||
[16] stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return
|
||||
[17] return
|
||||
to:@return
|
||||
|
||||
__stackcall void main()
|
||||
main: scope:[main] from
|
||||
[18] phi()
|
||||
to:main::@1
|
||||
main::@1: scope:[main] from main main::@2
|
||||
[19] main::i#2 = phi( main/0, main::@2/main::i#1 )
|
||||
[20] if(main::i#2<5) goto main::@2
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main::@1
|
||||
[21] return
|
||||
to:@return
|
||||
main::@2: scope:[main] from main::@1
|
||||
[22] stackpush(char) = main::i#2
|
||||
sideeffect stackpushpadding(1)
|
||||
[24] callexecute get
|
||||
[25] main::p = stackpull(struct Point)
|
||||
[26] stackpush(struct Point) = main::p
|
||||
[27] callexecute print
|
||||
sideeffect stackpullpadding(2)
|
||||
[29] main::i#1 = ++ main::i#2
|
||||
to:main::@1
|
||||
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 in scope print
|
||||
null depth in calling loop Loop head: main::@1 tails: main::@2 blocks: main::@2 main::@1 in scope get
|
||||
|
||||
VARIABLE REGISTER WEIGHTS
|
||||
void __start()
|
||||
__far(bank) __stackcall struct Point get(char i)
|
||||
char get::$0 // 1001.0
|
||||
char get::i
|
||||
char get::i#0 // 1501.5
|
||||
__loadstore struct Point get::p
|
||||
__loadstore struct Point get::return // 47.666666666666664
|
||||
__loadstore char idx // 316.2105263157895
|
||||
__stackcall void main()
|
||||
char main::i
|
||||
char main::i#1 // 202.0
|
||||
char main::i#2 // 44.888888888888886
|
||||
__loadstore struct Point main::p // 202.0
|
||||
__far(bank) __stackcall void print(struct Point p)
|
||||
__loadstore struct Point print::p // 333.6666666666667
|
||||
|
||||
Initial phi equivalence classes
|
||||
[ main::i#2 main::i#1 ]
|
||||
Added variable idx to live range equivalence class [ idx ]
|
||||
Added variable print::p to live range equivalence class [ print::p ]
|
||||
Added variable get::i#0 to live range equivalence class [ get::i#0 ]
|
||||
Added variable get::$0 to live range equivalence class [ get::$0 ]
|
||||
Added variable main::p to live range equivalence class [ main::p ]
|
||||
Added variable get::return to live range equivalence class [ get::return ]
|
||||
Added variable get::p to live range equivalence class [ get::p ]
|
||||
Complete equivalence classes
|
||||
[ main::i#2 main::i#1 ]
|
||||
[ idx ]
|
||||
[ print::p ]
|
||||
[ get::i#0 ]
|
||||
[ get::$0 ]
|
||||
[ main::p ]
|
||||
[ get::return ]
|
||||
[ get::p ]
|
||||
Allocated zp[1]:2 [ get::i#0 ]
|
||||
Allocated zp[1]:3 [ get::$0 ]
|
||||
Allocated zp[2]:4 [ print::p ]
|
||||
Allocated zp[1]:6 [ idx ]
|
||||
Allocated zp[1]:7 [ main::i#2 main::i#1 ]
|
||||
Allocated zp[2]:8 [ main::p ]
|
||||
Allocated zp[2]:10 [ get::return ]
|
||||
Allocated zp[2]:12 [ get::p ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
REGISTER UPLIFT POTENTIAL REGISTERS
|
||||
Statement [1] idx = 0 [ idx get::p get::return ] ( [ idx get::p get::return ] { } ) always clobbers reg byte a
|
||||
Statement [5] print::p = stackidx(struct Point,print::OFFSET_STACK_P) [ idx print::p ] ( main:3::print:27 [ get::p get::return main::i#2 idx print::p ] { } ) always clobbers reg byte a reg byte x
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:7 [ main::i#2 main::i#1 ]
|
||||
Removing always clobbered register reg byte x as potential for zp[1]:7 [ main::i#2 main::i#1 ]
|
||||
Statement [6] SCREEN[idx] = *((char *)&print::p) [ idx print::p ] ( main:3::print:27 [ get::p get::return main::i#2 idx print::p ] { } ) always clobbers reg byte a reg byte y
|
||||
Removing always clobbered register reg byte y as potential for zp[1]:7 [ main::i#2 main::i#1 ]
|
||||
Statement [8] SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_Y) [ idx ] ( main:3::print:27 [ get::p get::return main::i#2 idx ] { } ) always clobbers reg byte a reg byte y
|
||||
Statement [11] get::i#0 = stackidx(char,get::OFFSET_STACK_I) [ get::i#0 get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::i#0 get::p get::return ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [12] get::$0 = get::i#0 >> 1 [ get::i#0 get::$0 get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::i#0 get::$0 get::p get::return ] { } ) always clobbers reg byte a
|
||||
Removing always clobbered register reg byte a as potential for zp[1]:2 [ get::i#0 ]
|
||||
Statement [15] *(&get::return) = memcpy(*(&get::p), struct Point, SIZEOF_STRUCT_POINT) [ get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::p get::return ] { } ) always clobbers reg byte a reg byte y
|
||||
Statement [16] stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return [ get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::p get::return ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [20] if(main::i#2<5) goto main::@2 [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a
|
||||
Statement [22] stackpush(char) = main::i#2 [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [24] callexecute get missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [24] callexecute get [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement [25] main::p = stackpull(struct Point) [ idx get::p get::return main::i#2 main::p ] ( main:3 [ idx get::p get::return main::i#2 main::p ] { } ) always clobbers reg byte a
|
||||
Statement [26] stackpush(struct Point) = main::p [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [27] callexecute print missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [27] callexecute print [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement sideeffect stackpullpadding(2) always clobbers reg byte a
|
||||
Statement [1] idx = 0 [ idx get::p get::return ] ( [ idx get::p get::return ] { } ) always clobbers reg byte a
|
||||
Statement [5] print::p = stackidx(struct Point,print::OFFSET_STACK_P) [ idx print::p ] ( main:3::print:27 [ get::p get::return main::i#2 idx print::p ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [6] SCREEN[idx] = *((char *)&print::p) [ idx print::p ] ( main:3::print:27 [ get::p get::return main::i#2 idx print::p ] { } ) always clobbers reg byte a reg byte y
|
||||
Statement [8] SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_Y) [ idx ] ( main:3::print:27 [ get::p get::return main::i#2 idx ] { } ) always clobbers reg byte a reg byte y
|
||||
Statement [11] get::i#0 = stackidx(char,get::OFFSET_STACK_I) [ get::i#0 get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::i#0 get::p get::return ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [12] get::$0 = get::i#0 >> 1 [ get::i#0 get::$0 get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::i#0 get::$0 get::p get::return ] { } ) always clobbers reg byte a
|
||||
Statement [15] *(&get::return) = memcpy(*(&get::p), struct Point, SIZEOF_STRUCT_POINT) [ get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::p get::return ] { } ) always clobbers reg byte a reg byte y
|
||||
Statement [16] stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return [ get::p get::return ] ( main:3::get:24 [ idx main::i#2 get::p get::return ] { } ) always clobbers reg byte a reg byte x
|
||||
Statement [20] if(main::i#2<5) goto main::@2 [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a
|
||||
Statement [22] stackpush(char) = main::i#2 [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [24] callexecute get missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [24] callexecute get [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement [25] main::p = stackpull(struct Point) [ idx get::p get::return main::i#2 main::p ] ( main:3 [ idx get::p get::return main::i#2 main::p ] { } ) always clobbers reg byte a
|
||||
Statement [26] stackpush(struct Point) = main::p [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a
|
||||
Potential register analysis [27] callexecute print missing fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry allocation:
|
||||
MISSING FRAGMENTS
|
||||
Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
Statement [27] callexecute print [ idx get::p get::return main::i#2 ] ( main:3 [ idx get::p get::return main::i#2 ] { } ) always clobbers reg byte a reg byte x reg byte y
|
||||
Statement sideeffect stackpullpadding(2) always clobbers reg byte a
|
||||
Potential registers zp[1]:7 [ main::i#2 main::i#1 ] : zp[1]:7 ,
|
||||
Potential registers zp[1]:6 [ idx ] : zp[1]:6 ,
|
||||
Potential registers zp[2]:4 [ print::p ] : zp[2]:4 ,
|
||||
Potential registers zp[1]:2 [ get::i#0 ] : zp[1]:2 , reg byte x , reg byte y ,
|
||||
Potential registers zp[1]:3 [ get::$0 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y ,
|
||||
Potential registers zp[2]:8 [ main::p ] : zp[2]:8 ,
|
||||
Potential registers zp[2]:10 [ get::return ] : zp[2]:10 ,
|
||||
Potential registers zp[2]:12 [ get::p ] : zp[2]:12 ,
|
||||
|
||||
REGISTER UPLIFT SCOPES
|
||||
Uplift Scope [get] 1,501.5: zp[1]:2 [ get::i#0 ] 1,001: zp[1]:3 [ get::$0 ] 47.67: zp[2]:10 [ get::return ] 0: zp[2]:12 [ get::p ]
|
||||
Uplift Scope [main] 246.89: zp[1]:7 [ main::i#2 main::i#1 ] 202: zp[2]:8 [ main::p ]
|
||||
Uplift Scope [print] 333.67: zp[2]:4 [ print::p ]
|
||||
Uplift Scope [] 316.21: zp[1]:6 [ idx ]
|
||||
Uplift Scope [Point]
|
||||
Uplift Scope [__start]
|
||||
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [get] best 873 combination reg byte x [ get::i#0 ] reg byte a [ get::$0 ] zp[2]:10 [ get::return ] zp[2]:12 [ get::p ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [main] best 873 combination zp[1]:7 [ main::i#2 main::i#1 ] zp[2]:8 [ main::p ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [print] best 873 combination zp[2]:4 [ print::p ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [] best 873 combination zp[1]:6 [ idx ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [Point] best 873 combination
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [__start] best 873 combination
|
||||
Attempting to uplift remaining variables inzp[1]:6 [ idx ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [] best 873 combination zp[1]:6 [ idx ]
|
||||
Attempting to uplift remaining variables inzp[1]:7 [ main::i#2 main::i#1 ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Uplifting [main] best 873 combination zp[1]:7 [ main::i#2 main::i#1 ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
Coalescing zero page register [ zp[2]:8 [ main::p ] ] with [ zp[2]:4 [ print::p ] ]
|
||||
Allocated (was zp[2]:8) zp[2]:2 [ main::p print::p ]
|
||||
Allocated (was zp[1]:6) zp[1]:4 [ idx ]
|
||||
Allocated (was zp[1]:7) zp[1]:5 [ main::i#2 main::i#1 ]
|
||||
Allocated (was zp[2]:10) zp[2]:6 [ get::return ]
|
||||
Allocated (was zp[2]:12) zp[2]:8 [ get::p ]
|
||||
Warning! Unknown fragment for statement [24] callexecute get
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:17:9:
|
||||
Warning! Unknown fragment for statement [27] callexecute print
|
||||
Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry
|
||||
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-stack-far-5.c:18:9:
|
||||
|
||||
ASSEMBLER BEFORE OPTIMIZATION
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Returning and passing struct values
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-5.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
// Global Constants & labels
|
||||
.const OFFSET_STRUCT_POINT_Y = 1
|
||||
.const SIZEOF_STRUCT_POINT = 2
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.label idx = 4
|
||||
.segment Code
|
||||
// __start
|
||||
__start: {
|
||||
jmp __init1
|
||||
// __start::__init1
|
||||
__init1:
|
||||
// [1] idx = 0 -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z idx
|
||||
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
|
||||
__b1_from___init1:
|
||||
jmp __b1
|
||||
// __start::@1
|
||||
__b1:
|
||||
// [3] callexecute main -- call_vprc1
|
||||
jsr main
|
||||
jmp __breturn
|
||||
// __start::@return
|
||||
__breturn:
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// print
|
||||
// void print(__zp(2) struct Point p)
|
||||
print: {
|
||||
.const OFFSET_STACK_P = 0
|
||||
.label p = 2
|
||||
// [5] print::p = stackidx(struct Point,print::OFFSET_STACK_P) -- vssz1=_stackidxstruct_2_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_P,x
|
||||
sta.z p
|
||||
lda STACK_BASE+OFFSET_STACK_P+1,x
|
||||
sta.z p+1
|
||||
// [6] SCREEN[idx] = *((char *)&print::p) -- pbuc1_derefidx_vbuz1=_deref_pbuc2
|
||||
lda.z p
|
||||
ldy.z idx
|
||||
sta SCREEN,y
|
||||
// [7] idx = ++ idx -- vbuz1=_inc_vbuz1
|
||||
inc.z idx
|
||||
// [8] SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_Y) -- pbuc1_derefidx_vbuz1=_deref_pbuc2
|
||||
lda.z p+OFFSET_STRUCT_POINT_Y
|
||||
ldy.z idx
|
||||
sta SCREEN,y
|
||||
// [9] idx = ++ idx -- vbuz1=_inc_vbuz1
|
||||
inc.z idx
|
||||
jmp __breturn
|
||||
// print::@return
|
||||
__breturn:
|
||||
// [10] return
|
||||
rts
|
||||
}
|
||||
// get
|
||||
// __zp(6) struct Point get(__register(X) char i)
|
||||
get: {
|
||||
.const OFFSET_STACK_I = 0
|
||||
.const OFFSET_STACK_RETURN_0 = 0
|
||||
.label return = 6
|
||||
.label p = 8
|
||||
// [11] get::i#0 = stackidx(char,get::OFFSET_STACK_I) -- vbuxx=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_I,x
|
||||
tax
|
||||
// [12] get::$0 = get::i#0 >> 1 -- vbuaa=vbuxx_ror_1
|
||||
txa
|
||||
lsr
|
||||
// [13] *((char *)&get::p) = get::i#0 -- _deref_pbuc1=vbuxx
|
||||
stx.z p
|
||||
// [14] *((char *)&get::p+OFFSET_STRUCT_POINT_Y) = get::$0 -- _deref_pbuc1=vbuaa
|
||||
sta.z p+OFFSET_STRUCT_POINT_Y
|
||||
// [15] *(&get::return) = memcpy(*(&get::p), struct Point, SIZEOF_STRUCT_POINT) -- _deref_pssc1=_deref_pssc2_memcpy_vbuc3
|
||||
ldy #SIZEOF_STRUCT_POINT
|
||||
!:
|
||||
lda p-1,y
|
||||
sta return-1,y
|
||||
dey
|
||||
bne !-
|
||||
jmp __breturn
|
||||
// get::@return
|
||||
__breturn:
|
||||
// [16] stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return -- _stackidxstruct_2_vbuc1=vssz1
|
||||
tsx
|
||||
lda.z return
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0,x
|
||||
lda.z return+1
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0+1,x
|
||||
// [17] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
.label p = 2
|
||||
.label i = 5
|
||||
// [19] phi from main to main::@1 [phi:main->main::@1]
|
||||
__b1_from_main:
|
||||
// [19] phi main::i#2 = 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z i
|
||||
jmp __b1
|
||||
// main::@1
|
||||
__b1:
|
||||
// [20] if(main::i#2<5) goto main::@2 -- vbuz1_lt_vbuc1_then_la1
|
||||
lda.z i
|
||||
cmp #5
|
||||
bcc __b2
|
||||
jmp __breturn
|
||||
// main::@return
|
||||
__breturn:
|
||||
// [21] return
|
||||
rts
|
||||
// main::@2
|
||||
__b2:
|
||||
// [22] stackpush(char) = main::i#2 -- _stackpushbyte_=vbuz1
|
||||
lda.z i
|
||||
pha
|
||||
// sideeffect stackpushpadding(1) -- _stackpushpadding_1
|
||||
pha
|
||||
// [24] callexecute get
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// [25] main::p = stackpull(struct Point) -- vssz1=_stackpullstruct_2_
|
||||
pla
|
||||
sta.z p
|
||||
pla
|
||||
sta.z p+1
|
||||
// [26] stackpush(struct Point) = main::p -- _stackpushstruct_2_=vssz1
|
||||
lda.z p+1
|
||||
pha
|
||||
lda.z p
|
||||
pha
|
||||
// [27] callexecute print
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(2) -- _stackpullpadding_2
|
||||
pla
|
||||
pla
|
||||
// [29] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z i
|
||||
// [19] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
|
||||
__b1_from___b2:
|
||||
// [19] phi main::i#2 = main::i#1 [phi:main::@2->main::@1#0] -- register_copy
|
||||
jmp __b1
|
||||
}
|
||||
// File Data
|
||||
|
||||
ASSEMBLER OPTIMIZATIONS
|
||||
Removing instruction jmp __init1
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __breturn
|
||||
Removing instruction jmp __b1
|
||||
Removing instruction jmp __breturn
|
||||
Succesful ASM optimization Pass5NextJumpElimination
|
||||
Removing instruction lda.z p+1
|
||||
Succesful ASM optimization Pass5UnnecesaryLoadElimination
|
||||
Removing instruction __b1_from___init1:
|
||||
Succesful ASM optimization Pass5RedundantLabelElimination
|
||||
Removing instruction __init1:
|
||||
Removing instruction __b1:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __b1_from_main:
|
||||
Removing instruction __breturn:
|
||||
Removing instruction __b1_from___b2:
|
||||
Succesful ASM optimization Pass5UnusedLabelElimination
|
||||
|
||||
FINAL SYMBOL TABLE
|
||||
__constant char OFFSET_STRUCT_POINT_Y = 1
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant char SIZEOF_STRUCT_POINT = 2
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
__far(bank) __stackcall struct Point get(char i)
|
||||
char get::$0 // reg byte a 1001.0
|
||||
__constant char get::OFFSET_STACK_I = 0
|
||||
__constant char get::OFFSET_STACK_RETURN_0 = 0
|
||||
char get::i
|
||||
char get::i#0 // reg byte x 1501.5
|
||||
__loadstore struct Point get::p // zp[2]:8
|
||||
__loadstore struct Point get::return // zp[2]:6 47.666666666666664
|
||||
__loadstore char idx // zp[1]:4 316.2105263157895
|
||||
__stackcall void main()
|
||||
char main::i
|
||||
char main::i#1 // i zp[1]:5 202.0
|
||||
char main::i#2 // i zp[1]:5 44.888888888888886
|
||||
__loadstore struct Point main::p // zp[2]:2 202.0
|
||||
__far(bank) __stackcall void print(struct Point p)
|
||||
__constant char print::OFFSET_STACK_P = 0
|
||||
__loadstore struct Point print::p // zp[2]:2 333.6666666666667
|
||||
|
||||
zp[1]:5 [ main::i#2 main::i#1 ]
|
||||
zp[1]:4 [ idx ]
|
||||
reg byte x [ get::i#0 ]
|
||||
reg byte a [ get::$0 ]
|
||||
zp[2]:2 [ main::p print::p ]
|
||||
zp[2]:6 [ get::return ]
|
||||
zp[2]:8 [ get::p ]
|
||||
|
||||
|
||||
FINAL ASSEMBLER
|
||||
Score: 741
|
||||
|
||||
// File Comments
|
||||
// Test a procedure with calling convention stack
|
||||
// Returning and passing struct values
|
||||
// Upstart
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-5.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(__start)
|
||||
// Global Constants & labels
|
||||
.const OFFSET_STRUCT_POINT_Y = 1
|
||||
.const SIZEOF_STRUCT_POINT = 2
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.label idx = 4
|
||||
.segment Code
|
||||
// __start
|
||||
__start: {
|
||||
// __start::__init1
|
||||
// char idx = 0
|
||||
// [1] idx = 0 -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z idx
|
||||
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
|
||||
// __start::@1
|
||||
// [3] callexecute main -- call_vprc1
|
||||
jsr main
|
||||
// __start::@return
|
||||
// [4] return
|
||||
rts
|
||||
}
|
||||
// print
|
||||
// void print(__zp(2) struct Point p)
|
||||
print: {
|
||||
.const OFFSET_STACK_P = 0
|
||||
.label p = 2
|
||||
// [5] print::p = stackidx(struct Point,print::OFFSET_STACK_P) -- vssz1=_stackidxstruct_2_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_P,x
|
||||
sta.z p
|
||||
lda STACK_BASE+OFFSET_STACK_P+1,x
|
||||
sta.z p+1
|
||||
// SCREEN[idx++] = p.x
|
||||
// [6] SCREEN[idx] = *((char *)&print::p) -- pbuc1_derefidx_vbuz1=_deref_pbuc2
|
||||
lda.z p
|
||||
ldy.z idx
|
||||
sta SCREEN,y
|
||||
// SCREEN[idx++] = p.x;
|
||||
// [7] idx = ++ idx -- vbuz1=_inc_vbuz1
|
||||
inc.z idx
|
||||
// SCREEN[idx++] = p.y
|
||||
// [8] SCREEN[idx] = *((char *)&print::p+OFFSET_STRUCT_POINT_Y) -- pbuc1_derefidx_vbuz1=_deref_pbuc2
|
||||
lda.z p+OFFSET_STRUCT_POINT_Y
|
||||
ldy.z idx
|
||||
sta SCREEN,y
|
||||
// SCREEN[idx++] = p.y;
|
||||
// [9] idx = ++ idx -- vbuz1=_inc_vbuz1
|
||||
inc.z idx
|
||||
// print::@return
|
||||
// }
|
||||
// [10] return
|
||||
rts
|
||||
}
|
||||
// get
|
||||
// __zp(6) struct Point get(__register(X) char i)
|
||||
get: {
|
||||
.const OFFSET_STACK_I = 0
|
||||
.const OFFSET_STACK_RETURN_0 = 0
|
||||
.label return = 6
|
||||
.label p = 8
|
||||
// [11] get::i#0 = stackidx(char,get::OFFSET_STACK_I) -- vbuxx=_stackidxbyte_vbuc1
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_I,x
|
||||
tax
|
||||
// i/2
|
||||
// [12] get::$0 = get::i#0 >> 1 -- vbuaa=vbuxx_ror_1
|
||||
txa
|
||||
lsr
|
||||
// struct Point p = { i, i/2 }
|
||||
// [13] *((char *)&get::p) = get::i#0 -- _deref_pbuc1=vbuxx
|
||||
stx.z p
|
||||
// [14] *((char *)&get::p+OFFSET_STRUCT_POINT_Y) = get::$0 -- _deref_pbuc1=vbuaa
|
||||
sta.z p+OFFSET_STRUCT_POINT_Y
|
||||
// return p;
|
||||
// [15] *(&get::return) = memcpy(*(&get::p), struct Point, SIZEOF_STRUCT_POINT) -- _deref_pssc1=_deref_pssc2_memcpy_vbuc3
|
||||
ldy #SIZEOF_STRUCT_POINT
|
||||
!:
|
||||
lda p-1,y
|
||||
sta return-1,y
|
||||
dey
|
||||
bne !-
|
||||
// get::@return
|
||||
// }
|
||||
// [16] stackidx(struct Point,get::OFFSET_STACK_RETURN_0) = get::return -- _stackidxstruct_2_vbuc1=vssz1
|
||||
tsx
|
||||
lda.z return
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0,x
|
||||
lda.z return+1
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0+1,x
|
||||
// [17] return
|
||||
rts
|
||||
}
|
||||
// main
|
||||
main: {
|
||||
.label p = 2
|
||||
.label i = 5
|
||||
// [19] phi from main to main::@1 [phi:main->main::@1]
|
||||
// [19] phi main::i#2 = 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
|
||||
lda #0
|
||||
sta.z i
|
||||
// main::@1
|
||||
__b1:
|
||||
// for(char i=0;i<5;i++)
|
||||
// [20] if(main::i#2<5) goto main::@2 -- vbuz1_lt_vbuc1_then_la1
|
||||
lda.z i
|
||||
cmp #5
|
||||
bcc __b2
|
||||
// main::@return
|
||||
// }
|
||||
// [21] return
|
||||
rts
|
||||
// main::@2
|
||||
__b2:
|
||||
// struct Point p = get(i)
|
||||
// [22] stackpush(char) = main::i#2 -- _stackpushbyte_=vbuz1
|
||||
lda.z i
|
||||
pha
|
||||
// sideeffect stackpushpadding(1) -- _stackpushpadding_1
|
||||
pha
|
||||
// [24] callexecute get
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// [25] main::p = stackpull(struct Point) -- vssz1=_stackpullstruct_2_
|
||||
pla
|
||||
sta.z p
|
||||
pla
|
||||
sta.z p+1
|
||||
// print(p)
|
||||
// [26] stackpush(struct Point) = main::p -- _stackpushstruct_2_=vssz1
|
||||
pha
|
||||
lda.z p
|
||||
pha
|
||||
// [27] callexecute print
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
// sideeffect stackpullpadding(2) -- _stackpullpadding_2
|
||||
pla
|
||||
pla
|
||||
// for(char i=0;i<5;i++)
|
||||
// [29] main::i#1 = ++ main::i#2 -- vbuz1=_inc_vbuz1
|
||||
inc.z i
|
||||
// [19] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
|
||||
// [19] phi main::i#2 = main::i#1 [phi:main::@2->main::@1#0] -- register_copy
|
||||
jmp __b1
|
||||
}
|
||||
// File Data
|
||||
|
30
src/test/ref/procedure-callingconvention-stack-far-5.sym
Normal file
30
src/test/ref/procedure-callingconvention-stack-far-5.sym
Normal file
@ -0,0 +1,30 @@
|
||||
__constant char OFFSET_STRUCT_POINT_Y = 1
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant char SIZEOF_STRUCT_POINT = 2
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void __start()
|
||||
__far(bank) __stackcall struct Point get(char i)
|
||||
char get::$0 // reg byte a 1001.0
|
||||
__constant char get::OFFSET_STACK_I = 0
|
||||
__constant char get::OFFSET_STACK_RETURN_0 = 0
|
||||
char get::i
|
||||
char get::i#0 // reg byte x 1501.5
|
||||
__loadstore struct Point get::p // zp[2]:8
|
||||
__loadstore struct Point get::return // zp[2]:6 47.666666666666664
|
||||
__loadstore char idx // zp[1]:4 316.2105263157895
|
||||
__stackcall void main()
|
||||
char main::i
|
||||
char main::i#1 // i zp[1]:5 202.0
|
||||
char main::i#2 // i zp[1]:5 44.888888888888886
|
||||
__loadstore struct Point main::p // zp[2]:2 202.0
|
||||
__far(bank) __stackcall void print(struct Point p)
|
||||
__constant char print::OFFSET_STACK_P = 0
|
||||
__loadstore struct Point print::p // zp[2]:2 333.6666666666667
|
||||
|
||||
zp[1]:5 [ main::i#2 main::i#1 ]
|
||||
zp[1]:4 [ idx ]
|
||||
reg byte x [ get::i#0 ]
|
||||
reg byte a [ get::$0 ]
|
||||
zp[2]:2 [ main::p print::p ]
|
||||
zp[2]:6 [ get::return ]
|
||||
zp[2]:8 [ get::p ]
|
51
src/test/ref/procedure-callingconvention-stack-far-6.asm
Normal file
51
src/test/ref/procedure-callingconvention-stack-far-6.asm
Normal file
@ -0,0 +1,51 @@
|
||||
// Test a procedure with calling convention stack
|
||||
// Recursion that works (no local variables)
|
||||
// Commodore 64 PRG executable file
|
||||
.file [name="procedure-callingconvention-stack-far-6.prg", type="prg", segments="Program"]
|
||||
.segmentdef Program [segments="Basic, Code, Data"]
|
||||
.segmentdef Basic [start=$0801]
|
||||
.segmentdef Code [start=$80d]
|
||||
.segmentdef Data [startAfter="Code"]
|
||||
.segment Basic
|
||||
:BasicUpstart(main)
|
||||
.const STACK_BASE = $103
|
||||
.label SCREEN = $400
|
||||
.segment Code
|
||||
// __register(A) char pow2(__register(A) char n)
|
||||
pow2: {
|
||||
.const OFFSET_STACK_N = 0
|
||||
.const OFFSET_STACK_RETURN_0 = 0
|
||||
tsx
|
||||
lda STACK_BASE+OFFSET_STACK_N,x
|
||||
// if (n == 0)
|
||||
cmp #0
|
||||
beq __b1
|
||||
// n-1
|
||||
sec
|
||||
sbc #1
|
||||
// char c = pow2(n-1)
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
// return c+c;
|
||||
asl
|
||||
jmp __breturn
|
||||
__b1:
|
||||
lda #1
|
||||
__breturn:
|
||||
// }
|
||||
tsx
|
||||
sta STACK_BASE+OFFSET_STACK_RETURN_0,x
|
||||
rts
|
||||
}
|
||||
main: {
|
||||
// pow2(6)
|
||||
lda #6
|
||||
pha
|
||||
.assert "Missing ASM fragment Fragment not found call_far_c64_entry. Attempted variations call_far_c64_entry ", 0, 1
|
||||
pla
|
||||
// *SCREEN = pow2(6)
|
||||
sta SCREEN
|
||||
// }
|
||||
rts
|
||||
}
|
29
src/test/ref/procedure-callingconvention-stack-far-6.cfg
Normal file
29
src/test/ref/procedure-callingconvention-stack-far-6.cfg
Normal file
@ -0,0 +1,29 @@
|
||||
|
||||
__far(bank) __stackcall char pow2(char n)
|
||||
pow2: scope:[pow2] from
|
||||
[0] pow2::n#0 = stackidx(char,pow2::OFFSET_STACK_N)
|
||||
[1] if(pow2::n#0==0) goto pow2::@return
|
||||
to:pow2::@1
|
||||
pow2::@1: scope:[pow2] from pow2
|
||||
[2] pow2::$1 = pow2::n#0 - 1
|
||||
[3] stackpush(char) = pow2::$1
|
||||
[4] callexecute pow2
|
||||
[5] pow2::c#0 = stackpull(char)
|
||||
[6] pow2::return#1 = pow2::c#0 + pow2::c#0
|
||||
to:pow2::@return
|
||||
pow2::@return: scope:[pow2] from pow2 pow2::@1
|
||||
[7] pow2::return#2 = phi( pow2/1, pow2::@1/pow2::return#1 )
|
||||
[8] stackidx(char,pow2::OFFSET_STACK_RETURN_0) = pow2::return#2
|
||||
[9] return
|
||||
to:@return
|
||||
|
||||
void main()
|
||||
main: scope:[main] from
|
||||
[10] stackpush(char) = 6
|
||||
[11] callexecute pow2
|
||||
[12] main::$0 = stackpull(char)
|
||||
[13] *SCREEN = main::$0
|
||||
to:main::@return
|
||||
main::@return: scope:[main] from main
|
||||
[14] return
|
||||
to:@return
|
1060
src/test/ref/procedure-callingconvention-stack-far-6.log
Normal file
1060
src/test/ref/procedure-callingconvention-stack-far-6.log
Normal file
File diff suppressed because it is too large
Load Diff
21
src/test/ref/procedure-callingconvention-stack-far-6.sym
Normal file
21
src/test/ref/procedure-callingconvention-stack-far-6.sym
Normal file
@ -0,0 +1,21 @@
|
||||
__constant char * const SCREEN = (char *) 1024
|
||||
__constant unsigned int STACK_BASE = $103
|
||||
void main()
|
||||
char main::$0 // reg byte a 4.0
|
||||
__far(bank) __stackcall char pow2(char n)
|
||||
char pow2::$1 // reg byte a 22.0
|
||||
__constant char pow2::OFFSET_STACK_N = 0
|
||||
__constant char pow2::OFFSET_STACK_RETURN_0 = 0
|
||||
char pow2::c
|
||||
char pow2::c#0 // reg byte a 33.0
|
||||
char pow2::n
|
||||
char pow2::n#0 // reg byte a 16.5
|
||||
char pow2::return
|
||||
char pow2::return#1 // reg byte a 22.0
|
||||
char pow2::return#2 // reg byte a 22.0
|
||||
|
||||
reg byte a [ pow2::return#2 pow2::return#1 ]
|
||||
reg byte a [ pow2::n#0 ]
|
||||
reg byte a [ pow2::$1 ]
|
||||
reg byte a [ pow2::c#0 ]
|
||||
reg byte a [ main::$0 ]
|
Loading…
x
Reference in New Issue
Block a user