1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-03 07:29:37 +00:00

- Fixed test cases going in error.

- Optimized test cases and documented them properly.
- Remove obscolete ref data.
This commit is contained in:
Flight_Control 2023-04-04 23:31:56 +02:00
parent b13262beb8
commit bdc4e28d0a
52 changed files with 107 additions and 7526 deletions

View File

@ -1,4 +1,4 @@
// Test a procedure with calling convention stack
// Test a procedure with calling convention PHI
#pragma code_seg(stage)
#pragma link("procedure-callingconvention-phi-bank.ld")

View File

@ -1,4 +1,4 @@
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
#pragma code_seg(stage)
#pragma link("procedure-callingconvention-phi-bank.ld")

View File

@ -1,4 +1,4 @@
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI into ROM
#pragma code_seg(stage)
#pragma link("procedure-callingconvention-phi-bank.ld")
@ -11,7 +11,7 @@ void main(void) {
}
#pragma code_seg(stage)
#pragma bank(rubbish, 1)
#pragma bank(rom, 1) // test rom bank
char plus(char a, char b) {
return a+b;

View File

@ -1,4 +1,4 @@
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
#pragma code_seg(stage)
#pragma link("procedure-callingconvention-phi-bank.ld")
@ -11,8 +11,11 @@ void main(void) {
}
#pragma code_seg(stage)
#pragma bank(stage, 2)
#pragma bank(rom, 2) // Test rom fragment
char plus(char a, char b) {
return a+b;
}
#pragma nobank(dummy)

View File

@ -7,13 +7,13 @@
char* const SCREEN = (char*)0x0400;
#pragma code_seg(stage)
#pragma bank(stage, 20)
#pragma bank(ram, 20)
char plus(char a, char b) {
return a+b;
}
#pragma nobank
#pragma nobank(dummy)
void main(void) {
SCREEN[0] = plus('0', 7);

View File

@ -19,28 +19,33 @@ void main(void) {
}
}
#pragma code_seg(test)
#pragma code_seg(test2)
#pragma code_seg(test3)
#pragma code_seg(Code)
#pragma code_seg(stage)
void __bank(ram, 20) pval() {
printval();
}
#pragma code_seg(platform)
void __bank(ram, 21) ival() {
incval();
}
#pragma code_seg(stage)
void __bank(ram, 20) printval() {
SCREEN[0] = val;
}
#pragma code_seg(platform)
void __bank(ram, 21) incval() {
val++;
}
#pragma nobank
#pragma code_seg(Code)
void printother() {
for(char i:0..5) {

View File

@ -1,4 +1,4 @@
// Test a procedure with calling convention stack
// Test a procedure with calling convention PHI
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
.segmentdef Basic [start=$0801]

View File

@ -157,7 +157,7 @@ Uplifting [] best 60 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Test a procedure with calling convention stack
// Test a procedure with calling convention PHI
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
@ -231,7 +231,7 @@ FINAL ASSEMBLER
Score: 24
// File Comments
// Test a procedure with calling convention stack
// Test a procedure with calling convention PHI
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]

View File

@ -1,4 +1,4 @@
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
.segmentdef Basic [start=$0801]

View File

@ -157,7 +157,7 @@ Uplifting [] best 60 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
@ -234,7 +234,7 @@ FINAL ASSEMBLER
Score: 24
// File Comments
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]

View File

@ -1,4 +1,4 @@
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI into ROM
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
.segmentdef Basic [start=$0801]
@ -12,13 +12,17 @@
.segment stage
main: {
// plus('0', 7)
.assert "Missing ASM fragment Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare ", 0, 1
jsr $ff6e
.byte <plus
.byte >plus
.byte 1
// SCREEN[0] = plus('0', 7)
lda #plus.return
sta SCREEN
// }
rts
}
// test rom bank
// char plus(char a, char b)
plus: {
.const a = '0'

View File

@ -143,14 +143,7 @@ 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_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-2.c:10:17:
REGISTER UPLIFT POTENTIAL REGISTERS
Potential register analysis [1] call plus missing fragment Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare allocation:
MISSING FRAGMENTS
Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare
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
@ -158,25 +151,13 @@ Uplift Scope [main]
Uplift Scope [plus]
Uplift Scope []
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-2.c:10:17:
Uplifting [main] best 54 combination
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-2.c:10:17:
Uplifting [plus] best 54 combination
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-2.c:10:17:
Uplifting [] best 54 combination
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-2.c:10:17:
Uplifting [main] best 60 combination
Uplifting [plus] best 60 combination
Uplifting [] best 60 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI into ROM
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
@ -193,9 +174,12 @@ ASSEMBLER BEFORE OPTIMIZATION
// main
main: {
// [1] call plus
// [4] phi from main to plus [phi:main->plus]
// [4] phi from main to plus [phi:main->plus] -- call_far_cx16_rom_finalize
plus_from_main:
.assert "Missing ASM fragment Fragment not found call_far_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare ", 0, 1
jsr $ff6e
.byte <plus
.byte >plus
.byte 1
jmp __b1
// main::@1
__b1:
@ -209,6 +193,7 @@ main: {
rts
}
// plus
// test rom bank
// char plus(char a, char b)
plus: {
.const a = '0'
@ -247,10 +232,10 @@ __constant char plus::return#1 = plus::a#0+plus::b#0 // return
FINAL ASSEMBLER
Score: 18
Score: 24
// File Comments
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI into ROM
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
@ -268,8 +253,11 @@ Score: 18
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_cx16_rubbish_prepare. Attempted variations call_far_cx16_rubbish_prepare ", 0, 1
// [4] phi from main to plus [phi:main->plus] -- call_far_cx16_rom_finalize
jsr $ff6e
.byte <plus
.byte >plus
.byte 1
// main::@1
// SCREEN[0] = plus('0', 7)
// [2] *SCREEN = plus::return#1 -- _deref_pbuc1=vbuc2
@ -281,6 +269,7 @@ main: {
rts
}
// plus
// test rom bank
// char plus(char a, char b)
plus: {
.const a = '0'

View File

@ -1,4 +1,4 @@
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
.segmentdef Basic [start=$0801]
@ -12,13 +12,17 @@
.segment stage
main: {
// plus('0', 7)
.assert "Missing ASM fragment Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare ", 0, 1
jsr $ff6e
.byte <plus
.byte >plus
.byte 2
// SCREEN[0] = plus('0', 7)
lda #plus.return
sta SCREEN
// }
rts
}
// Test rom fragment
// char plus(char a, char b)
plus: {
.const a = '0'

View File

@ -143,14 +143,7 @@ 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_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-3.c:10:17:
REGISTER UPLIFT POTENTIAL REGISTERS
Potential register analysis [1] call plus missing fragment Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare allocation:
MISSING FRAGMENTS
Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare
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
@ -158,25 +151,13 @@ Uplift Scope [main]
Uplift Scope [plus]
Uplift Scope []
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-3.c:10:17:
Uplifting [main] best 54 combination
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-3.c:10:17:
Uplifting [plus] best 54 combination
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-3.c:10:17:
Uplifting [] best 54 combination
Warning! Unknown fragment for statement [1] call plus
Missing ASM fragment Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare
D:\Users\svenv\OneDrive\Documents\GitHub\kickc\src\test\kc\procedure-callingconvention-phi-bank-3.c:10:17:
Uplifting [main] best 60 combination
Uplifting [plus] best 60 combination
Uplifting [] best 60 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
@ -193,9 +174,12 @@ ASSEMBLER BEFORE OPTIMIZATION
// main
main: {
// [1] call plus
// [4] phi from main to plus [phi:main->plus]
// [4] phi from main to plus [phi:main->plus] -- call_far_cx16_rom_finalize
plus_from_main:
.assert "Missing ASM fragment Fragment not found call_far_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare ", 0, 1
jsr $ff6e
.byte <plus
.byte >plus
.byte 2
jmp __b1
// main::@1
__b1:
@ -209,6 +193,7 @@ main: {
rts
}
// plus
// Test rom fragment
// char plus(char a, char b)
plus: {
.const a = '0'
@ -247,10 +232,10 @@ __constant char plus::return#1 = plus::a#0+plus::b#0 // return
FINAL ASSEMBLER
Score: 18
Score: 24
// File Comments
// Test a far call procedure with a calling convention sp
// Test a far call procedure with a calling convention PHI
// Upstart
.cpu _65c02
.segmentdef Program [segments="Basic, Code, Data, stage, platform"]
@ -268,8 +253,11 @@ Score: 18
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_cx16_stage_prepare. Attempted variations call_far_cx16_stage_prepare ", 0, 1
// [4] phi from main to plus [phi:main->plus] -- call_far_cx16_rom_finalize
jsr $ff6e
.byte <plus
.byte >plus
.byte 2
// main::@1
// SCREEN[0] = plus('0', 7)
// [2] *SCREEN = plus::return#1 -- _deref_pbuc1=vbuc2
@ -281,6 +269,7 @@ main: {
rts
}
// plus
// Test rom fragment
// char plus(char a, char b)
plus: {
.const a = '0'

View File

@ -12,7 +12,10 @@
.segment stage
main: {
// plus('0', 7)
jsr plus
jsr $ff6e
.byte <plus
.byte >plus
.byte $14
// SCREEN[0] = plus('0', 7)
lda #plus.return
sta SCREEN

View File

@ -1,5 +1,5 @@
__bank(bank) void main()
void main()
main: scope:[main] from
[0] phi()
[1] call plus

View File

@ -15,7 +15,7 @@ plus::@return: scope:[plus] from plus
return
to:@return
__bank(bank) void main()
void main()
main: scope:[main] from __start
plus::a#0 = '0'
plus::b#0 = 7
@ -44,7 +44,7 @@ __start::@return: scope:[__start] from __start::@1
SYMBOL TABLE SSA
__constant char * const SCREEN = (char *)$400
void __start()
__bank(bank) void main()
void main()
char main::$0
__bank(bank) char plus(char a , char b)
char plus::$0
@ -113,7 +113,7 @@ Adding NOP phi() at start of plus
FINAL CONTROL FLOW GRAPH
__bank(bank) void main()
void main()
main: scope:[main] from
[0] phi()
[1] call plus
@ -135,7 +135,7 @@ plus::@return: scope:[plus] from plus
VARIABLE REGISTER WEIGHTS
__bank(bank) void main()
void main()
__bank(bank) char plus(char a , char b)
char plus::a
char plus::b
@ -174,9 +174,12 @@ ASSEMBLER BEFORE OPTIMIZATION
// main
main: {
// [1] call plus
// [4] phi from main to plus [phi:main->plus]
// [4] phi from main to plus [phi:main->plus] -- call_far_cx16_ram_finalize
plus_from_main:
jsr plus
jsr $ff6e
.byte <plus
.byte >plus
.byte $14
jmp __b1
// main::@1
__b1:
@ -216,7 +219,7 @@ Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
__constant char * const SCREEN = (char *) 1024
__bank(bank) void main()
void main()
__bank(bank) char plus(char a , char b)
char plus::a
__constant char plus::a#0 = '0' // a
@ -249,8 +252,11 @@ Score: 24
main: {
// plus('0', 7)
// [1] call plus
// [4] phi from main to plus [phi:main->plus]
jsr plus
// [4] phi from main to plus [phi:main->plus] -- call_far_cx16_ram_finalize
jsr $ff6e
.byte <plus
.byte >plus
.byte $14
// main::@1
// SCREEN[0] = plus('0', 7)
// [2] *SCREEN = plus::return#0 -- _deref_pbuc1=vbuc2

View File

@ -1,5 +1,5 @@
__constant char * const SCREEN = (char *) 1024
__bank(bank) void main()
void main()
__bank(bank) char plus(char a , char b)
char plus::a
__constant char plus::a#0 = '0' // a

View File

@ -1,27 +0,0 @@
// 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
}

View File

@ -1,20 +0,0 @@
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

View File

@ -1,292 +0,0 @@
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

View File

@ -1,10 +0,0 @@
__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

View File

@ -30,12 +30,14 @@ printother: {
// }
rts
}
.segment platform
incval: {
// val++;
inc.z val
// }
rts
}
.segment stage
printval: {
// SCREEN[0] = val
lda.z val
@ -43,19 +45,20 @@ printval: {
// }
rts
}
.segment platform
ival: {
// incval()
jsr incval
// }
rts
}
.segment stage
pval: {
// printval()
jsr printval
// }
rts
}
.segment stage
main: {
ldy #0
__b1:

View File

@ -381,6 +381,7 @@ printother: {
// [10] return
rts
}
.segment platform
// incval
incval: {
// [11] val = ++ val -- vbuz1=_inc_vbuz1
@ -391,6 +392,7 @@ incval: {
// [12] return
rts
}
.segment stage
// printval
printval: {
// [13] *SCREEN = val -- _deref_pbuc1=vbuz1
@ -402,6 +404,7 @@ printval: {
// [14] return
rts
}
.segment platform
// ival
ival: {
// [16] callexecute incval -- call_vprc1
@ -412,6 +415,7 @@ ival: {
// [17] return
rts
}
.segment stage
// pval
pval: {
// [19] callexecute printval -- call_vprc1
@ -422,7 +426,6 @@ pval: {
// [20] return
rts
}
.segment stage
// main
main: {
// [22] phi from main to main::@1 [phi:main->main::@1]
@ -569,6 +572,7 @@ printother: {
// [10] return
rts
}
.segment platform
// incval
incval: {
// val++;
@ -579,6 +583,7 @@ incval: {
// [12] return
rts
}
.segment stage
// printval
printval: {
// SCREEN[0] = val
@ -590,6 +595,7 @@ printval: {
// [14] return
rts
}
.segment platform
// ival
ival: {
// incval()
@ -600,6 +606,7 @@ ival: {
// [17] return
rts
}
.segment stage
// pval
pval: {
// printval()
@ -610,7 +617,6 @@ pval: {
// [20] return
rts
}
.segment stage
// main
main: {
// [22] phi from main to main::@1 [phi:main->main::@1]

View File

@ -1,45 +0,0 @@
// 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
}

View File

@ -1,24 +0,0 @@
__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

View File

@ -1,469 +0,0 @@
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

View File

@ -1,19 +0,0 @@
__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 ]

View File

@ -1,45 +0,0 @@
// 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
}

View File

@ -1,24 +0,0 @@
__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

View File

@ -1,469 +0,0 @@
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

View File

@ -1,19 +0,0 @@
__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 ]

View File

@ -1,72 +0,0 @@
// 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
}

View File

@ -1,48 +0,0 @@
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

View File

@ -1,851 +0,0 @@
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

View File

@ -1,32 +0,0 @@
__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 ]

View File

@ -1,68 +0,0 @@
// 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
}

View File

@ -1,39 +0,0 @@
__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

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
__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 ]

View File

@ -1,76 +0,0 @@
// 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
}

View File

@ -1,79 +0,0 @@
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

View File

@ -1,924 +0,0 @@
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

View File

@ -1,19 +0,0 @@
__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 ]

View File

@ -1,110 +0,0 @@
// 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
}

View File

@ -1,62 +0,0 @@
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

View File

@ -1,845 +0,0 @@
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

View File

@ -1,30 +0,0 @@
__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 ]

View File

@ -1,51 +0,0 @@
// 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
}

View File

@ -1,29 +0,0 @@
__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

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +0,0 @@
__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 ]