Inlined call call __init

CONTROL FLOW GRAPH SSA

void main()
main: scope:[main]  from __start::@1
  idx#29 = phi( __start::@1/idx#28 )
  main::c#0 = 0
  to:main::@1
main::@1: scope:[main]  from main main::@2
  idx#25 = phi( main/idx#29, main::@2/idx#0 )
  main::c#2 = phi( main/main::c#0, main::@2/main::c#1 )
  outsw::c#0 = main::c#2
  call outsw
  to:main::@2
main::@2: scope:[main]  from main::@1
  main::c#3 = phi( main::@1/main::c#2 )
  idx#13 = phi( main::@1/idx#4 )
  idx#0 = idx#13
  main::c#1 = main::c#3 + rangenext(0,$27)
  main::$1 = main::c#1 != rangelast(0,$27)
  if(main::$1) goto main::@1
  to:main::@return
main::@return: scope:[main]  from main::@2
  idx#14 = phi( main::@2/idx#0 )
  idx#1 = idx#14
  return 
  to:@return

void outsw(char c)
outsw: scope:[outsw]  from main::@1
  outsw::c#2 = phi( main::@1/outsw::c#0 )
  idx#26 = phi( main::@1/idx#25 )
  out::c#0 = '-'
  call out
  to:outsw::@1
outsw::@1: scope:[outsw]  from outsw
  outsw::c#1 = phi( outsw/outsw::c#2 )
  idx#15 = phi( outsw/idx#9 )
  idx#2 = idx#15
  outw::c#0 = outsw::c#1
  call outw
  to:outsw::@2
outsw::@2: scope:[outsw]  from outsw::@1
  idx#16 = phi( outsw::@1/idx#7 )
  idx#3 = idx#16
  to:outsw::@return
outsw::@return: scope:[outsw]  from outsw::@2
  idx#17 = phi( outsw::@2/idx#3 )
  idx#4 = idx#17
  return 
  to:@return

void outw(char c)
outw: scope:[outw]  from outsw::@1
  idx#27 = phi( outsw::@1/idx#2 )
  outw::c#1 = phi( outsw::@1/outw::c#0 )
  outw::$0 = outw::c#1 << 4
  out::c#1 = outw::$0
  call out
  to:outw::@1
outw::@1: scope:[outw]  from outw
  outw::c#2 = phi( outw/outw::c#1 )
  idx#18 = phi( outw/idx#9 )
  idx#5 = idx#18
  outw::$2 = outw::c#2 & $f
  out::c#2 = outw::$2
  call out
  to:outw::@2
outw::@2: scope:[outw]  from outw::@1
  idx#19 = phi( outw::@1/idx#9 )
  idx#6 = idx#19
  to:outw::@return
outw::@return: scope:[outw]  from outw::@2
  idx#20 = phi( outw::@2/idx#6 )
  idx#7 = idx#20
  return 
  to:@return

