diff --git a/src/test/kc/complex/xmega65/xmega65.kc b/src/test/kc/complex/xmega65/xmega65.kc index fcd31ddd2..d92a76637 100644 --- a/src/test/kc/complex/xmega65/xmega65.kc +++ b/src/test/kc/complex/xmega65/xmega65.kc @@ -6,11 +6,10 @@ void main() { char i=0; - // Call functions one at a time + // Call SYSCALL functions one at a time while(true) { - unsigned int fn = CALLS[i*2]; - void()* f = (void()*)fn; - (*f)(); + void()* fsyscall = FSYSCALLS[i*2]; + (*fsyscall)(); if(++i==2) i=0; } } @@ -35,4 +34,4 @@ char[] SYSCALLS = { JMP, <&fn2, >&fn2, NOP }; -const unsigned int* CALLS = (unsigned int*)(SYSCALLS+1); +const void()** FSYSCALLS = (void()**)(SYSCALLS+1); diff --git a/src/test/ref/complex/xmega65/xmega65.asm b/src/test/ref/complex/xmega65/xmega65.asm index 840849ca9..6d558126f 100644 --- a/src/test/ref/complex/xmega65/xmega65.asm +++ b/src/test/ref/complex/xmega65/xmega65.asm @@ -10,32 +10,32 @@ .segmentdef Zeropage [min=$bf00, max=$bfff, fill] .const JMP = $4c .const NOP = $ea - .label CALLS = SYSCALLS+1 + .label FSYSCALLS = SYSCALLS+1 .segment Code main: { - .label fn = 3 + .label fsyscall = 3 .label i = 2 b1: lda #0 sta.z i - // Call functions one at a time + // Call SYSCALL functions one at a time b2: lda.z i asl asl tay - lda CALLS,y - sta.z fn - lda CALLS+1,y - sta.z fn+1 - jsr bi_fn + lda FSYSCALLS,y + sta.z fsyscall + lda FSYSCALLS+1,y + sta.z fsyscall+1 + jsr bi_fsyscall inc.z i lda #2 cmp.z i bne b2 jmp b1 - bi_fn: - jmp (fn) + bi_fsyscall: + jmp (fsyscall) } fn2: { .label BGCOL = $d021 diff --git a/src/test/ref/complex/xmega65/xmega65.cfg b/src/test/ref/complex/xmega65/xmega65.cfg index e65c08411..8bffdbe96 100644 --- a/src/test/ref/complex/xmega65/xmega65.cfg +++ b/src/test/ref/complex/xmega65/xmega65.cfg @@ -15,9 +15,9 @@ main::@1: scope:[main] from main main::@2 main::@3 to:main::@2 main::@2: scope:[main] from main::@1 [6] (byte~) main::$0 ← (byte) main::i#3 << (byte) 1 - [7] (byte~) main::$5 ← (byte~) main::$0 << (byte) 1 - [8] (word) main::fn#0 ← *((const word*) CALLS#0 + (byte~) main::$5) - [9] call *((void()*)(word) main::fn#0) + [7] (byte~) main::$4 ← (byte~) main::$0 << (byte) 1 + [8] (void()*) main::fsyscall#0 ← *((const void()**) FSYSCALLS#0 + (byte~) main::$4) + [9] call *((void()*) main::fsyscall#0) [10] (byte) main::i#1 ← ++ (byte) main::i#3 [11] if((byte) main::i#1!=(byte) 2) goto main::@3 to:main::@1 diff --git a/src/test/ref/complex/xmega65/xmega65.log b/src/test/ref/complex/xmega65/xmega65.log index 9f7ba7f8d..b7c573d04 100644 --- a/src/test/ref/complex/xmega65/xmega65.log +++ b/src/test/ref/complex/xmega65/xmega65.log @@ -1,6 +1,6 @@ Loading link script "xmega65.ld" -Resolved forward reference CALLS to (word*) CALLS -Fixing pointer array-indexing *((word*) CALLS + (number~) main::$0) +Resolved forward reference FSYSCALLS to (void()**) FSYSCALLS +Fixing pointer array-indexing *((void()**) FSYSCALLS + (number~) main::$0) Culled Empty Block (label) main::@5 Culled Empty Block (label) main::@3 Culled Empty Block (label) main::@6 @@ -22,15 +22,13 @@ main::@1: scope:[main] from main main::@2 main::@7 main::@2: scope:[main] from main::@1 (byte) main::i#3 ← phi( main::@1/(byte) main::i#4 ) (number~) main::$0 ← (byte) main::i#3 * (number) 2 - (number~) main::$5 ← (number~) main::$0 * (const byte) SIZEOF_WORD - (word) main::fn#0 ← *((word*) CALLS#0 + (number~) main::$5) - (void()*~) main::$1 ← ((void()*)) (word) main::fn#0 - (void()*) main::f#0 ← (void()*~) main::$1 - call *((void()*) main::f#0) + (number~) main::$4 ← (number~) main::$0 * (const byte) SIZEOF_POINTER + (void()*) main::fsyscall#0 ← *((void()**) FSYSCALLS#0 + (number~) main::$4) + call *((void()*) main::fsyscall#0) (byte) main::i#1 ← ++ (byte) main::i#3 - (bool~) main::$3 ← (byte) main::i#1 == (number) 2 - (bool~) main::$4 ← ! (bool~) main::$3 - if((bool~) main::$4) goto main::@1 + (bool~) main::$2 ← (byte) main::i#1 == (number) 2 + (bool~) main::$3 ← ! (bool~) main::$2 + if((bool~) main::$3) goto main::@1 to:main::@7 main::@7: scope:[main] from main::@2 (byte) main::i#2 ← (number) 0 @@ -65,8 +63,8 @@ fn2::@return: scope:[fn2] from fn2 (byte~) $7 ← > (void()*~) $6 (byte[]) SYSCALLS#0 ← { (byte) JMP#0, (byte~) $1, (byte~) $3, (byte) NOP#0, (byte) JMP#0, (byte~) $5, (byte~) $7, (byte) NOP#0 } (byte*~) $8 ← (byte[]) SYSCALLS#0 + (number) 1 - (word*~) $9 ← ((word*)) (byte*~) $8 - (word*) CALLS#0 ← (word*~) $9 + (void()**~) $9 ← ((void()**)) (byte*~) $8 + (void()**) FSYSCALLS#0 ← (void()**~) $9 call main to:@4 @4: scope:[] from @3 @@ -83,18 +81,18 @@ SYMBOL TABLE SSA (void()*~) $6 (byte~) $7 (byte*~) $8 -(word*~) $9 +(void()**~) $9 (label) @3 (label) @4 (label) @begin (label) @end -(word*) CALLS -(word*) CALLS#0 +(void()**) FSYSCALLS +(void()**) FSYSCALLS#0 (byte) JMP (byte) JMP#0 (byte) NOP (byte) NOP#0 -(const byte) SIZEOF_WORD = (byte) 2 +(const byte) SIZEOF_POINTER = (byte) 2 (byte[]) SYSCALLS (byte[]) SYSCALLS#0 (void()) fn1() @@ -107,18 +105,15 @@ SYMBOL TABLE SSA (byte*) fn2::BGCOL#0 (void()) main() (number~) main::$0 -(void()*~) main::$1 +(bool~) main::$2 (bool~) main::$3 -(bool~) main::$4 -(number~) main::$5 +(number~) main::$4 (label) main::@1 (label) main::@2 (label) main::@7 (label) main::@return -(void()*) main::f -(void()*) main::f#0 -(word) main::fn -(word) main::fn#0 +(void()*) main::fsyscall +(void()*) main::fsyscall#0 (byte) main::i (byte) main::i#0 (byte) main::i#1 @@ -129,21 +124,20 @@ SYMBOL TABLE SSA Adding number conversion cast (unumber) 0 in (byte) main::i#0 ← (number) 0 Adding number conversion cast (unumber) 2 in (number~) main::$0 ← (byte) main::i#3 * (number) 2 Adding number conversion cast (unumber) main::$0 in (number~) main::$0 ← (byte) main::i#3 * (unumber)(number) 2 -Adding number conversion cast (unumber) main::$5 in (number~) main::$5 ← (unumber~) main::$0 * (const byte) SIZEOF_WORD -Adding number conversion cast (unumber) 2 in (bool~) main::$3 ← (byte) main::i#1 == (number) 2 +Adding number conversion cast (unumber) main::$4 in (number~) main::$4 ← (unumber~) main::$0 * (const byte) SIZEOF_POINTER +Adding number conversion cast (unumber) 2 in (bool~) main::$2 ← (byte) main::i#1 == (number) 2 Adding number conversion cast (unumber) 0 in (byte) main::i#2 ← (number) 0 Adding number conversion cast (unumber) $4c in (byte) JMP#0 ← (number) $4c Adding number conversion cast (unumber) $ea in (byte) NOP#0 ← (number) $ea Adding number conversion cast (unumber) 1 in (byte*~) $8 ← (byte[]) SYSCALLS#0 + (number) 1 Successful SSA optimization PassNAddNumberTypeConversions Inlining cast (byte) main::i#0 ← (unumber)(number) 0 -Inlining cast (void()*~) main::$1 ← (void()*)(word) main::fn#0 Inlining cast (byte) main::i#2 ← (unumber)(number) 0 Inlining cast (byte*) fn1::BORDERCOL#0 ← (byte*)(number) $d020 Inlining cast (byte*) fn2::BGCOL#0 ← (byte*)(number) $d021 Inlining cast (byte) JMP#0 ← (unumber)(number) $4c Inlining cast (byte) NOP#0 ← (unumber)(number) $ea -Inlining cast (word*~) $9 ← (word*)(byte*~) $8 +Inlining cast (void()**~) $9 ← (void()**)(byte*~) $8 Successful SSA optimization Pass2InlineCast Simplifying constant integer cast 0 Simplifying constant integer cast 2 @@ -164,20 +158,19 @@ Finalized unsigned number type (byte) $ea Finalized unsigned number type (byte) 1 Successful SSA optimization PassNFinalizeNumberTypeConversions Inferred type updated to byte in (unumber~) main::$0 ← (byte) main::i#3 * (byte) 2 -Inferred type updated to byte in (unumber~) main::$5 ← (byte~) main::$0 * (const byte) SIZEOF_WORD -Inversing boolean not [12] (bool~) main::$4 ← (byte) main::i#1 != (byte) 2 from [11] (bool~) main::$3 ← (byte) main::i#1 == (byte) 2 +Inferred type updated to byte in (unumber~) main::$4 ← (byte~) main::$0 * (const byte) SIZEOF_POINTER +Inversing boolean not [10] (bool~) main::$3 ← (byte) main::i#1 != (byte) 2 from [9] (bool~) main::$2 ← (byte) main::i#1 == (byte) 2 Successful SSA optimization Pass2UnaryNotSimplification Alias (byte) main::i#3 = (byte) main::i#4 -Alias (void()*) main::f#0 = (void()*~) main::$1 -Alias (word*) CALLS#0 = (word*~) $9 +Alias (void()**) FSYSCALLS#0 = (void()**~) $9 Successful SSA optimization Pass2AliasElimination -Identified duplicate assignment right side [26] (void()*~) $2 ← & (void()) fn1() -Identified duplicate assignment right side [30] (void()*~) $6 ← & (void()) fn2() +Identified duplicate assignment right side [24] (void()*~) $2 ← & (void()) fn1() +Identified duplicate assignment right side [28] (void()*~) $6 ← & (void()) fn2() Successful SSA optimization Pass2DuplicateRValueIdentification -Simple Condition (bool~) main::$4 [13] if((byte) main::i#1!=(byte) 2) goto main::@1 +Simple Condition (bool~) main::$3 [11] if((byte) main::i#1!=(byte) 2) goto main::@1 Successful SSA optimization Pass2ConditionalJumpSimplification -Constant right-side identified [24] (void()*~) $0 ← & (void()) fn1() -Constant right-side identified [28] (void()*~) $4 ← & (void()) fn2() +Constant right-side identified [22] (void()*~) $0 ← & (void()) fn1() +Constant right-side identified [26] (void()*~) $4 ← & (void()) fn2() Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte) main::i#0 = 0 Constant (const byte) main::i#2 = 0 @@ -195,10 +188,10 @@ if() condition always true - replacing block destination [2] if(true) goto main: Successful SSA optimization Pass2ConstantIfs Removing unused block main::@return Successful SSA optimization Pass2EliminateUnusedBlocks -Constant right-side identified [12] (byte~) $1 ← < (const void()*) $0 -Constant right-side identified [13] (byte~) $3 ← > (const void()*) $2 -Constant right-side identified [14] (byte~) $5 ← < (const void()*) $4 -Constant right-side identified [15] (byte~) $7 ← > (const void()*) $6 +Constant right-side identified [11] (byte~) $1 ← < (const void()*) $0 +Constant right-side identified [12] (byte~) $3 ← > (const void()*) $2 +Constant right-side identified [13] (byte~) $5 ← < (const void()*) $4 +Constant right-side identified [14] (byte~) $7 ← > (const void()*) $6 Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte) $1 = <$0 Constant (const byte) $3 = >$2 @@ -209,18 +202,16 @@ Identified constant from value list (byte[]) { (const byte) JMP#0, (const byte) Successful SSA optimization Pass2ConstantInitializerValueLists Constant (const byte[]) SYSCALLS#0 = { JMP#0, $1, $3, NOP#0, JMP#0, $5, $7, NOP#0 } Successful SSA optimization Pass2ConstantIdentification -Constant right-side identified [12] (byte*~) $8 ← (const byte[]) SYSCALLS#0 + (byte) 1 +Constant right-side identified [11] (byte*~) $8 ← (const byte[]) SYSCALLS#0 + (byte) 1 Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte*) $8 = SYSCALLS#0+1 Successful SSA optimization Pass2ConstantIdentification -Constant value identified (word*)$8 in [13] (word*) CALLS#0 ← (word*)(const byte*) $8 +Constant value identified (void()**)$8 in [12] (void()**) FSYSCALLS#0 ← (void()**)(const byte*) $8 Successful SSA optimization Pass2ConstantValues -Constant (const word*) CALLS#0 = (word*)$8 +Constant (const void()**) FSYSCALLS#0 = (void()**)$8 Successful SSA optimization Pass2ConstantIdentification -Inlining Noop Cast [4] (void()*) main::f#0 ← (void()*)(word) main::fn#0 keeping main::fn#0 -Successful SSA optimization Pass2NopCastInlining Rewriting multiplication to use shift [1] (byte~) main::$0 ← (byte) main::i#3 * (byte) 2 -Rewriting multiplication to use shift [2] (byte~) main::$5 ← (byte~) main::$0 * (const byte) SIZEOF_WORD +Rewriting multiplication to use shift [2] (byte~) main::$4 ← (byte~) main::$0 * (const byte) SIZEOF_POINTER Successful SSA optimization Pass2MultiplyToShiftRewriting Inlining constant with var siblings (const byte) main::i#0 Inlining constant with var siblings (const byte) main::i#2 @@ -236,7 +227,7 @@ Constant inlined $1 = <&(void()) fn1() Constant inlined $2 = &(void()) fn1() Constant inlined $3 = >&(void()) fn1() Successful SSA optimization Pass2ConstantInlining -Eliminating unused constant (const byte) SIZEOF_WORD +Eliminating unused constant (const byte) SIZEOF_POINTER Successful SSA optimization PassNEliminateUnusedVars Added new block during phi lifting main::@9(between main::@2 and main::@1) Adding NOP phi() at start of @begin @@ -279,9 +270,9 @@ main::@1: scope:[main] from main main::@2 main::@3 to:main::@2 main::@2: scope:[main] from main::@1 [6] (byte~) main::$0 ← (byte) main::i#3 << (byte) 1 - [7] (byte~) main::$5 ← (byte~) main::$0 << (byte) 1 - [8] (word) main::fn#0 ← *((const word*) CALLS#0 + (byte~) main::$5) - [9] call *((void()*)(word) main::fn#0) + [7] (byte~) main::$4 ← (byte~) main::$0 << (byte) 1 + [8] (void()*) main::fsyscall#0 ← *((const void()**) FSYSCALLS#0 + (byte~) main::$4) + [9] call *((void()*) main::fsyscall#0) [10] (byte) main::i#1 ← ++ (byte) main::i#3 [11] if((byte) main::i#1!=(byte) 2) goto main::@3 to:main::@1 @@ -303,7 +294,7 @@ fn1::@return: scope:[fn1] from fn1 VARIABLE REGISTER WEIGHTS -(word*) CALLS +(void()**) FSYSCALLS (byte) JMP (byte) NOP (byte[]) SYSCALLS @@ -313,10 +304,9 @@ VARIABLE REGISTER WEIGHTS (byte*) fn2::BGCOL (void()) main() (byte~) main::$0 202.0 -(byte~) main::$5 202.0 -(void()*) main::f -(word) main::fn -(word) main::fn#0 101.0 +(byte~) main::$4 202.0 +(void()*) main::fsyscall +(void()*) main::fsyscall#0 101.0 (byte) main::i (byte) main::i#1 71.0 (byte) main::i#3 42.599999999999994 @@ -324,17 +314,17 @@ VARIABLE REGISTER WEIGHTS Initial phi equivalence classes [ main::i#3 main::i#1 ] Added variable main::$0 to zero page equivalence class [ main::$0 ] -Added variable main::$5 to zero page equivalence class [ main::$5 ] -Added variable main::fn#0 to zero page equivalence class [ main::fn#0 ] +Added variable main::$4 to zero page equivalence class [ main::$4 ] +Added variable main::fsyscall#0 to zero page equivalence class [ main::fsyscall#0 ] Complete equivalence classes [ main::i#3 main::i#1 ] [ main::$0 ] -[ main::$5 ] -[ main::fn#0 ] +[ main::$4 ] +[ main::fsyscall#0 ] Allocated zp ZP_BYTE:2 [ main::i#3 main::i#1 ] Allocated zp ZP_BYTE:3 [ main::$0 ] -Allocated zp ZP_BYTE:4 [ main::$5 ] -Allocated zp ZP_WORD:5 [ main::fn#0 ] +Allocated zp ZP_BYTE:4 [ main::$4 ] +Allocated zp ZP_WORD:5 [ main::fsyscall#0 ] INITIAL ASM Target platform is custom @@ -353,7 +343,7 @@ Target platform is custom // Global Constants & labels .const JMP = $4c .const NOP = $ea - .label CALLS = SYSCALLS+1 + .label FSYSCALLS = SYSCALLS+1 // @begin bbegin: // [1] phi from @begin to @1 [phi:@begin->@1] @@ -374,8 +364,8 @@ bend: // main main: { .label _0 = 3 - .label _5 = 4 - .label fn = 5 + .label _4 = 4 + .label fsyscall = 5 .label i = 2 // [5] phi from main main::@2 to main::@1 [phi:main/main::@2->main::@1] b1_from_main: @@ -384,7 +374,7 @@ main: { lda #0 sta.z i jmp b1 - // Call functions one at a time + // Call SYSCALL functions one at a time // main::@1 b1: jmp b2 @@ -394,18 +384,18 @@ main: { lda.z i asl sta.z _0 - // [7] (byte~) main::$5 ← (byte~) main::$0 << (byte) 1 -- vbuz1=vbuz2_rol_1 + // [7] (byte~) main::$4 ← (byte~) main::$0 << (byte) 1 -- vbuz1=vbuz2_rol_1 lda.z _0 asl - sta.z _5 - // [8] (word) main::fn#0 ← *((const word*) CALLS#0 + (byte~) main::$5) -- vwuz1=pwuc1_derefidx_vbuz2 - ldy.z _5 - lda CALLS,y - sta.z fn - lda CALLS+1,y - sta.z fn+1 - // [9] call *((void()*)(word) main::fn#0) - jsr bi_fn + sta.z _4 + // [8] (void()*) main::fsyscall#0 ← *((const void()**) FSYSCALLS#0 + (byte~) main::$4) -- pprz1=pptc1_derefidx_vbuz2 + ldy.z _4 + lda FSYSCALLS,y + sta.z fsyscall + lda FSYSCALLS+1,y + sta.z fsyscall+1 + // [9] call *((void()*) main::fsyscall#0) + jsr bi_fsyscall // [10] (byte) main::i#1 ← ++ (byte) main::i#3 -- vbuz1=_inc_vbuz1 inc.z i // [11] if((byte) main::i#1!=(byte) 2) goto main::@3 -- vbuz1_neq_vbuc1_then_la1 @@ -422,8 +412,8 @@ main: { b1_from_b3: // [5] phi (byte) main::i#3 = (byte) main::i#1 [phi:main::@3->main::@1#0] -- register_copy jmp b1 - bi_fn: - jmp (fn) + bi_fsyscall: + jmp (fsyscall) } // fn2 fn2: { @@ -454,35 +444,35 @@ fn1: { REGISTER UPLIFT POTENTIAL REGISTERS Statement [6] (byte~) main::$0 ← (byte) main::i#3 << (byte) 1 [ main::i#3 main::$0 ] ( main:2 [ main::i#3 main::$0 ] ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#3 main::i#1 ] -Statement [7] (byte~) main::$5 ← (byte~) main::$0 << (byte) 1 [ main::i#3 main::$5 ] ( main:2 [ main::i#3 main::$5 ] ) always clobbers reg byte a -Statement [8] (word) main::fn#0 ← *((const word*) CALLS#0 + (byte~) main::$5) [ main::i#3 main::fn#0 ] ( main:2 [ main::i#3 main::fn#0 ] ) always clobbers reg byte a -Statement [9] call *((void()*)(word) main::fn#0) [ main::i#3 ] ( main:2 [ main::i#3 ] ) always clobbers reg byte a reg byte x reg byte y +Statement [7] (byte~) main::$4 ← (byte~) main::$0 << (byte) 1 [ main::i#3 main::$4 ] ( main:2 [ main::i#3 main::$4 ] ) always clobbers reg byte a +Statement [8] (void()*) main::fsyscall#0 ← *((const void()**) FSYSCALLS#0 + (byte~) main::$4) [ main::i#3 main::fsyscall#0 ] ( main:2 [ main::i#3 main::fsyscall#0 ] ) always clobbers reg byte a +Statement [9] call *((void()*) main::fsyscall#0) [ main::i#3 ] ( main:2 [ main::i#3 ] ) always clobbers reg byte a reg byte x reg byte y Removing always clobbered register reg byte x as potential for zp ZP_BYTE:2 [ main::i#3 main::i#1 ] Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ main::i#3 main::i#1 ] Statement [11] if((byte) main::i#1!=(byte) 2) goto main::@3 [ main::i#1 ] ( main:2 [ main::i#1 ] ) always clobbers reg byte a Statement [6] (byte~) main::$0 ← (byte) main::i#3 << (byte) 1 [ main::i#3 main::$0 ] ( main:2 [ main::i#3 main::$0 ] ) always clobbers reg byte a -Statement [7] (byte~) main::$5 ← (byte~) main::$0 << (byte) 1 [ main::i#3 main::$5 ] ( main:2 [ main::i#3 main::$5 ] ) always clobbers reg byte a -Statement [8] (word) main::fn#0 ← *((const word*) CALLS#0 + (byte~) main::$5) [ main::i#3 main::fn#0 ] ( main:2 [ main::i#3 main::fn#0 ] ) always clobbers reg byte a -Statement [9] call *((void()*)(word) main::fn#0) [ main::i#3 ] ( main:2 [ main::i#3 ] ) always clobbers reg byte a reg byte x reg byte y +Statement [7] (byte~) main::$4 ← (byte~) main::$0 << (byte) 1 [ main::i#3 main::$4 ] ( main:2 [ main::i#3 main::$4 ] ) always clobbers reg byte a +Statement [8] (void()*) main::fsyscall#0 ← *((const void()**) FSYSCALLS#0 + (byte~) main::$4) [ main::i#3 main::fsyscall#0 ] ( main:2 [ main::i#3 main::fsyscall#0 ] ) always clobbers reg byte a +Statement [9] call *((void()*) main::fsyscall#0) [ main::i#3 ] ( main:2 [ main::i#3 ] ) always clobbers reg byte a reg byte x reg byte y Statement [11] if((byte) main::i#1!=(byte) 2) goto main::@3 [ main::i#1 ] ( main:2 [ main::i#1 ] ) always clobbers reg byte a Potential registers zp ZP_BYTE:2 [ main::i#3 main::i#1 ] : zp ZP_BYTE:2 , Potential registers zp ZP_BYTE:3 [ main::$0 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y , -Potential registers zp ZP_BYTE:4 [ main::$5 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y , -Potential registers zp ZP_WORD:5 [ main::fn#0 ] : zp ZP_WORD:5 , +Potential registers zp ZP_BYTE:4 [ main::$4 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_WORD:5 [ main::fsyscall#0 ] : zp ZP_WORD:5 , REGISTER UPLIFT SCOPES -Uplift Scope [main] 202: zp ZP_BYTE:3 [ main::$0 ] 202: zp ZP_BYTE:4 [ main::$5 ] 113.6: zp ZP_BYTE:2 [ main::i#3 main::i#1 ] 101: zp ZP_WORD:5 [ main::fn#0 ] +Uplift Scope [main] 202: zp ZP_BYTE:3 [ main::$0 ] 202: zp ZP_BYTE:4 [ main::$4 ] 113.6: zp ZP_BYTE:2 [ main::i#3 main::i#1 ] 101: zp ZP_WORD:5 [ main::fsyscall#0 ] Uplift Scope [fn1] Uplift Scope [fn2] Uplift Scope [] -Uplifting [main] best 6252 combination reg byte a [ main::$0 ] reg byte a [ main::$5 ] zp ZP_BYTE:2 [ main::i#3 main::i#1 ] zp ZP_WORD:5 [ main::fn#0 ] +Uplifting [main] best 6252 combination reg byte a [ main::$0 ] reg byte a [ main::$4 ] zp ZP_BYTE:2 [ main::i#3 main::i#1 ] zp ZP_WORD:5 [ main::fsyscall#0 ] Uplifting [fn1] best 6252 combination Uplifting [fn2] best 6252 combination Uplifting [] best 6252 combination Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::i#3 main::i#1 ] Uplifting [main] best 6252 combination zp ZP_BYTE:2 [ main::i#3 main::i#1 ] -Allocated (was zp ZP_WORD:5) zp ZP_WORD:3 [ main::fn#0 ] +Allocated (was zp ZP_WORD:5) zp ZP_WORD:3 [ main::fsyscall#0 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments @@ -500,7 +490,7 @@ ASSEMBLER BEFORE OPTIMIZATION // Global Constants & labels .const JMP = $4c .const NOP = $ea - .label CALLS = SYSCALLS+1 + .label FSYSCALLS = SYSCALLS+1 // @begin bbegin: // [1] phi from @begin to @1 [phi:@begin->@1] @@ -520,7 +510,7 @@ bend: .segment Code // main main: { - .label fn = 3 + .label fsyscall = 3 .label i = 2 // [5] phi from main main::@2 to main::@1 [phi:main/main::@2->main::@1] b1_from_main: @@ -529,7 +519,7 @@ main: { lda #0 sta.z i jmp b1 - // Call functions one at a time + // Call SYSCALL functions one at a time // main::@1 b1: jmp b2 @@ -538,16 +528,16 @@ main: { // [6] (byte~) main::$0 ← (byte) main::i#3 << (byte) 1 -- vbuaa=vbuz1_rol_1 lda.z i asl - // [7] (byte~) main::$5 ← (byte~) main::$0 << (byte) 1 -- vbuaa=vbuaa_rol_1 + // [7] (byte~) main::$4 ← (byte~) main::$0 << (byte) 1 -- vbuaa=vbuaa_rol_1 asl - // [8] (word) main::fn#0 ← *((const word*) CALLS#0 + (byte~) main::$5) -- vwuz1=pwuc1_derefidx_vbuaa + // [8] (void()*) main::fsyscall#0 ← *((const void()**) FSYSCALLS#0 + (byte~) main::$4) -- pprz1=pptc1_derefidx_vbuaa tay - lda CALLS,y - sta.z fn - lda CALLS+1,y - sta.z fn+1 - // [9] call *((void()*)(word) main::fn#0) - jsr bi_fn + lda FSYSCALLS,y + sta.z fsyscall + lda FSYSCALLS+1,y + sta.z fsyscall+1 + // [9] call *((void()*) main::fsyscall#0) + jsr bi_fsyscall // [10] (byte) main::i#1 ← ++ (byte) main::i#3 -- vbuz1=_inc_vbuz1 inc.z i // [11] if((byte) main::i#1!=(byte) 2) goto main::@3 -- vbuz1_neq_vbuc1_then_la1 @@ -564,8 +554,8 @@ main: { b1_from_b3: // [5] phi (byte) main::i#3 = (byte) main::i#1 [phi:main::@3->main::@1#0] -- register_copy jmp b1 - bi_fn: - jmp (fn) + bi_fsyscall: + jmp (fsyscall) } // fn2 fn2: { @@ -633,8 +623,8 @@ FINAL SYMBOL TABLE (label) @1 (label) @begin (label) @end -(word*) CALLS -(const word*) CALLS#0 CALLS = (word*)(const byte[]) SYSCALLS#0+(byte) 1 +(void()**) FSYSCALLS +(const void()**) FSYSCALLS#0 FSYSCALLS = (void()**)(const byte[]) SYSCALLS#0+(byte) 1 (byte) JMP (const byte) JMP#0 JMP = (byte) $4c (byte) NOP @@ -651,21 +641,20 @@ FINAL SYMBOL TABLE (const byte*) fn2::BGCOL#0 BGCOL = (byte*) 53281 (void()) main() (byte~) main::$0 reg byte a 202.0 -(byte~) main::$5 reg byte a 202.0 +(byte~) main::$4 reg byte a 202.0 (label) main::@1 (label) main::@2 (label) main::@3 -(void()*) main::f -(word) main::fn -(word) main::fn#0 fn zp ZP_WORD:3 101.0 +(void()*) main::fsyscall +(void()*) main::fsyscall#0 fsyscall zp ZP_WORD:3 101.0 (byte) main::i (byte) main::i#1 i zp ZP_BYTE:2 71.0 (byte) main::i#3 i zp ZP_BYTE:2 42.599999999999994 zp ZP_BYTE:2 [ main::i#3 main::i#1 ] reg byte a [ main::$0 ] -reg byte a [ main::$5 ] -zp ZP_WORD:3 [ main::fn#0 ] +reg byte a [ main::$4 ] +zp ZP_WORD:3 [ main::fsyscall#0 ] FINAL ASSEMBLER @@ -686,7 +675,7 @@ Score: 5574 // Global Constants & labels .const JMP = $4c .const NOP = $ea - .label CALLS = SYSCALLS+1 + .label FSYSCALLS = SYSCALLS+1 // @begin // [1] phi from @begin to @1 [phi:@begin->@1] // @1 @@ -697,14 +686,14 @@ Score: 5574 .segment Code // main main: { - .label fn = 3 + .label fsyscall = 3 .label i = 2 // [5] phi from main main::@2 to main::@1 [phi:main/main::@2->main::@1] b1: // [5] phi (byte) main::i#3 = (byte) 0 [phi:main/main::@2->main::@1#0] -- vbuz1=vbuc1 lda #0 sta.z i - // Call functions one at a time + // Call SYSCALL functions one at a time // main::@1 // main::@2 b2: @@ -712,18 +701,18 @@ main: { // [6] (byte~) main::$0 ← (byte) main::i#3 << (byte) 1 -- vbuaa=vbuz1_rol_1 lda.z i asl - // fn = CALLS[i*2] - // [7] (byte~) main::$5 ← (byte~) main::$0 << (byte) 1 -- vbuaa=vbuaa_rol_1 + // fsyscall = FSYSCALLS[i*2] + // [7] (byte~) main::$4 ← (byte~) main::$0 << (byte) 1 -- vbuaa=vbuaa_rol_1 asl - // [8] (word) main::fn#0 ← *((const word*) CALLS#0 + (byte~) main::$5) -- vwuz1=pwuc1_derefidx_vbuaa + // [8] (void()*) main::fsyscall#0 ← *((const void()**) FSYSCALLS#0 + (byte~) main::$4) -- pprz1=pptc1_derefidx_vbuaa tay - lda CALLS,y - sta.z fn - lda CALLS+1,y - sta.z fn+1 - // (*f)() - // [9] call *((void()*)(word) main::fn#0) - jsr bi_fn + lda FSYSCALLS,y + sta.z fsyscall + lda FSYSCALLS+1,y + sta.z fsyscall+1 + // (*fsyscall)() + // [9] call *((void()*) main::fsyscall#0) + jsr bi_fsyscall // if(++i==2) // [10] (byte) main::i#1 ← ++ (byte) main::i#3 -- vbuz1=_inc_vbuz1 inc.z i @@ -736,8 +725,8 @@ main: { // main::@3 // [5] phi from main::@3 to main::@1 [phi:main::@3->main::@1] // [5] phi (byte) main::i#3 = (byte) main::i#1 [phi:main::@3->main::@1#0] -- register_copy - bi_fn: - jmp (fn) + bi_fsyscall: + jmp (fsyscall) } // fn2 fn2: { diff --git a/src/test/ref/complex/xmega65/xmega65.sym b/src/test/ref/complex/xmega65/xmega65.sym index 3832f8159..57b124394 100644 --- a/src/test/ref/complex/xmega65/xmega65.sym +++ b/src/test/ref/complex/xmega65/xmega65.sym @@ -1,8 +1,8 @@ (label) @1 (label) @begin (label) @end -(word*) CALLS -(const word*) CALLS#0 CALLS = (word*)(const byte[]) SYSCALLS#0+(byte) 1 +(void()**) FSYSCALLS +(const void()**) FSYSCALLS#0 FSYSCALLS = (void()**)(const byte[]) SYSCALLS#0+(byte) 1 (byte) JMP (const byte) JMP#0 JMP = (byte) $4c (byte) NOP @@ -19,18 +19,17 @@ (const byte*) fn2::BGCOL#0 BGCOL = (byte*) 53281 (void()) main() (byte~) main::$0 reg byte a 202.0 -(byte~) main::$5 reg byte a 202.0 +(byte~) main::$4 reg byte a 202.0 (label) main::@1 (label) main::@2 (label) main::@3 -(void()*) main::f -(word) main::fn -(word) main::fn#0 fn zp ZP_WORD:3 101.0 +(void()*) main::fsyscall +(void()*) main::fsyscall#0 fsyscall zp ZP_WORD:3 101.0 (byte) main::i (byte) main::i#1 i zp ZP_BYTE:2 71.0 (byte) main::i#3 i zp ZP_BYTE:2 42.599999999999994 zp ZP_BYTE:2 [ main::i#3 main::i#1 ] reg byte a [ main::$0 ] -reg byte a [ main::$5 ] -zp ZP_WORD:3 [ main::fn#0 ] +reg byte a [ main::$4 ] +zp ZP_WORD:3 [ main::fsyscall#0 ]