mirror of
https://github.com/irmen/prog8.git
synced 2025-01-10 20:30:23 +00:00
added @nozp variable flag
This commit is contained in:
parent
fda8e61be4
commit
0dc50a93a4
@ -48,9 +48,9 @@ internal class VariableAllocator(private val symboltable: SymbolTable,
|
|||||||
val numberOfAllocatableVariables = allVariables.size
|
val numberOfAllocatableVariables = allVariables.size
|
||||||
val varsRequiringZp = allVariables.filter { it.zpwish == ZeropageWish.REQUIRE_ZEROPAGE }
|
val varsRequiringZp = allVariables.filter { it.zpwish == ZeropageWish.REQUIRE_ZEROPAGE }
|
||||||
val varsPreferringZp = allVariables.filter { it.zpwish == ZeropageWish.PREFER_ZEROPAGE }
|
val varsPreferringZp = allVariables.filter { it.zpwish == ZeropageWish.PREFER_ZEROPAGE }
|
||||||
|
val varsNotZp = allVariables.filter { it.zpwish == ZeropageWish.NOT_IN_ZEROPAGE }
|
||||||
val varsDontCare = allVariables.filter { it.zpwish == ZeropageWish.DONTCARE }
|
val varsDontCare = allVariables.filter { it.zpwish == ZeropageWish.DONTCARE }
|
||||||
val numberOfExplicitNonZpVariables = allVariables.count { it.zpwish == ZeropageWish.NOT_IN_ZEROPAGE }
|
require(varsDontCare.size + varsRequiringZp.size + varsPreferringZp.size + varsNotZp.size == numberOfAllocatableVariables)
|
||||||
require(varsDontCare.size + varsRequiringZp.size + varsPreferringZp.size + numberOfExplicitNonZpVariables == numberOfAllocatableVariables)
|
|
||||||
|
|
||||||
var numVariablesAllocatedInZP = 0
|
var numVariablesAllocatedInZP = 0
|
||||||
var numberOfNonIntegerVariables = 0
|
var numberOfNonIntegerVariables = 0
|
||||||
@ -86,7 +86,7 @@ internal class VariableAllocator(private val symboltable: SymbolTable,
|
|||||||
// no need to check for allocation error, if there is one, just allocate in normal system ram.
|
// no need to check for allocation error, if there is one, just allocate in normal system ram.
|
||||||
}
|
}
|
||||||
|
|
||||||
// try to allocate any other interger variables into the zeropage until it is full.
|
// try to allocate the "don't care" interger variables into the zeropage until it is full.
|
||||||
// TODO some form of intelligent priorization? most often used variables first? loopcounter vars first? ...?
|
// TODO some form of intelligent priorization? most often used variables first? loopcounter vars first? ...?
|
||||||
if(errors.noErrors()) {
|
if(errors.noErrors()) {
|
||||||
val sortedList = varsDontCare.sortedByDescending { it.scopedName }
|
val sortedList = varsDontCare.sortedByDescending { it.scopedName }
|
||||||
@ -110,9 +110,7 @@ internal class VariableAllocator(private val symboltable: SymbolTable,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// println(" number of allocated vars: $numberOfAllocatableVariables")
|
// note: no zeropage allocation is done at all for the @nozp variables. This means they will always end up outside the zeropage.
|
||||||
// println(" put into zeropage: $numVariablesAllocatedInZP, non-zp allocatable: ${numberOfNonIntegerVariables+numberOfExplicitNonZpVariables}")
|
|
||||||
// println(" zeropage free space: ${zeropage.free.size} bytes")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun collectAllVariables(st: SymbolTable): Collection<StStaticVariable> {
|
private fun collectAllVariables(st: SymbolTable): Collection<StStaticVariable> {
|
||||||
|
@ -674,6 +674,7 @@ private fun VardeclContext.toAst(type: VarDeclType, value: Expression?): VarDecl
|
|||||||
val zp = when {
|
val zp = when {
|
||||||
options.ZEROPAGEREQUIRE().isNotEmpty() -> ZeropageWish.REQUIRE_ZEROPAGE
|
options.ZEROPAGEREQUIRE().isNotEmpty() -> ZeropageWish.REQUIRE_ZEROPAGE
|
||||||
options.ZEROPAGE().isNotEmpty() -> ZeropageWish.PREFER_ZEROPAGE
|
options.ZEROPAGE().isNotEmpty() -> ZeropageWish.PREFER_ZEROPAGE
|
||||||
|
options.ZEROPAGENOT().isNotEmpty() -> ZeropageWish.NOT_IN_ZEROPAGE
|
||||||
else -> ZeropageWish.DONTCARE
|
else -> ZeropageWish.DONTCARE
|
||||||
}
|
}
|
||||||
val identifiers = identifier()
|
val identifiers = identifier()
|
||||||
|
@ -211,7 +211,7 @@ it will try to fill it with as much other variables as possible (before they wil
|
|||||||
Use ``@requirezp`` tag to *force* the variable into zeropage, but if there is no more free space the compilation will fail.
|
Use ``@requirezp`` tag to *force* the variable into zeropage, but if there is no more free space the compilation will fail.
|
||||||
It's possible to put strings, arrays and floats into zeropage too, however because Zp space is really scarce
|
It's possible to put strings, arrays and floats into zeropage too, however because Zp space is really scarce
|
||||||
this is not advised as they will eat up the available space very quickly. It's best to only put byte or word
|
this is not advised as they will eat up the available space very quickly. It's best to only put byte or word
|
||||||
variables in zeropage.
|
variables in zeropage. By the way, there is also ``@nozp`` to keep a variable *out of the zeropage* at all times.
|
||||||
|
|
||||||
Example::
|
Example::
|
||||||
|
|
||||||
|
@ -342,6 +342,7 @@ Tag Effect
|
|||||||
========== ======
|
========== ======
|
||||||
@zp prioritize the variable for putting it into Zero page. No guarantees; if ZP is full the variable will be placed in another memory location.
|
@zp prioritize the variable for putting it into Zero page. No guarantees; if ZP is full the variable will be placed in another memory location.
|
||||||
@requirezp force the variable into Zero page. If ZP is full, compilation will fail.
|
@requirezp force the variable into Zero page. If ZP is full, compilation will fail.
|
||||||
|
@nozp force the variable to normal system ram, never place it into zeropage.
|
||||||
@shared means the variable is shared with some assembly code and that it cannot be optimized away if not used elsewhere.
|
@shared means the variable is shared with some assembly code and that it cannot be optimized away if not used elsewhere.
|
||||||
@split (only valid on (u)word arrays) Makes the array to be placed in memory as 2 separate byte arrays; one with the LSBs one with the MSBs of the word values. May improve performance.
|
@split (only valid on (u)word arrays) Makes the array to be placed in memory as 2 separate byte arrays; one with the LSBs one with the MSBs of the word values. May improve performance.
|
||||||
========== ======
|
========== ======
|
||||||
@ -367,6 +368,7 @@ Various examples::
|
|||||||
word @zp zpword = 9999 ; prioritize this when selecting vars for zeropage storage
|
word @zp zpword = 9999 ; prioritize this when selecting vars for zeropage storage
|
||||||
uword @requirezp zpaddr = $3000 ; we require this variable in zeropage
|
uword @requirezp zpaddr = $3000 ; we require this variable in zeropage
|
||||||
word @shared asmvar ; variable is used in assembly code but not elsewhere
|
word @shared asmvar ; variable is used in assembly code but not elsewhere
|
||||||
|
byte @nozp memvar ; variable that is never in zeropage
|
||||||
|
|
||||||
|
|
||||||
Data types
|
Data types
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
|
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
bool @split bb
|
ubyte @requirezp b1
|
||||||
ubyte @split bt
|
ubyte @zp b2
|
||||||
byte[200] @split ba
|
ubyte b3
|
||||||
float @split fl
|
ubyte @nozp b4
|
||||||
float[10] @split fla
|
|
||||||
|
|
||||||
bb=true
|
b1++
|
||||||
bt++
|
b2++
|
||||||
fl++
|
b3++
|
||||||
|
b4++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,6 +57,8 @@ ZEROPAGE : '@zp' ;
|
|||||||
|
|
||||||
ZEROPAGEREQUIRE : '@requirezp' ;
|
ZEROPAGEREQUIRE : '@requirezp' ;
|
||||||
|
|
||||||
|
ZEROPAGENOT: '@nozp' ;
|
||||||
|
|
||||||
SHARED : '@shared' ;
|
SHARED : '@shared' ;
|
||||||
|
|
||||||
SPLIT: '@split' ;
|
SPLIT: '@split' ;
|
||||||
@ -139,7 +141,7 @@ directivearg : stringliteral | identifier | integerliteral ;
|
|||||||
|
|
||||||
vardecl: datatype (arrayindex | ARRAYSIG)? decloptions identifier (',' identifier)* ;
|
vardecl: datatype (arrayindex | ARRAYSIG)? decloptions identifier (',' identifier)* ;
|
||||||
|
|
||||||
decloptions: (SHARED | ZEROPAGE | ZEROPAGEREQUIRE | SPLIT)* ;
|
decloptions: (SHARED | ZEROPAGE | ZEROPAGEREQUIRE | ZEROPAGENOT | SPLIT)* ;
|
||||||
|
|
||||||
varinitializer : vardecl '=' expression ;
|
varinitializer : vardecl '=' expression ;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
</options>
|
</options>
|
||||||
<keywords keywords="&;->;@;and;as;asmsub;break;clobbers;continue;do;downto;else;false;for;goto;if;if_cc;if_cs;if_eq;if_mi;if_ne;if_neg;if_nz;if_pl;if_pos;if_vc;if_vs;if_z;in;inline;not;or;repeat;return;romsub;step;sub;to;true;unroll;until;when;while;xor;~" ignore_case="false" />
|
<keywords keywords="&;->;@;and;as;asmsub;break;clobbers;continue;do;downto;else;false;for;goto;if;if_cc;if_cs;if_eq;if_mi;if_ne;if_neg;if_nz;if_pl;if_pos;if_vc;if_vs;if_z;in;inline;not;or;repeat;return;romsub;step;sub;to;true;unroll;until;when;while;xor;~" ignore_case="false" />
|
||||||
<keywords2 keywords="%address;%asm;%asmbinary;%asminclude;%breakpoint;%encoding;%import;%ir;%launcher;%option;%output;%zeropage;%zpallowed;%zpreserved;atascii:;cp437:;default:;iso16:;iso5:;iso:;petscii:;sc:" />
|
<keywords2 keywords="%address;%asm;%asmbinary;%asminclude;%breakpoint;%encoding;%import;%ir;%launcher;%option;%output;%zeropage;%zpallowed;%zpreserved;atascii:;cp437:;default:;iso16:;iso5:;iso:;petscii:;sc:" />
|
||||||
<keywords3 keywords="@requirezp;@shared;@split;@zp;bool;byte;const;float;str;ubyte;uword;void;word" />
|
<keywords3 keywords="@nozp;@requirezp;@shared;@split;@zp;bool;byte;const;float;str;ubyte;uword;void;word" />
|
||||||
<keywords4 keywords="abs;all;any;call;callfar;clamp;cmp;divmod;len;lsb;max;memory;min;mkword;msb;peek;peekf;peekw;poke;pokef;pokew;reverse;rol;rol2;ror;ror2;rrestore;rrestorex;rsave;rsavex;setlsb;setmsb;sgn;sizeof;sort;sqrt;swap;|>" />
|
<keywords4 keywords="abs;all;any;call;callfar;clamp;cmp;divmod;len;lsb;max;memory;min;mkword;msb;peek;peekf;peekw;poke;pokef;pokew;reverse;rol;rol2;ror;ror2;rrestore;rrestorex;rsave;rsavex;setlsb;setmsb;sgn;sizeof;sort;sqrt;swap;|>" />
|
||||||
</highlighting>
|
</highlighting>
|
||||||
<extensionMap>
|
<extensionMap>
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<Keywords name="Folders in comment, open"></Keywords>
|
<Keywords name="Folders in comment, open"></Keywords>
|
||||||
<Keywords name="Folders in comment, middle"></Keywords>
|
<Keywords name="Folders in comment, middle"></Keywords>
|
||||||
<Keywords name="Folders in comment, close"></Keywords>
|
<Keywords name="Folders in comment, close"></Keywords>
|
||||||
<Keywords name="Keywords1">void const
str
byte ubyte bool
word uword
float
zp shared split requirezp</Keywords>
|
<Keywords name="Keywords1">void const
str
byte ubyte bool
word uword
float
zp shared split requirezp nozp</Keywords>
|
||||||
<Keywords name="Keywords2">%address
%asm
%ir
%asmbinary
%asminclude
%breakpoint
%encoding
%import
%launcher
%option
%output
%zeropage
%zpreserved
%zpallowed</Keywords>
|
<Keywords name="Keywords2">%address
%asm
%ir
%asmbinary
%asminclude
%breakpoint
%encoding
%import
%launcher
%option
%output
%zeropage
%zpreserved
%zpallowed</Keywords>
|
||||||
<Keywords name="Keywords3">inline sub asmsub romsub
clobbers
asm
if
when else
if_cc if_cs if_eq if_mi if_neg if_nz if_pl if_pos if_vc if_vs if_z
for in step do while repeat unroll
break continue return goto</Keywords>
|
<Keywords name="Keywords3">inline sub asmsub romsub
clobbers
asm
if
when else
if_cc if_cs if_eq if_mi if_neg if_nz if_pl if_pos if_vc if_vs if_z
for in step do while repeat unroll
break continue return goto</Keywords>
|
||||||
<Keywords name="Keywords4">abs all any call callfar clamp cmp divmod len lsb lsl lsr memory mkword min max msb peek peekw peekf poke pokew pokef rsave rsavex rrestore rrestorex reverse rnd rndw rol rol2 ror ror2 setlsb setmsb sgn sizeof sort sqrtw swap</Keywords>
|
<Keywords name="Keywords4">abs all any call callfar clamp cmp divmod len lsb lsl lsr memory mkword min max msb peek peekw peekf poke pokew pokef rsave rsavex rrestore rrestorex reverse rnd rndw rol rol2 ror ror2 setlsb setmsb sgn sizeof sort sqrtw swap</Keywords>
|
||||||
|
@ -43,7 +43,7 @@ syn region prog8ArrayType matchgroup=prog8Type
|
|||||||
\ start="\<\%(u\?byte\|u\?word\|float\|str\|bool\)\[" end="\]"
|
\ start="\<\%(u\?byte\|u\?word\|float\|str\|bool\)\[" end="\]"
|
||||||
\ transparent
|
\ transparent
|
||||||
syn keyword prog8StorageClass const
|
syn keyword prog8StorageClass const
|
||||||
syn match prog8StorageClass "\(^\|\s\)\(@zp\|@shared\|@split\|@requirezp\)\>"
|
syn match prog8StorageClass "\(^\|\s\)\(@zp\|@shared\|@split\|@nozp\|@requirezp\)\>"
|
||||||
|
|
||||||
syn region prog8Block start="{" end="}" transparent
|
syn region prog8Block start="{" end="}" transparent
|
||||||
syn region prog8Expression start="(" end=")" transparent
|
syn region prog8Expression start="(" end=")" transparent
|
||||||
|
Loading…
x
Reference in New Issue
Block a user