1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-29 03:56:15 +00:00
kickc/src/test/ref/struct-12.log

683 lines
26 KiB
Plaintext

Fixing struct type size struct Person to 65
Fixing struct type size struct Person to 65
Fixing struct type size struct Person to 65
Fixing struct type size struct Person to 65
Fixing struct type size struct Person to 65
Fixing struct type SIZE_OF struct Person to 65
Fixing struct type SIZE_OF struct Person to 65
Inlined call call __init
CONTROL FLOW GRAPH SSA
void main()
main: scope:[main] from __start::@1
idx#20 = phi( __start::@1/idx#22 )
*main::jesper_name = memcpy(*(&$0), char, $40)
print_person::person_id#0 = main::jesper_id
print_person::person_name#0 = main::jesper_name
call print_person
to:main::@1
main::@1: scope:[main] from main
idx#11 = phi( main/idx#7 )
idx#0 = idx#11
*main::henriette_name = memcpy(*(&$1), char, $40)
print_person::person_id#1 = main::henriette_id
print_person::person_name#1 = main::henriette_name
call print_person
to:main::@2
main::@2: scope:[main] from main::@1
idx#12 = phi( main::@1/idx#7 )
idx#1 = idx#12
to:main::@return
main::@return: scope:[main] from main::@2
idx#13 = phi( main::@2/idx#1 )
idx#2 = idx#13
return
to:@return
void print_person(char person_id , char *person_name)
print_person: scope:[print_person] from main main::@1
print_person::person_name#4 = phi( main/print_person::person_name#0, main::@1/print_person::person_name#1 )
idx#14 = phi( main/idx#20, main::@1/idx#0 )
print_person::person_id#2 = phi( main/print_person::person_id#0, main::@1/print_person::person_id#1 )
SCREEN[idx#14] = DIGIT[print_person::person_id#2]
idx#3 = ++ idx#14
SCREEN[idx#3] = ' '
idx#4 = ++ idx#3
print_person::i#0 = 0
to:print_person::@1
print_person::@1: scope:[print_person] from print_person print_person::@2
idx#21 = phi( print_person/idx#4, print_person::@2/idx#5 )
print_person::i#2 = phi( print_person/print_person::i#0, print_person::@2/print_person::i#1 )
print_person::person_name#2 = phi( print_person/print_person::person_name#4, print_person::@2/print_person::person_name#3 )
print_person::$0 = 0 != print_person::person_name#2[print_person::i#2]
if(print_person::$0) goto print_person::@2
to:print_person::@3
print_person::@2: scope:[print_person] from print_person::@1
idx#15 = phi( print_person::@1/idx#21 )
print_person::i#3 = phi( print_person::@1/print_person::i#2 )
print_person::person_name#3 = phi( print_person::@1/print_person::person_name#2 )
SCREEN[idx#15] = print_person::person_name#3[print_person::i#3]
idx#5 = ++ idx#15
print_person::i#1 = ++ print_person::i#3
to:print_person::@1
print_person::@3: scope:[print_person] from print_person::@1
idx#16 = phi( print_person::@1/idx#21 )
SCREEN[idx#16] = ' '
idx#6 = ++ idx#16
to:print_person::@return
print_person::@return: scope:[print_person] from print_person::@3
idx#17 = phi( print_person::@3/idx#6 )
idx#7 = idx#17
return
to:@return
void __start()
__start: scope:[__start] from
to:__start::__init1
__start::__init1: scope:[__start] from __start
idx#8 = 0
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
idx#22 = phi( __start::__init1/idx#8 )
call main
to:__start::@2
__start::@2: scope:[__start] from __start::@1
idx#18 = phi( __start::@1/idx#2 )
idx#9 = idx#18
to:__start::@return
__start::@return: scope:[__start] from __start::@2
idx#19 = phi( __start::@2/idx#9 )
idx#10 = idx#19
return
to:@return
SYMBOL TABLE SSA
__constant char $0[$40] = "jesper"
__constant char $1[$40] = "henriette"
__constant char DIGIT[] = "0123456789"
__constant char * const SCREEN = (char *)$400
void __start()
char idx
char idx#0
char idx#1
char idx#10
char idx#11
char idx#12
char idx#13
char idx#14
char idx#15
char idx#16
char idx#17
char idx#18
char idx#19
char idx#2
char idx#20
char idx#21
char idx#22
char idx#3
char idx#4
char idx#5
char idx#6
char idx#7
char idx#8
char idx#9
void main()
__constant char main::henriette_id = 7
__constant char main::henriette_name[$40] = { fill( $40, 0) }
__constant char main::jesper_id = 4
__constant char main::jesper_name[$40] = { fill( $40, 0) }
void print_person(char person_id , char *person_name)
bool print_person::$0
char print_person::i
char print_person::i#0
char print_person::i#1
char print_person::i#2
char print_person::i#3
struct Person print_person::person
char print_person::person_id
char print_person::person_id#0
char print_person::person_id#1
char print_person::person_id#2
char *print_person::person_name
char *print_person::person_name#0
char *print_person::person_name#1
char *print_person::person_name#2
char *print_person::person_name#3
char *print_person::person_name#4
Adding number conversion cast (unumber) 0 in print_person::$0 = 0 != print_person::person_name#2[print_person::i#2]
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant pointer cast (char *) 1024
Simplifying constant integer cast 0
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias idx#0 = idx#11
Alias idx#1 = idx#12 idx#13 idx#2
Alias print_person::person_name#2 = print_person::person_name#3
Alias print_person::i#2 = print_person::i#3
Alias idx#15 = idx#21 idx#16
Alias idx#17 = idx#6 idx#7
Alias idx#22 = idx#8
Alias idx#10 = idx#9 idx#18 idx#19
Successful SSA optimization Pass2AliasElimination
Identical Phi Values idx#20 idx#22
Identical Phi Values idx#0 idx#17
Identical Phi Values idx#1 idx#17
Identical Phi Values print_person::person_name#2 print_person::person_name#4
Identical Phi Values idx#10 idx#1
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition print_person::$0 [20] if(0!=print_person::person_name#4[print_person::i#2]) goto print_person::@2
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant print_person::person_id#0 = main::jesper_id
Constant print_person::person_name#0 = main::jesper_name
Constant print_person::person_id#1 = main::henriette_id
Constant print_person::person_name#1 = main::henriette_name
Constant print_person::i#0 = 0
Constant idx#22 = 0
Successful SSA optimization Pass2ConstantIdentification
Removing unused procedure __start
Removing unused procedure block __start
Removing unused procedure block __start::__init1
Removing unused procedure block __start::@1
Removing unused procedure block __start::@2
Removing unused procedure block __start::@return
Successful SSA optimization PassNEliminateEmptyStart
Inlining constant with var siblings print_person::person_id#0
Inlining constant with var siblings print_person::person_name#0
Inlining constant with var siblings print_person::person_id#1
Inlining constant with var siblings print_person::person_name#1
Inlining constant with var siblings print_person::i#0
Inlining constant with var siblings idx#22
Constant inlined print_person::person_name#1 = main::henriette_name
Constant inlined print_person::person_id#1 = main::henriette_id
Constant inlined idx#22 = 0
Constant inlined print_person::person_id#0 = main::jesper_id
Constant inlined print_person::i#0 = 0
Constant inlined print_person::person_name#0 = main::jesper_name
Successful SSA optimization Pass2ConstantInlining
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) $40
Successful SSA optimization PassNFinalizeNumberTypeConversions
Adding NOP phi() at start of main::@2
CALL GRAPH
Calls in [main] to print_person:1 print_person:4
Created 5 initial phi equivalence classes
Coalesced [3] idx#23 = idx#17
Coalesced [12] idx#24 = idx#4
Coalesced [21] print_person::i#4 = print_person::i#1
Coalesced [22] idx#25 = idx#5
Coalesced down to 5 phi equivalence classes
Culled Empty Block label main::@2
FINAL CONTROL FLOW GRAPH
void main()
main: scope:[main] from
[0] *main::jesper_name = memcpy(*(&$0), char, $40)
[1] call print_person
to:main::@1
main::@1: scope:[main] from main
[2] *main::henriette_name = memcpy(*(&$1), char, $40)
[3] call print_person
to:main::@return
main::@return: scope:[main] from main::@1
[4] return
to:@return
void print_person(char person_id , char *person_name)
print_person: scope:[print_person] from main main::@1
[5] print_person::person_name#4 = phi( main/main::jesper_name, main::@1/main::henriette_name )
[5] idx#14 = phi( main/0, main::@1/idx#17 )
[5] print_person::person_id#2 = phi( main/main::jesper_id, main::@1/main::henriette_id )
[6] SCREEN[idx#14] = DIGIT[print_person::person_id#2]
[7] idx#3 = ++ idx#14
[8] SCREEN[idx#3] = ' '
[9] idx#4 = ++ idx#3
to:print_person::@1
print_person::@1: scope:[print_person] from print_person print_person::@2
[10] idx#15 = phi( print_person/idx#4, print_person::@2/idx#5 )
[10] print_person::i#2 = phi( print_person/0, print_person::@2/print_person::i#1 )
[11] if(0!=print_person::person_name#4[print_person::i#2]) goto print_person::@2
to:print_person::@3
print_person::@3: scope:[print_person] from print_person::@1
[12] SCREEN[idx#15] = ' '
[13] idx#17 = ++ idx#15
to:print_person::@return
print_person::@return: scope:[print_person] from print_person::@3
[14] return
to:@return
print_person::@2: scope:[print_person] from print_person::@1
[15] SCREEN[idx#15] = print_person::person_name#4[print_person::i#2]
[16] idx#5 = ++ idx#15
[17] print_person::i#1 = ++ print_person::i#2
to:print_person::@1
VARIABLE REGISTER WEIGHTS
char idx
char idx#14 // 12.0
char idx#15 // 84.0
char idx#17 // 3.25
char idx#3 // 16.5
char idx#4 // 22.0
char idx#5 // 101.0
void main()
void print_person(char person_id , char *person_name)
char print_person::i
char print_person::i#1 // 202.0
char print_person::i#2 // 101.0
struct Person print_person::person
char print_person::person_id
char print_person::person_id#2 // 11.0
char *print_person::person_name
char *print_person::person_name#4 // 20.2
Initial phi equivalence classes
[ print_person::person_id#2 ]
[ idx#14 idx#17 ]
[ print_person::person_name#4 ]
[ print_person::i#2 print_person::i#1 ]
[ idx#15 idx#4 idx#5 ]
Added variable idx#3 to live range equivalence class [ idx#3 ]
Complete equivalence classes
[ print_person::person_id#2 ]
[ idx#14 idx#17 ]
[ print_person::person_name#4 ]
[ print_person::i#2 print_person::i#1 ]
[ idx#15 idx#4 idx#5 ]
[ idx#3 ]
Allocated zp[1]:2 [ print_person::i#2 print_person::i#1 ]
Allocated zp[1]:3 [ idx#15 idx#4 idx#5 ]
Allocated zp[2]:4 [ print_person::person_name#4 ]
Allocated zp[1]:6 [ idx#3 ]
Allocated zp[1]:7 [ idx#14 idx#17 ]
Allocated zp[1]:8 [ print_person::person_id#2 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [0] *main::jesper_name = memcpy(*(&$0), char, $40) [ ] ( [ ] { } ) always clobbers reg byte a reg byte y
Statement [2] *main::henriette_name = memcpy(*(&$1), char, $40) [ idx#17 ] ( [ idx#17 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte a as potential for zp[1]:7 [ idx#14 idx#17 ]
Removing always clobbered register reg byte y as potential for zp[1]:7 [ idx#14 idx#17 ]
Statement [6] SCREEN[idx#14] = DIGIT[print_person::person_id#2] [ idx#14 print_person::person_name#4 ] ( print_person:1 [ idx#14 print_person::person_name#4 ] { } print_person:3 [ idx#14 print_person::person_name#4 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Statement [8] SCREEN[idx#3] = ' ' [ print_person::person_name#4 idx#3 ] ( print_person:1 [ print_person::person_name#4 idx#3 ] { } print_person:3 [ print_person::person_name#4 idx#3 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:6 [ idx#3 ]
Statement [11] if(0!=print_person::person_name#4[print_person::i#2]) goto print_person::@2 [ print_person::person_name#4 print_person::i#2 idx#15 ] ( print_person:1 [ print_person::person_name#4 print_person::i#2 idx#15 ] { } print_person:3 [ print_person::person_name#4 print_person::i#2 idx#15 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ print_person::i#2 print_person::i#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:3 [ idx#15 idx#4 idx#5 ]
Statement [12] SCREEN[idx#15] = ' ' [ idx#15 ] ( print_person:1 [ idx#15 ] { } print_person:3 [ idx#15 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Statement [15] SCREEN[idx#15] = print_person::person_name#4[print_person::i#2] [ print_person::person_name#4 print_person::i#2 idx#15 ] ( print_person:1 [ print_person::person_name#4 print_person::i#2 idx#15 ] { } print_person:3 [ print_person::person_name#4 print_person::i#2 idx#15 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Statement [0] *main::jesper_name = memcpy(*(&$0), char, $40) [ ] ( [ ] { } ) always clobbers reg byte a reg byte y
Statement [2] *main::henriette_name = memcpy(*(&$1), char, $40) [ idx#17 ] ( [ idx#17 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a reg byte y
Statement [6] SCREEN[idx#14] = DIGIT[print_person::person_id#2] [ idx#14 print_person::person_name#4 ] ( print_person:1 [ idx#14 print_person::person_name#4 ] { } print_person:3 [ idx#14 print_person::person_name#4 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Statement [8] SCREEN[idx#3] = ' ' [ print_person::person_name#4 idx#3 ] ( print_person:1 [ print_person::person_name#4 idx#3 ] { } print_person:3 [ print_person::person_name#4 idx#3 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Statement [11] if(0!=print_person::person_name#4[print_person::i#2]) goto print_person::@2 [ print_person::person_name#4 print_person::i#2 idx#15 ] ( print_person:1 [ print_person::person_name#4 print_person::i#2 idx#15 ] { } print_person:3 [ print_person::person_name#4 print_person::i#2 idx#15 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Statement [12] SCREEN[idx#15] = ' ' [ idx#15 ] ( print_person:1 [ idx#15 ] { } print_person:3 [ idx#15 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Statement [15] SCREEN[idx#15] = print_person::person_name#4[print_person::i#2] [ print_person::person_name#4 print_person::i#2 idx#15 ] ( print_person:1 [ print_person::person_name#4 print_person::i#2 idx#15 ] { } print_person:3 [ print_person::person_name#4 print_person::i#2 idx#15 ] { { idx#14 = idx#17 } } ) always clobbers reg byte a
Potential registers zp[1]:8 [ print_person::person_id#2 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:7 [ idx#14 idx#17 ] : zp[1]:7 , reg byte x ,
Potential registers zp[2]:4 [ print_person::person_name#4 ] : zp[2]:4 ,
Potential registers zp[1]:2 [ print_person::i#2 print_person::i#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ idx#15 idx#4 idx#5 ] : zp[1]:3 , reg byte x , reg byte y ,
Potential registers zp[1]:6 [ idx#3 ] : zp[1]:6 , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [print_person] 303: zp[1]:2 [ print_person::i#2 print_person::i#1 ] 20.2: zp[2]:4 [ print_person::person_name#4 ] 11: zp[1]:8 [ print_person::person_id#2 ]
Uplift Scope [] 207: zp[1]:3 [ idx#15 idx#4 idx#5 ] 16.5: zp[1]:6 [ idx#3 ] 15.25: zp[1]:7 [ idx#14 idx#17 ]
Uplift Scope [Person]
Uplift Scope [main]
Uplifting [print_person] best 565 combination reg byte y [ print_person::i#2 print_person::i#1 ] zp[2]:4 [ print_person::person_name#4 ] reg byte x [ print_person::person_id#2 ]
Uplifting [] best 487 combination reg byte x [ idx#15 idx#4 idx#5 ] reg byte x [ idx#3 ] zp[1]:7 [ idx#14 idx#17 ]
Uplifting [Person] best 487 combination
Uplifting [main] best 487 combination
Attempting to uplift remaining variables inzp[1]:7 [ idx#14 idx#17 ]
Uplifting [] best 487 combination zp[1]:7 [ idx#14 idx#17 ]
Allocated (was zp[2]:4) zp[2]:2 [ print_person::person_name#4 ]
Allocated (was zp[1]:7) zp[1]:4 [ idx#14 idx#17 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Example of a struct containing an array
// Works because the struct is only handled as a value
// Upstart
// Commodore 64 PRG executable file
.file [name="struct-12.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
.label idx = 4
.segment Code
// main
main: {
.const jesper_id = 4
.const henriette_id = 7
// [0] *main::jesper_name = memcpy(*(&$0), char, $40) -- _deref_pbuc1=_deref_qbuc2_memcpy_vbuc3
ldy #$40
!:
lda __0-1,y
sta jesper_name-1,y
dey
bne !-
// [1] call print_person
// [5] phi from main to print_person [phi:main->print_person]
print_person_from_main:
// [5] phi print_person::person_name#4 = main::jesper_name [phi:main->print_person#0] -- pbuz1=pbuc1
lda #<jesper_name
sta.z print_person.person_name
lda #>jesper_name
sta.z print_person.person_name+1
// [5] phi idx#14 = 0 [phi:main->print_person#1] -- vbuz1=vbuc1
lda #0
sta.z idx
// [5] phi print_person::person_id#2 = main::jesper_id [phi:main->print_person#2] -- vbuxx=vbuc1
ldx #jesper_id
jsr print_person
jmp __b1
// main::@1
__b1:
// [2] *main::henriette_name = memcpy(*(&$1), char, $40) -- _deref_pbuc1=_deref_qbuc2_memcpy_vbuc3
ldy #$40
!:
lda __1-1,y
sta henriette_name-1,y
dey
bne !-
// [3] call print_person
// [5] phi from main::@1 to print_person [phi:main::@1->print_person]
print_person_from___b1:
// [5] phi print_person::person_name#4 = main::henriette_name [phi:main::@1->print_person#0] -- pbuz1=pbuc1
lda #<henriette_name
sta.z print_person.person_name
lda #>henriette_name
sta.z print_person.person_name+1
// [5] phi idx#14 = idx#17 [phi:main::@1->print_person#1] -- register_copy
// [5] phi print_person::person_id#2 = main::henriette_id [phi:main::@1->print_person#2] -- vbuxx=vbuc1
ldx #henriette_id
jsr print_person
jmp __breturn
// main::@return
__breturn:
// [4] return
rts
.segment Data
jesper_name: .fill $40, 0
henriette_name: .fill $40, 0
}
.segment Code
// print_person
// void print_person(__register(X) char person_id, __zp(2) char *person_name)
print_person: {
.label person_name = 2
// [6] SCREEN[idx#14] = DIGIT[print_person::person_id#2] -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuxx
lda DIGIT,x
ldy.z idx
sta SCREEN,y
// [7] idx#3 = ++ idx#14 -- vbuxx=_inc_vbuz1
ldx.z idx
inx
// [8] SCREEN[idx#3] = ' ' -- pbuc1_derefidx_vbuxx=vbuc2
lda #' '
sta SCREEN,x
// [9] idx#4 = ++ idx#3 -- vbuxx=_inc_vbuxx
inx
// [10] phi from print_person to print_person::@1 [phi:print_person->print_person::@1]
__b1_from_print_person:
// [10] phi idx#15 = idx#4 [phi:print_person->print_person::@1#0] -- register_copy
// [10] phi print_person::i#2 = 0 [phi:print_person->print_person::@1#1] -- vbuyy=vbuc1
ldy #0
jmp __b1
// print_person::@1
__b1:
// [11] if(0!=print_person::person_name#4[print_person::i#2]) goto print_person::@2 -- 0_neq_pbuz1_derefidx_vbuyy_then_la1
lda (person_name),y
cmp #0
bne __b2
jmp __b3
// print_person::@3
__b3:
// [12] SCREEN[idx#15] = ' ' -- pbuc1_derefidx_vbuxx=vbuc2
lda #' '
sta SCREEN,x
// [13] idx#17 = ++ idx#15 -- vbuz1=_inc_vbuxx
inx
stx.z idx
jmp __breturn
// print_person::@return
__breturn:
// [14] return
rts
// print_person::@2
__b2:
// [15] SCREEN[idx#15] = print_person::person_name#4[print_person::i#2] -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy
lda (person_name),y
sta SCREEN,x
// [16] idx#5 = ++ idx#15 -- vbuxx=_inc_vbuxx
inx
// [17] print_person::i#1 = ++ print_person::i#2 -- vbuyy=_inc_vbuyy
iny
// [10] phi from print_person::@2 to print_person::@1 [phi:print_person::@2->print_person::@1]
__b1_from___b2:
// [10] phi idx#15 = idx#5 [phi:print_person::@2->print_person::@1#0] -- register_copy
// [10] phi print_person::i#2 = print_person::i#1 [phi:print_person::@2->print_person::@1#1] -- register_copy
jmp __b1
}
// File Data
.segment Data
DIGIT: .text "0123456789"
.byte 0
__0: .text "jesper"
.byte 0
.fill $39, 0
__1: .text "henriette"
.byte 0
.fill $36, 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction print_person_from_main:
Removing instruction __b1:
Removing instruction print_person_from___b1:
Removing instruction __breturn:
Removing instruction __b1_from_print_person:
Removing instruction __b3:
Removing instruction __breturn:
Removing instruction __b1_from___b2:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
__constant char $0[$40] = "jesper"
__constant char $1[$40] = "henriette"
__constant char DIGIT[] = "0123456789"
__constant char * const SCREEN = (char *) 1024
char idx
char idx#14 // idx zp[1]:4 12.0
char idx#15 // reg byte x 84.0
char idx#17 // idx zp[1]:4 3.25
char idx#3 // reg byte x 16.5
char idx#4 // reg byte x 22.0
char idx#5 // reg byte x 101.0
void main()
__constant char main::henriette_id = 7
__constant char main::henriette_name[$40] = { fill( $40, 0) }
__constant char main::jesper_id = 4
__constant char main::jesper_name[$40] = { fill( $40, 0) }
void print_person(char person_id , char *person_name)
char print_person::i
char print_person::i#1 // reg byte y 202.0
char print_person::i#2 // reg byte y 101.0
struct Person print_person::person
char print_person::person_id
char print_person::person_id#2 // reg byte x 11.0
char *print_person::person_name
char *print_person::person_name#4 // person_name zp[2]:2 20.2
reg byte x [ print_person::person_id#2 ]
zp[1]:4 [ idx#14 idx#17 ]
zp[2]:2 [ print_person::person_name#4 ]
reg byte y [ print_person::i#2 print_person::i#1 ]
reg byte x [ idx#15 idx#4 idx#5 ]
reg byte x [ idx#3 ]
FINAL ASSEMBLER
Score: 418
// File Comments
// Example of a struct containing an array
// Works because the struct is only handled as a value
// Upstart
// Commodore 64 PRG executable file
.file [name="struct-12.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
.label idx = 4
.segment Code
// main
main: {
.const jesper_id = 4
.const henriette_id = 7
// struct Person jesper = { 4, "jesper" }
// [0] *main::jesper_name = memcpy(*(&$0), char, $40) -- _deref_pbuc1=_deref_qbuc2_memcpy_vbuc3
ldy #$40
!:
lda __0-1,y
sta jesper_name-1,y
dey
bne !-
// print_person(jesper)
// [1] call print_person
// [5] phi from main to print_person [phi:main->print_person]
// [5] phi print_person::person_name#4 = main::jesper_name [phi:main->print_person#0] -- pbuz1=pbuc1
lda #<jesper_name
sta.z print_person.person_name
lda #>jesper_name
sta.z print_person.person_name+1
// [5] phi idx#14 = 0 [phi:main->print_person#1] -- vbuz1=vbuc1
lda #0
sta.z idx
// [5] phi print_person::person_id#2 = main::jesper_id [phi:main->print_person#2] -- vbuxx=vbuc1
ldx #jesper_id
jsr print_person
// main::@1
// struct Person henriette = { 7, "henriette" }
// [2] *main::henriette_name = memcpy(*(&$1), char, $40) -- _deref_pbuc1=_deref_qbuc2_memcpy_vbuc3
ldy #$40
!:
lda __1-1,y
sta henriette_name-1,y
dey
bne !-
// print_person(henriette)
// [3] call print_person
// [5] phi from main::@1 to print_person [phi:main::@1->print_person]
// [5] phi print_person::person_name#4 = main::henriette_name [phi:main::@1->print_person#0] -- pbuz1=pbuc1
lda #<henriette_name
sta.z print_person.person_name
lda #>henriette_name
sta.z print_person.person_name+1
// [5] phi idx#14 = idx#17 [phi:main::@1->print_person#1] -- register_copy
// [5] phi print_person::person_id#2 = main::henriette_id [phi:main::@1->print_person#2] -- vbuxx=vbuc1
ldx #henriette_id
jsr print_person
// main::@return
// }
// [4] return
rts
.segment Data
jesper_name: .fill $40, 0
henriette_name: .fill $40, 0
}
.segment Code
// print_person
// void print_person(__register(X) char person_id, __zp(2) char *person_name)
print_person: {
.label person_name = 2
// SCREEN[idx++] = DIGIT[person.id]
// [6] SCREEN[idx#14] = DIGIT[print_person::person_id#2] -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuxx
lda DIGIT,x
ldy.z idx
sta SCREEN,y
// SCREEN[idx++] = DIGIT[person.id];
// [7] idx#3 = ++ idx#14 -- vbuxx=_inc_vbuz1
ldx.z idx
inx
// SCREEN[idx++] = ' '
// [8] SCREEN[idx#3] = ' ' -- pbuc1_derefidx_vbuxx=vbuc2
lda #' '
sta SCREEN,x
// SCREEN[idx++] = ' ';
// [9] idx#4 = ++ idx#3 -- vbuxx=_inc_vbuxx
inx
// [10] phi from print_person to print_person::@1 [phi:print_person->print_person::@1]
// [10] phi idx#15 = idx#4 [phi:print_person->print_person::@1#0] -- register_copy
// [10] phi print_person::i#2 = 0 [phi:print_person->print_person::@1#1] -- vbuyy=vbuc1
ldy #0
// print_person::@1
__b1:
// for(byte i=0; person.name[i]; i++)
// [11] if(0!=print_person::person_name#4[print_person::i#2]) goto print_person::@2 -- 0_neq_pbuz1_derefidx_vbuyy_then_la1
lda (person_name),y
cmp #0
bne __b2
// print_person::@3
// SCREEN[idx++] = ' '
// [12] SCREEN[idx#15] = ' ' -- pbuc1_derefidx_vbuxx=vbuc2
lda #' '
sta SCREEN,x
// SCREEN[idx++] = ' ';
// [13] idx#17 = ++ idx#15 -- vbuz1=_inc_vbuxx
inx
stx.z idx
// print_person::@return
// }
// [14] return
rts
// print_person::@2
__b2:
// SCREEN[idx++] = person.name[i]
// [15] SCREEN[idx#15] = print_person::person_name#4[print_person::i#2] -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy
lda (person_name),y
sta SCREEN,x
// SCREEN[idx++] = person.name[i];
// [16] idx#5 = ++ idx#15 -- vbuxx=_inc_vbuxx
inx
// for(byte i=0; person.name[i]; i++)
// [17] print_person::i#1 = ++ print_person::i#2 -- vbuyy=_inc_vbuyy
iny
// [10] phi from print_person::@2 to print_person::@1 [phi:print_person::@2->print_person::@1]
// [10] phi idx#15 = idx#5 [phi:print_person::@2->print_person::@1#0] -- register_copy
// [10] phi print_person::i#2 = print_person::i#1 [phi:print_person::@2->print_person::@1#1] -- register_copy
jmp __b1
}
// File Data
.segment Data
DIGIT: .text "0123456789"
.byte 0
__0: .text "jesper"
.byte 0
.fill $39, 0
__1: .text "henriette"
.byte 0
.fill $36, 0