void out(char c)
out: scope:[out]  from outsw outw outw::@1
  out::c#3 = phi( outsw/out::c#0, outw/out::c#1, outw::@1/out::c#2 )
  idx#21 = phi( outsw/idx#26, outw/idx#27, outw::@1/idx#5 )
  idx#8 = ++ idx#21
  SCREEN[idx#8] = out::c#3
  to:out::@return
out::@return: scope:[out]  from out
  idx#22 = phi( out/idx#8 )
  idx#9 = idx#22
  return 
  to:@return

void __start()
__start: scope:[__start]  from
  to:__start::__init1
__start::__init1: scope:[__start]  from __start
  idx#10 = 0
  to:__start::@1
__start::@1: scope:[__start]  from __start::__init1
  idx#28 = phi( __start::__init1/idx#10 )
  call main
  to:__start::@2
__start::@2: scope:[__start]  from __start::@1
  idx#23 = phi( __start::@1/idx#1 )
  idx#11 = idx#23
  to:__start::@return
__start::@return: scope:[__start]  from __start::@2
  idx#24 = phi( __start::@2/idx#11 )
  idx#12 = idx#24
  return 
  to:@return

SYMBOL TABLE SSA
__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#23
char idx#24
char idx#25
char idx#26
char idx#27
char idx#28
char idx#29
char idx#3
char idx#4
char idx#5
char idx#6
char idx#7
char idx#8
char idx#9
void main()
bool main::$1
char main::c
char main::c#0
char main::c#1
char main::c#2
char main::c#3
void out(char c)
char out::c
char out::c#0
char out::c#1
char out::c#2
char out::c#3
void outsw(char c)
char outsw::c
char outsw::c#0
char outsw::c#1
char outsw::c#2
void outw(char c)
char outw::$0
number outw::$2
char outw::c
char outw::c#0
char outw::c#1
char outw::c#2

Adding number conversion cast (unumber) 4 in outw::$0 = outw::c#1 << 4
Adding number conversion cast (unumber) $f in outw::$2 = outw::c#2 & $f
Adding number conversion cast (unumber) outw::$2 in outw::$2 = outw::c#2 & (unumber)$f
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant pointer cast (char *) 1024
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to char in outw::$2 = outw::c#2 & $f
Alias main::c#2 = main::c#3 
Alias idx#0 = idx#13 idx#14 idx#1 
Alias outsw::c#1 = outsw::c#2 
Alias idx#15 = idx#2 
Alias idx#16 = idx#3 idx#17 idx#4 
Alias out::c#1 = outw::$0 
Alias outw::c#1 = outw::c#2 
Alias idx#18 = idx#5 
Alias out::c#2 = outw::$2 
Alias idx#19 = idx#6 idx#20 idx#7 
Alias idx#22 = idx#8 idx#9 
Alias idx#10 = idx#28 
Alias idx#11 = idx#23 idx#24 idx#12 
Successful SSA optimization Pass2AliasElimination
Identical Phi Values idx#29 idx#10
Identical Phi Values idx#0 idx#16
Identical Phi Values idx#26 idx#25
Identical Phi Values outsw::c#1 outsw::c#0
Identical Phi Values idx#15 idx#22
Identical Phi Values idx#16 idx#19
Identical Phi Values outw::c#1 outw::c#0
Identical Phi Values idx#27 idx#15
Identical Phi Values idx#18 idx#22
Identical Phi Values idx#19 idx#22
Identical Phi Values idx#11 idx#0
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition main::$1 [8] if(main::c#1!=rangelast(0,$27)) goto main::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant main::c#0 = 0
Constant out::c#0 = '-'
Constant idx#10 = 0
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [6] main::c#1 = ++ main::c#2 to ++
Resolved ranged comparison value [8] if(main::c#1!=rangelast(0,$27)) goto main::@1 to $28
Removing unused procedure __start
Removing unused procedure block __start
Removing unused procedure block __start::__init1
Removing unused procedure block __start::@1
Removing unused procedure block __start::@2
Removing unused procedure block __start::@return
Successful SSA optimization PassNEliminateEmptyStart
Adding number conversion cast (unumber) $28 in [4] if(main::c#1!=$28) goto main::@1
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast $28
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) $28
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inlining constant with var siblings main::c#0
Inlining constant with var siblings out::c#0
Inlining constant with var siblings idx#10
Constant inlined idx#10 = 0
Constant inlined out::c#0 = '-'
Constant inlined main::c#0 = 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@3(between main::@2 and main::@1)
Adding NOP phi() at start of main
Adding NOP phi() at start of outsw::@2
Adding NOP phi() at start of outw::@2
CALL GRAPH
Calls in [main] to outsw:3 
Calls in [outsw] to out:10 outw:12 
Calls in [outw] to out:22 out:26 

Created 4 initial phi equivalence classes
Coalesced [7] main::c#4 = main::c#1
Coalesced [8] idx#30 = idx#22
Coalesced [9] idx#31 = idx#25
Coalesced (already) [20] idx#32 = idx#22
Coalesced [21] out::c#4 = out::c#1
Coalesced (already) [24] idx#33 = idx#22
Coalesced [25] out::c#5 = out::c#2
Coalesced down to 3 phi equivalence classes
Culled Empty Block label main::@3
Culled Empty Block label outsw::@2
Culled Empty Block label outw::@2
Adding NOP phi() at start of main
Adding NOP phi() at start of outsw

FINAL CONTROL FLOW GRAPH

void main()
main: scope:[main]  from
  [0] phi()
  to:main::@1
main::@1: scope:[main]  from main main::@2
  [1] idx#25 = phi( main/0, main::@2/idx#22 )
  [1] main::c#2 = phi( main/0, main::@2/main::c#1 )
  [2] outsw::c#0 = main::c#2
  [3] call outsw
  to:main::@2
main::@2: scope:[main]  from main::@1
  [4] main::c#1 = ++ main::c#2
  [5] if(main::c#1!=$28) goto main::@1
  to:main::@return
main::@return: scope:[main]  from main::@2
  [6] return 
  to:@return

void outsw(char c)
outsw: scope:[outsw]  from main::@1
  [7] phi()
  [8] call out
  to:outsw::@1
outsw::@1: scope:[outsw]  from outsw
  [9] outw::c#0 = outsw::c#0
  [10] call outw
  to:outsw::@return
outsw::@return: scope:[outsw]  from outsw::@1
  [11] return 
  to:@return

void out(char c)
out: scope:[out]  from outsw outw outw::@1
  [12] out::c#3 = phi( outsw/'-', outw/out::c#1, outw::@1/out::c#2 )
  [12] idx#21 = phi( outsw/idx#25, outw/idx#22, outw::@1/idx#22 )
  [13] idx#22 = ++ idx#21
  [14] SCREEN[idx#22] = out::c#3
  to:out::@return
out::@return: scope:[out]  from out
  [15] return 
  to:@return

void outw(char c)
outw: scope:[outw]  from outsw::@1
  [16] out::c#1 = outw::c#0 << 4
  [17] call out
  to:outw::@1
outw::@1: scope:[outw]  from outw
  [18] out::c#2 = outw::c#0 & $f
  [19] call out
  to:outw::@return
outw::@return: scope:[outw]  from outw::@1
  [20] return 
  to:@return


VARIABLE REGISTER WEIGHTS
char idx
char idx#21 // 12104.0
char idx#22 // 1467.6666666666667
char idx#25 // 37.33333333333333
void main()
char main::c
char main::c#1 // 16.5
char main::c#2 // 11.0
void out(char c)
char out::c
char out::c#1 // 2002.0
char out::c#2 // 2002.0
char out::c#3 // 6001.5
void outsw(char c)
char outsw::c
char outsw::c#0 // 37.33333333333333
void outw(char c)
char outw::c
char outw::c#0 // 701.0

Initial phi equivalence classes
[ main::c#2 main::c#1 ]
[ idx#21 idx#25 idx#22 ]
[ out::c#3 out::c#1 out::c#2 ]
Added variable outsw::c#0 to live range equivalence class [ outsw::c#0 ]
Added variable outw::c#0 to live range equivalence class [ outw::c#0 ]
Complete equivalence classes
[ main::c#2 main::c#1 ]
[ idx#21 idx#25 idx#22 ]
[ out::c#3 out::c#1 out::c#2 ]
[ outsw::c#0 ]
[ outw::c#0 ]
Allocated zp[1]:2 [ idx#21 idx#25 idx#22 ]
Allocated zp[1]:3 [ out::c#3 out::c#1 out::c#2 ]
Allocated zp[1]:4 [ outw::c#0 ]
Allocated zp[1]:5 [ outsw::c#0 ]
Allocated zp[1]:6 [ main::c#2 main::c#1 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [16] out::c#1 = outw::c#0 << 4 [ idx#22 outw::c#0 out::c#1 ] ( outsw:3::outw:10 [ main::c#2 idx#22 outw::c#0 out::c#1 ] { { outsw::c#0 = main::c#2 outw::c#0 } { idx#21 = idx#22 } { out::c#1 = out::c#3 } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:6 [ main::c#2 main::c#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:2 [ idx#21 idx#25 idx#22 ]
Removing always clobbered register reg byte a as potential for zp[1]:4 [ outw::c#0 ]
Statement [18] out::c#2 = outw::c#0 & $f [ idx#22 out::c#2 ] ( outsw:3::outw:10 [ main::c#2 idx#22 out::c#2 ] { { outsw::c#0 = main::c#2 outw::c#0 } { idx#21 = idx#22 } { out::c#2 = out::c#3 } }  ) always clobbers reg byte a 
Statement [16] out::c#1 = outw::c#0 << 4 [ idx#22 outw::c#0 out::c#1 ] ( outsw:3::outw:10 [ main::c#2 idx#22 outw::c#0 out::c#1 ] { { outsw::c#0 = main::c#2 outw::c#0 } { idx#21 = idx#22 } { out::c#1 = out::c#3 } }  ) always clobbers reg byte a 
Statement [18] out::c#2 = outw::c#0 & $f [ idx#22 out::c#2 ] ( outsw:3::outw:10 [ main::c#2 idx#22 out::c#2 ] { { outsw::c#0 = main::c#2 outw::c#0 } { idx#21 = idx#22 } { out::c#2 = out::c#3 } }  ) always clobbers reg byte a 
Potential registers zp[1]:6 [ main::c#2 main::c#1 ] : zp[1]:6 , reg byte x , reg byte y , 
Potential registers zp[1]:2 [ idx#21 idx#25 idx#22 ] : zp[1]:2 , reg byte x , reg byte y , 
Potential registers zp[1]:3 [ out::c#3 out::c#1 out::c#2 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:5 [ outsw::c#0 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:4 [ outw::c#0 ] : zp[1]:4 , reg byte x , reg byte y , 

REGISTER UPLIFT SCOPES
Uplift Scope [] 13,609: zp[1]:2 [ idx#21 idx#25 idx#22 ] 
Uplift Scope [out] 10,005.5: zp[1]:3 [ out::c#3 out::c#1 out::c#2 ] 
Uplift Scope [outw] 701: zp[1]:4 [ outw::c#0 ] 
Uplift Scope [outsw] 37.33: zp[1]:5 [ outsw::c#0 ] 
Uplift Scope [main] 27.5: zp[1]:6 [ main::c#2 main::c#1 ] 

Uplifting [] best 460 combination reg byte x [ idx#21 idx#25 idx#22 ] 
Uplifting [out] best 448 combination reg byte a [ out::c#3 out::c#1 out::c#2 ] 
Uplifting [outw] best 443 combination reg byte y [ outw::c#0 ] 
Uplifting [outsw] best 410 combination reg byte y [ outsw::c#0 ] 
Uplifting [main] best 290 combination reg byte y [ main::c#2 main::c#1 ] 

ASSEMBLER BEFORE OPTIMIZATION
  // File Comments
// Test effective live range and register allocation
// Here main::c, outsw::c and outw::c can all have the same allocation
  // Upstart
  // Commodore 64 PRG executable file
.file [name="liverange-9.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] phi from main to main::@1 [phi:main->main::@1]
  __b1_from_main:
    // [1] phi idx#25 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 
    ldx #0
    // [1] phi main::c#2 = 0 [phi:main->main::@1#1] -- vbuyy=vbuc1 
    ldy #0
    jmp __b1
    // [1] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
  __b1_from___b2:
    // [1] phi idx#25 = idx#22 [phi:main::@2->main::@1#0] -- register_copy 
    // [1] phi main::c#2 = main::c#1 [phi:main::@2->main::@1#1] -- register_copy 
    jmp __b1
    // main::@1
  __b1:
    // [2] outsw::c#0 = main::c#2
    // [3] call outsw
    // [7] phi from main::@1 to outsw [phi:main::@1->outsw]
  outsw_from___b1:
    jsr outsw
    jmp __b2
    // main::@2
  __b2:
    // [4] main::c#1 = ++ main::c#2 -- vbuyy=_inc_vbuyy 
    iny
    // [5] if(main::c#1!=$28) goto main::@1 -- vbuyy_neq_vbuc1_then_la1 
    cpy #$28
    bne __b1_from___b2
    jmp __breturn
    // main::@return
  __breturn:
    // [6] return 
    rts
}
  // outsw
// void outsw(__register(Y) char c)
outsw: {
    // [8] call out
    // [12] phi from outsw to out [phi:outsw->out]
  out_from_outsw:
    // [12] phi out::c#3 = '-' [phi:outsw->out#0] -- vbuaa=vbuc1 
    lda #'-'
    // [12] phi idx#21 = idx#25 [phi:outsw->out#1] -- register_copy 
    jsr out
    jmp __b1
    // outsw::@1
  __b1:
    // [9] outw::c#0 = outsw::c#0
    // [10] call outw
    jsr outw
    jmp __breturn
    // outsw::@return
  __breturn:
    // [11] return 
    rts
}
  // out
// void out(__register(A) char c)
out: {
    // [13] idx#22 = ++ idx#21 -- vbuxx=_inc_vbuxx 
    inx
    // [14] SCREEN[idx#22] = out::c#3 -- pbuc1_derefidx_vbuxx=vbuaa 
    sta SCREEN,x
    jmp __breturn
    // out::@return
  __breturn:
    // [15] return 
    rts
}
  // outw
// void outw(__register(Y) char c)
outw: {
    // [16] out::c#1 = outw::c#0 << 4 -- vbuaa=vbuyy_rol_4 
    tya
    asl
    asl
    asl
    asl
    // [17] call out
    // [12] phi from outw to out [phi:outw->out]
  out_from_outw:
    // [12] phi out::c#3 = out::c#1 [phi:outw->out#0] -- register_copy 
    // [12] phi idx#21 = idx#22 [phi:outw->out#1] -- register_copy 
    jsr out
    jmp __b1
    // outw::@1
  __b1:
    // [18] out::c#2 = outw::c#0 & $f -- vbuaa=vbuyy_band_vbuc1 
    tya
    and #$f
    // [19] call out
    // [12] phi from outw::@1 to out [phi:outw::@1->out]
  out_from___b1:
    // [12] phi out::c#3 = out::c#2 [phi:outw::@1->out#0] -- register_copy 
    // [12] phi idx#21 = idx#22 [phi:outw::@1->out#1] -- register_copy 
    jsr out
    jmp __breturn
    // outw::@return
  __breturn:
    // [20] return 
    rts
}
  // File Data

ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __breturn
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___b2 with __b1
Removing instruction __b1_from___b2:
Removing instruction outsw_from___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __b1_from_main:
Removing instruction __b2:
Removing instruction __breturn:
Removing instruction out_from_outsw:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction out_from_outw:
Removing instruction __b1:
Removing instruction out_from___b1:
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp __b1
Succesful ASM optimization Pass5NextJumpElimination

FINAL SYMBOL TABLE
__constant char * const SCREEN = (char *) 1024
char idx
char idx#21 // reg byte x 12104.0
char idx#22 // reg byte x 1467.6666666666667
char idx#25 // reg byte x 37.33333333333333
void main()
char main::c
char main::c#1 // reg byte y 16.5
char main::c#2 // reg byte y 11.0
void out(char c)
char out::c
char out::c#1 // reg byte a 2002.0
char out::c#2 // reg byte a 2002.0
char out::c#3 // reg byte a 6001.5
void outsw(char c)
char outsw::c
char outsw::c#0 // reg byte y 37.33333333333333
void outw(char c)
char outw::c
char outw::c#0 // reg byte y 701.0

reg byte y [ main::c#2 main::c#1 ]
reg byte x [ idx#21 idx#25 idx#22 ]
reg byte a [ out::c#3 out::c#1 out::c#2 ]
reg byte y [ outsw::c#0 ]
reg byte y [ outw::c#0 ]


FINAL ASSEMBLER
Score: 182

  // File Comments
// Test effective live range and register allocation
// Here main::c, outsw::c and outw::c can all have the same allocation
  // Upstart
  // Commodore 64 PRG executable file
.file [name="liverange-9.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] phi from main to main::@1 [phi:main->main::@1]
    // [1] phi idx#25 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 
    ldx #0
    // [1] phi main::c#2 = 0 [phi:main->main::@1#1] -- vbuyy=vbuc1 
    ldy #0
    // [1] phi from main::@2 to main::@1 [phi:main::@2->main::@1]
    // [1] phi idx#25 = idx#22 [phi:main::@2->main::@1#0] -- register_copy 
    // [1] phi main::c#2 = main::c#1 [phi:main::@2->main::@1#1] -- register_copy 
    // main::@1
  __b1:
    // outsw(c)
    // [2] outsw::c#0 = main::c#2
    // [3] call outsw
    // [7] phi from main::@1 to outsw [phi:main::@1->outsw]
    jsr outsw
    // main::@2
    // for(char c: 0..39 )
    // [4] main::c#1 = ++ main::c#2 -- vbuyy=_inc_vbuyy 
    iny
    // [5] if(main::c#1!=$28) goto main::@1 -- vbuyy_neq_vbuc1_then_la1 
    cpy #$28
    bne __b1
    // main::@return
    // }
    // [6] return 
    rts
}
  // outsw
// void outsw(__register(Y) char c)
outsw: {
    // out('-')
    // [8] call out
    // [12] phi from outsw to out [phi:outsw->out]
    // [12] phi out::c#3 = '-' [phi:outsw->out#0] -- vbuaa=vbuc1 
    lda #'-'
    // [12] phi idx#21 = idx#25 [phi:outsw->out#1] -- register_copy 
    jsr out
    // outsw::@1
    // outw(c)
    // [9] outw::c#0 = outsw::c#0
    // [10] call outw
    jsr outw
    // outsw::@return
    // }
    // [11] return 
    rts
}
  // out
// void out(__register(A) char c)
out: {
    // idx++;
    // [13] idx#22 = ++ idx#21 -- vbuxx=_inc_vbuxx 
    inx
    // SCREEN[idx] = c
    // [14] SCREEN[idx#22] = out::c#3 -- pbuc1_derefidx_vbuxx=vbuaa 
    sta SCREEN,x
    // out::@return
    // }
    // [15] return 
    rts
}
  // outw
// void outw(__register(Y) char c)
outw: {
    // out(c<<4)
    // [16] out::c#1 = outw::c#0 << 4 -- vbuaa=vbuyy_rol_4 
    tya
    asl
    asl
    asl
    asl
    // [17] call out
    // [12] phi from outw to out [phi:outw->out]
    // [12] phi out::c#3 = out::c#1 [phi:outw->out#0] -- register_copy 
    // [12] phi idx#21 = idx#22 [phi:outw->out#1] -- register_copy 
    jsr out
    // outw::@1
    // out(c&0x0f)
    // [18] out::c#2 = outw::c#0 & $f -- vbuaa=vbuyy_band_vbuc1 
    tya
    and #$f
    // [19] call out
    // [12] phi from outw::@1 to out [phi:outw::@1->out]
    // [12] phi out::c#3 = out::c#2 [phi:outw::@1->out#0] -- register_copy 
    // [12] phi idx#21 = idx#22 [phi:outw::@1->out#1] -- register_copy 
    jsr out
    // outw::@return
    // }
    // [20] return 
    rts
}
  // File Data

