1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-13 03:39:12 +00:00

Added clobber handling to inline ASM. Added clobbers directive to specify what is clobbered. If inline ASM has a JSR and no clobbers directive all registers are assumed to be clobbered. Closes #5

This commit is contained in:
jespergravgaard 2019-03-18 20:54:08 +01:00
parent 5cf5d88228
commit f67a5bc897
39 changed files with 3808 additions and 2426 deletions

View File

@ -36,6 +36,10 @@ public class Compiler {
this.upliftCombinations = upliftCombinations;
}
public void setLog(CompileLog compileLog) {
program.setLog(compileLog);
}
public static void loadAndParseFile(String fileName, Program program, Path currentPath) {
try {
if(!fileName.endsWith(".kc")) {

View File

@ -48,6 +48,9 @@ public class AsmSegment {
/** The full name of the containing scope (procedure). */
private String scopeLabel;
/** If non-null this overwrites the clobber of the segment that is calculated by examining the ASM instruction lines. */
private AsmClobber clobberOverwrite;
public AsmSegment(int index, ScopeRef scope, Integer statementIdx, String source) {
this.lines = new ArrayList<>();
this.scopeLabel = scope.getFullName();
@ -64,6 +67,14 @@ public class AsmSegment {
lines.add(line);
}
public AsmClobber getClobberOverwrite() {
return clobberOverwrite;
}
public void setClobberOverwrite(AsmClobber clobberOverwrite) {
this.clobberOverwrite = clobberOverwrite;
}
/**
* Add a new line just after another line
* @param line The line to look for. If it is not found an Exception is thrown
@ -152,6 +163,9 @@ public class AsmSegment {
* @return The registers clobbered
*/
public AsmClobber getClobber() {
if(clobberOverwrite!=null) {
return clobberOverwrite;
}
AsmClobber clobber = new AsmClobber();
for(AsmLine line : lines) {
if(line instanceof AsmInstruction) {

View File

@ -190,7 +190,7 @@ public class ControlFlowGraphCopyVisitor extends ControlFlowGraphBaseVisitor<Obj
@Override
public Object visitAsm(StatementAsm orig) {
return new StatementAsm(orig.getAsmLines(), orig.getReferenced(), orig.getSource(), orig.getComments());
return new StatementAsm(orig.getAsmLines(), orig.getReferenced(), orig.getDeclaredClobber(), orig.getSource(), orig.getComments());
}
@Override

View File

@ -1,5 +1,6 @@
package dk.camelot64.kickc.model.statements;
import dk.camelot64.kickc.asm.AsmClobber;
import dk.camelot64.kickc.model.Comment;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.values.SymbolVariableRef;
@ -17,10 +18,14 @@ public class StatementAsm extends StatementBase {
/** All variables/constants referenced in the inline assembler. */
private Map<String, SymbolVariableRef> referenced;
public StatementAsm(KickCParser.AsmLinesContext asmLines, Map<String, SymbolVariableRef> referenced, StatementSource source, List<Comment> comments) {
/** Declared clobber for the inline ASM. */
private AsmClobber declaredClobber;
public StatementAsm(KickCParser.AsmLinesContext asmLines, Map<String, SymbolVariableRef> referenced, AsmClobber declaredClobber, StatementSource source, List<Comment> comments) {
super(null, source, comments);
this.asmLines = asmLines;
this.referenced = referenced;
this.declaredClobber = declaredClobber;
}
@Override
@ -45,4 +50,12 @@ public class StatementAsm extends StatementBase {
public Map<String, SymbolVariableRef> getReferenced() {
return referenced;
}
public AsmClobber getDeclaredClobber() {
return declaredClobber;
}
public void setDeclaredClobber(AsmClobber declaredClobber) {
this.declaredClobber = declaredClobber;
}
}

View File

@ -16,8 +16,10 @@ public class StatementKickAsm extends StatementBase {
/** The absolute address to generate the kick-assembler code at. If null it is generated inline. */
private RValue location;
/** The number of bytes generated by the kick-assembler code. */
private RValue bytes;
/** The number of cycles used by the generated kick-assembler code. */
private RValue cycles;

View File

@ -46,7 +46,7 @@ kasmDirectives
kasmDirective
: 'resource' STRING #kasmDirectiveResource
| 'uses' NAME #kasmDirectiveUses
| 'clobber' NAME #kasmDirectiveClobber
| 'clobbers' STRING #kasmDirectiveClobber
| 'param' NAME ':' expr #kasmDirectiveTransfer
| 'bytes' expr #kasmDirectiveBytes
| 'cycles' expr #kasmDirectiveCycles
@ -82,7 +82,7 @@ stmt
| directive* 'do' stmt 'while' '(' expr ')' ';' #stmtDoWhile
| directive* 'for' '(' forDeclaration? forIteration ')' stmt #stmtFor
| 'return' expr? ';' #stmtReturn
| 'asm' '{' asmLines '}' #stmtAsm
| 'asm' asmDirectives? '{' asmLines '}' #stmtAsm
| declKasm #stmtDeclKasm
;
@ -137,6 +137,14 @@ parameterList
: expr (',' expr)*
;
asmDirectives
: '(' asmDirective ( ',' asmDirective )* ')'
;
asmDirective
: 'clobbers' STRING #asmDirectiveClobber
;
asmLines
: asmLine*
;

View File

@ -99,7 +99,7 @@ COMMENT_BLOCK=90
','=9
'resource'=10
'uses'=11
'clobber'=12
'clobbers'=12
'param'=13
':'=14
'bytes'=15

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7
// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7
package dk.camelot64.kickc.parser;
import org.antlr.v4.runtime.ParserRuleContext;
@ -779,6 +779,30 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitParameterList(KickCParser.ParameterListContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterAsmDirectives(KickCParser.AsmDirectivesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitAsmDirectives(KickCParser.AsmDirectivesContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterAsmDirectiveClobber(KickCParser.AsmDirectiveClobberContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitAsmDirectiveClobber(KickCParser.AsmDirectiveClobberContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7
// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7
package dk.camelot64.kickc.parser;
import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
@ -459,6 +459,20 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitParameterList(KickCParser.ParameterListContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitAsmDirectives(KickCParser.AsmDirectivesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitAsmDirectiveClobber(KickCParser.AsmDirectiveClobberContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7
// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7
package dk.camelot64.kickc.parser;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
@ -56,7 +56,7 @@ public class KickCLexer extends Lexer {
private static final String[] _LITERAL_NAMES = {
null, "'import'", "'='", "';'", "'('", "')'", "'{'", "'}'", "'kickasm'",
"','", "'resource'", "'uses'", "'clobber'", "'param'", "':'", "'bytes'",
"','", "'resource'", "'uses'", "'clobbers'", "'param'", "':'", "'bytes'",
"'cycles'", "'pc'", "'inline'", "'const'", "'extern'", "'align'", "'register'",
"'volatile'", "'interrupt'", "'if'", "'else'", "'while'", "'do'", "'for'",
"'return'", "'asm'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'",
@ -134,7 +134,7 @@ public class KickCLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\\\u038e\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\\\u038f\b\1\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -148,44 +148,44 @@ public class KickCLexer extends Lexer {
"`\t`\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3"+
"\7\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\13"+
"\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r"+
"\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20\3"+
"\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\23\3\23\3"+
"\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3"+
"\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3"+
"\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\33\3"+
"\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3"+
"\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!"+
"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3\'\3"+
"(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3-\3.\3.\3.\3/\3/\3\60\3\60\3\61\3"+
"\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3"+
"\66\3\67\3\67\38\38\39\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3=\3>\3"+
">\3>\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3D\3D\3E\3"+
"E\3E\3E\3E\3E\3F\3F\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3"+
"H\5H\u02af\nH\3I\3I\3I\3I\7I\u02b5\nI\fI\16I\u02b8\13I\3I\3I\3I\3J\3J"+
"\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u02d2\nJ"+
"\3K\3K\3K\3K\7K\u02d8\nK\fK\16K\u02db\13K\3K\3K\3L\3L\3L\3L\5L\u02e3\n"+
"L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\5M\u02f0\nM\3N\3N\5N\u02f4\nN\3O\3"+
"O\3O\5O\u02f9\nO\3P\3P\3P\3P\3P\5P\u0300\nP\3P\7P\u0303\nP\fP\16P\u0306"+
"\13P\3P\3P\6P\u030a\nP\rP\16P\u030b\3Q\7Q\u030f\nQ\fQ\16Q\u0312\13Q\3"+
"Q\3Q\6Q\u0316\nQ\rQ\16Q\u0317\3R\3R\3R\3R\3R\5R\u031f\nR\3R\7R\u0322\n"+
"R\fR\16R\u0325\13R\3R\3R\6R\u0329\nR\rR\16R\u032a\3S\3S\3S\5S\u0330\n"+
"S\3T\3T\3T\6T\u0335\nT\rT\16T\u0336\3T\3T\6T\u033b\nT\rT\16T\u033c\5T"+
"\u033f\nT\3U\6U\u0342\nU\rU\16U\u0343\3V\3V\3V\3V\3V\5V\u034b\nV\3V\6"+
"V\u034e\nV\rV\16V\u034f\3W\3W\3X\3X\3Y\3Y\3Z\3Z\7Z\u035a\nZ\fZ\16Z\u035d"+
"\13Z\3[\3[\3\\\3\\\3]\3]\7]\u0365\n]\f]\16]\u0368\13]\3]\6]\u036b\n]\r"+
"]\16]\u036c\3^\6^\u0370\n^\r^\16^\u0371\3^\3^\3_\3_\3_\3_\7_\u037a\n_"+
"\f_\16_\u037d\13_\3_\3_\3`\3`\3`\3`\7`\u0385\n`\f`\16`\u0388\13`\3`\3"+
"`\3`\3`\3`\4\u02b6\u0386\2a\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25"+
"\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3"+
"\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\23\3"+
"\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3"+
"\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3"+
"\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3"+
"\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3"+
"\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3"+
"\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3"+
"!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3"+
"\'\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3-\3.\3.\3.\3/\3/\3\60\3\60\3\61"+
"\3\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66"+
"\3\66\3\67\3\67\38\38\39\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3=\3>"+
"\3>\3>\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3A\3B\3B\3B\3C\3C\3C\3D\3D\3D\3E"+
"\3E\3E\3E\3E\3E\3F\3F\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H\3H"+
"\3H\5H\u02b0\nH\3I\3I\3I\3I\7I\u02b6\nI\fI\16I\u02b9\13I\3I\3I\3I\3J\3"+
"J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\3J\5J\u02d3\n"+
"J\3K\3K\3K\3K\7K\u02d9\nK\fK\16K\u02dc\13K\3K\3K\3L\3L\3L\3L\5L\u02e4"+
"\nL\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\5M\u02f1\nM\3N\3N\5N\u02f5\nN\3O"+
"\3O\3O\5O\u02fa\nO\3P\3P\3P\3P\3P\5P\u0301\nP\3P\7P\u0304\nP\fP\16P\u0307"+
"\13P\3P\3P\6P\u030b\nP\rP\16P\u030c\3Q\7Q\u0310\nQ\fQ\16Q\u0313\13Q\3"+
"Q\3Q\6Q\u0317\nQ\rQ\16Q\u0318\3R\3R\3R\3R\3R\5R\u0320\nR\3R\7R\u0323\n"+
"R\fR\16R\u0326\13R\3R\3R\6R\u032a\nR\rR\16R\u032b\3S\3S\3S\5S\u0331\n"+
"S\3T\3T\3T\6T\u0336\nT\rT\16T\u0337\3T\3T\6T\u033c\nT\rT\16T\u033d\5T"+
"\u0340\nT\3U\6U\u0343\nU\rU\16U\u0344\3V\3V\3V\3V\3V\5V\u034c\nV\3V\6"+
"V\u034f\nV\rV\16V\u0350\3W\3W\3X\3X\3Y\3Y\3Z\3Z\7Z\u035b\nZ\fZ\16Z\u035e"+
"\13Z\3[\3[\3\\\3\\\3]\3]\7]\u0366\n]\f]\16]\u0369\13]\3]\6]\u036c\n]\r"+
"]\16]\u036d\3^\6^\u0371\n^\r^\16^\u0372\3^\3^\3_\3_\3_\3_\7_\u037b\n_"+
"\f_\16_\u037e\13_\3_\3_\3`\3`\3`\3`\7`\u0386\n`\f`\16`\u0389\13`\3`\3"+
"`\3`\3`\3`\4\u02b7\u0387\2a\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25"+
"\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32"+
"\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a"+
"\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087"+
@ -193,7 +193,7 @@ public class KickCLexer extends Lexer {
"O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00ad\2\u00af"+
"\2\u00b1\2\u00b3X\u00b5\2\u00b7\2\u00b9Y\u00bbZ\u00bd[\u00bf\\\3\2\r\3"+
"\2$$\3\2))\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\"+
"aac|\4\2--//\6\2\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u03f6\2\3"+
"aac|\4\2--//\6\2\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u03f7\2\3"+
"\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2"+
"\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31"+
"\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2"+
@ -213,27 +213,27 @@ public class KickCLexer extends Lexer {
"\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\3\u00c1\3\2\2\2\5\u00c8\3\2\2\2\7\u00ca"+
"\3\2\2\2\t\u00cc\3\2\2\2\13\u00ce\3\2\2\2\r\u00d0\3\2\2\2\17\u00d2\3\2"+
"\2\2\21\u00d4\3\2\2\2\23\u00dc\3\2\2\2\25\u00de\3\2\2\2\27\u00e7\3\2\2"+
"\2\31\u00ec\3\2\2\2\33\u00f4\3\2\2\2\35\u00fa\3\2\2\2\37\u00fc\3\2\2\2"+
"!\u0102\3\2\2\2#\u0109\3\2\2\2%\u010c\3\2\2\2\'\u0113\3\2\2\2)\u0119\3"+
"\2\2\2+\u0120\3\2\2\2-\u0126\3\2\2\2/\u012f\3\2\2\2\61\u0138\3\2\2\2\63"+
"\u0142\3\2\2\2\65\u0145\3\2\2\2\67\u014a\3\2\2\29\u0150\3\2\2\2;\u0153"+
"\3\2\2\2=\u0157\3\2\2\2?\u015e\3\2\2\2A\u0162\3\2\2\2C\u0165\3\2\2\2E"+
"\u016c\3\2\2\2G\u016e\3\2\2\2I\u0170\3\2\2\2K\u0172\3\2\2\2M\u0175\3\2"+
"\2\2O\u0178\3\2\2\2Q\u017a\3\2\2\2S\u017c\3\2\2\2U\u017e\3\2\2\2W\u0180"+
"\3\2\2\2Y\u0182\3\2\2\2[\u0185\3\2\2\2]\u0188\3\2\2\2_\u018a\3\2\2\2a"+
"\u018c\3\2\2\2c\u018e\3\2\2\2e\u0190\3\2\2\2g\u0193\3\2\2\2i\u0196\3\2"+
"\2\2k\u0199\3\2\2\2m\u019c\3\2\2\2o\u019e\3\2\2\2q\u01a0\3\2\2\2s\u01a3"+
"\3\2\2\2u\u01a6\3\2\2\2w\u01a9\3\2\2\2y\u01ac\3\2\2\2{\u01af\3\2\2\2}"+
"\u01b2\3\2\2\2\177\u01b5\3\2\2\2\u0081\u01b9\3\2\2\2\u0083\u01bd\3\2\2"+
"\2\u0085\u01c0\3\2\2\2\u0087\u01c3\3\2\2\2\u0089\u01c6\3\2\2\2\u008b\u01cc"+
"\3\2\2\2\u008d\u01ce\3\2\2\2\u008f\u02ae\3\2\2\2\u0091\u02b0\3\2\2\2\u0093"+
"\u02d1\3\2\2\2\u0095\u02d3\3\2\2\2\u0097\u02de\3\2\2\2\u0099\u02ef\3\2"+
"\2\2\u009b\u02f3\3\2\2\2\u009d\u02f8\3\2\2\2\u009f\u02ff\3\2\2\2\u00a1"+
"\u0310\3\2\2\2\u00a3\u031e\3\2\2\2\u00a5\u032f\3\2\2\2\u00a7\u033e\3\2"+
"\2\2\u00a9\u0341\3\2\2\2\u00ab\u034a\3\2\2\2\u00ad\u0351\3\2\2\2\u00af"+
"\u0353\3\2\2\2\u00b1\u0355\3\2\2\2\u00b3\u0357\3\2\2\2\u00b5\u035e\3\2"+
"\2\2\u00b7\u0360\3\2\2\2\u00b9\u0362\3\2\2\2\u00bb\u036f\3\2\2\2\u00bd"+
"\u0375\3\2\2\2\u00bf\u0380\3\2\2\2\u00c1\u00c2\7k\2\2\u00c2\u00c3\7o\2"+
"\2\31\u00ec\3\2\2\2\33\u00f5\3\2\2\2\35\u00fb\3\2\2\2\37\u00fd\3\2\2\2"+
"!\u0103\3\2\2\2#\u010a\3\2\2\2%\u010d\3\2\2\2\'\u0114\3\2\2\2)\u011a\3"+
"\2\2\2+\u0121\3\2\2\2-\u0127\3\2\2\2/\u0130\3\2\2\2\61\u0139\3\2\2\2\63"+
"\u0143\3\2\2\2\65\u0146\3\2\2\2\67\u014b\3\2\2\29\u0151\3\2\2\2;\u0154"+
"\3\2\2\2=\u0158\3\2\2\2?\u015f\3\2\2\2A\u0163\3\2\2\2C\u0166\3\2\2\2E"+
"\u016d\3\2\2\2G\u016f\3\2\2\2I\u0171\3\2\2\2K\u0173\3\2\2\2M\u0176\3\2"+
"\2\2O\u0179\3\2\2\2Q\u017b\3\2\2\2S\u017d\3\2\2\2U\u017f\3\2\2\2W\u0181"+
"\3\2\2\2Y\u0183\3\2\2\2[\u0186\3\2\2\2]\u0189\3\2\2\2_\u018b\3\2\2\2a"+
"\u018d\3\2\2\2c\u018f\3\2\2\2e\u0191\3\2\2\2g\u0194\3\2\2\2i\u0197\3\2"+
"\2\2k\u019a\3\2\2\2m\u019d\3\2\2\2o\u019f\3\2\2\2q\u01a1\3\2\2\2s\u01a4"+
"\3\2\2\2u\u01a7\3\2\2\2w\u01aa\3\2\2\2y\u01ad\3\2\2\2{\u01b0\3\2\2\2}"+
"\u01b3\3\2\2\2\177\u01b6\3\2\2\2\u0081\u01ba\3\2\2\2\u0083\u01be\3\2\2"+
"\2\u0085\u01c1\3\2\2\2\u0087\u01c4\3\2\2\2\u0089\u01c7\3\2\2\2\u008b\u01cd"+
"\3\2\2\2\u008d\u01cf\3\2\2\2\u008f\u02af\3\2\2\2\u0091\u02b1\3\2\2\2\u0093"+
"\u02d2\3\2\2\2\u0095\u02d4\3\2\2\2\u0097\u02df\3\2\2\2\u0099\u02f0\3\2"+
"\2\2\u009b\u02f4\3\2\2\2\u009d\u02f9\3\2\2\2\u009f\u0300\3\2\2\2\u00a1"+
"\u0311\3\2\2\2\u00a3\u031f\3\2\2\2\u00a5\u0330\3\2\2\2\u00a7\u033f\3\2"+
"\2\2\u00a9\u0342\3\2\2\2\u00ab\u034b\3\2\2\2\u00ad\u0352\3\2\2\2\u00af"+
"\u0354\3\2\2\2\u00b1\u0356\3\2\2\2\u00b3\u0358\3\2\2\2\u00b5\u035f\3\2"+
"\2\2\u00b7\u0361\3\2\2\2\u00b9\u0363\3\2\2\2\u00bb\u0370\3\2\2\2\u00bd"+
"\u0376\3\2\2\2\u00bf\u0381\3\2\2\2\u00c1\u00c2\7k\2\2\u00c2\u00c3\7o\2"+
"\2\u00c3\u00c4\7r\2\2\u00c4\u00c5\7q\2\2\u00c5\u00c6\7t\2\2\u00c6\u00c7"+
"\7v\2\2\u00c7\4\3\2\2\2\u00c8\u00c9\7?\2\2\u00c9\6\3\2\2\2\u00ca\u00cb"+
"\7=\2\2\u00cb\b\3\2\2\2\u00cc\u00cd\7*\2\2\u00cd\n\3\2\2\2\u00ce\u00cf"+
@ -246,222 +246,222 @@ public class KickCLexer extends Lexer {
"\u00e6\7g\2\2\u00e6\26\3\2\2\2\u00e7\u00e8\7w\2\2\u00e8\u00e9\7u\2\2\u00e9"+
"\u00ea\7g\2\2\u00ea\u00eb\7u\2\2\u00eb\30\3\2\2\2\u00ec\u00ed\7e\2\2\u00ed"+
"\u00ee\7n\2\2\u00ee\u00ef\7q\2\2\u00ef\u00f0\7d\2\2\u00f0\u00f1\7d\2\2"+
"\u00f1\u00f2\7g\2\2\u00f2\u00f3\7t\2\2\u00f3\32\3\2\2\2\u00f4\u00f5\7"+
"r\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7\7t\2\2\u00f7\u00f8\7c\2\2\u00f8\u00f9"+
"\7o\2\2\u00f9\34\3\2\2\2\u00fa\u00fb\7<\2\2\u00fb\36\3\2\2\2\u00fc\u00fd"+
"\7d\2\2\u00fd\u00fe\7{\2\2\u00fe\u00ff\7v\2\2\u00ff\u0100\7g\2\2\u0100"+
"\u0101\7u\2\2\u0101 \3\2\2\2\u0102\u0103\7e\2\2\u0103\u0104\7{\2\2\u0104"+
"\u0105\7e\2\2\u0105\u0106\7n\2\2\u0106\u0107\7g\2\2\u0107\u0108\7u\2\2"+
"\u0108\"\3\2\2\2\u0109\u010a\7r\2\2\u010a\u010b\7e\2\2\u010b$\3\2\2\2"+
"\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f\7n\2\2\u010f\u0110"+
"\7k\2\2\u0110\u0111\7p\2\2\u0111\u0112\7g\2\2\u0112&\3\2\2\2\u0113\u0114"+
"\7e\2\2\u0114\u0115\7q\2\2\u0115\u0116\7p\2\2\u0116\u0117\7u\2\2\u0117"+
"\u0118\7v\2\2\u0118(\3\2\2\2\u0119\u011a\7g\2\2\u011a\u011b\7z\2\2\u011b"+
"\u011c\7v\2\2\u011c\u011d\7g\2\2\u011d\u011e\7t\2\2\u011e\u011f\7p\2\2"+
"\u011f*\3\2\2\2\u0120\u0121\7c\2\2\u0121\u0122\7n\2\2\u0122\u0123\7k\2"+
"\2\u0123\u0124\7i\2\2\u0124\u0125\7p\2\2\u0125,\3\2\2\2\u0126\u0127\7"+
"t\2\2\u0127\u0128\7g\2\2\u0128\u0129\7i\2\2\u0129\u012a\7k\2\2\u012a\u012b"+
"\7u\2\2\u012b\u012c\7v\2\2\u012c\u012d\7g\2\2\u012d\u012e\7t\2\2\u012e"+
".\3\2\2\2\u012f\u0130\7x\2\2\u0130\u0131\7q\2\2\u0131\u0132\7n\2\2\u0132"+
"\u0133\7c\2\2\u0133\u0134\7v\2\2\u0134\u0135\7k\2\2\u0135\u0136\7n\2\2"+
"\u0136\u0137\7g\2\2\u0137\60\3\2\2\2\u0138\u0139\7k\2\2\u0139\u013a\7"+
"p\2\2\u013a\u013b\7v\2\2\u013b\u013c\7g\2\2\u013c\u013d\7t\2\2\u013d\u013e"+
"\7t\2\2\u013e\u013f\7w\2\2\u013f\u0140\7r\2\2\u0140\u0141\7v\2\2\u0141"+
"\62\3\2\2\2\u0142\u0143\7k\2\2\u0143\u0144\7h\2\2\u0144\64\3\2\2\2\u0145"+
"\u0146\7g\2\2\u0146\u0147\7n\2\2\u0147\u0148\7u\2\2\u0148\u0149\7g\2\2"+
"\u0149\66\3\2\2\2\u014a\u014b\7y\2\2\u014b\u014c\7j\2\2\u014c\u014d\7"+
"k\2\2\u014d\u014e\7n\2\2\u014e\u014f\7g\2\2\u014f8\3\2\2\2\u0150\u0151"+
"\7f\2\2\u0151\u0152\7q\2\2\u0152:\3\2\2\2\u0153\u0154\7h\2\2\u0154\u0155"+
"\7q\2\2\u0155\u0156\7t\2\2\u0156<\3\2\2\2\u0157\u0158\7t\2\2\u0158\u0159"+
"\7g\2\2\u0159\u015a\7v\2\2\u015a\u015b\7w\2\2\u015b\u015c\7t\2\2\u015c"+
"\u015d\7p\2\2\u015d>\3\2\2\2\u015e\u015f\7c\2\2\u015f\u0160\7u\2\2\u0160"+
"\u0161\7o\2\2\u0161@\3\2\2\2\u0162\u0163\7\60\2\2\u0163\u0164\7\60\2\2"+
"\u0164B\3\2\2\2\u0165\u0166\7u\2\2\u0166\u0167\7k\2\2\u0167\u0168\7i\2"+
"\2\u0168\u0169\7p\2\2\u0169\u016a\7g\2\2\u016a\u016b\7f\2\2\u016bD\3\2"+
"\2\2\u016c\u016d\7,\2\2\u016dF\3\2\2\2\u016e\u016f\7]\2\2\u016fH\3\2\2"+
"\2\u0170\u0171\7_\2\2\u0171J\3\2\2\2\u0172\u0173\7/\2\2\u0173\u0174\7"+
"/\2\2\u0174L\3\2\2\2\u0175\u0176\7-\2\2\u0176\u0177\7-\2\2\u0177N\3\2"+
"\2\2\u0178\u0179\7-\2\2\u0179P\3\2\2\2\u017a\u017b\7/\2\2\u017bR\3\2\2"+
"\2\u017c\u017d\7#\2\2\u017dT\3\2\2\2\u017e\u017f\7(\2\2\u017fV\3\2\2\2"+
"\u0180\u0181\7\u0080\2\2\u0181X\3\2\2\2\u0182\u0183\7@\2\2\u0183\u0184"+
"\7@\2\2\u0184Z\3\2\2\2\u0185\u0186\7>\2\2\u0186\u0187\7>\2\2\u0187\\\3"+
"\2\2\2\u0188\u0189\7\61\2\2\u0189^\3\2\2\2\u018a\u018b\7\'\2\2\u018b`"+
"\3\2\2\2\u018c\u018d\7>\2\2\u018db\3\2\2\2\u018e\u018f\7@\2\2\u018fd\3"+
"\2\2\2\u0190\u0191\7?\2\2\u0191\u0192\7?\2\2\u0192f\3\2\2\2\u0193\u0194"+
"\7#\2\2\u0194\u0195\7?\2\2\u0195h\3\2\2\2\u0196\u0197\7>\2\2\u0197\u0198"+
"\7?\2\2\u0198j\3\2\2\2\u0199\u019a\7@\2\2\u019a\u019b\7?\2\2\u019bl\3"+
"\2\2\2\u019c\u019d\7`\2\2\u019dn\3\2\2\2\u019e\u019f\7~\2\2\u019fp\3\2"+
"\2\2\u01a0\u01a1\7(\2\2\u01a1\u01a2\7(\2\2\u01a2r\3\2\2\2\u01a3\u01a4"+
"\7~\2\2\u01a4\u01a5\7~\2\2\u01a5t\3\2\2\2\u01a6\u01a7\7-\2\2\u01a7\u01a8"+
"\7?\2\2\u01a8v\3\2\2\2\u01a9\u01aa\7/\2\2\u01aa\u01ab\7?\2\2\u01abx\3"+
"\2\2\2\u01ac\u01ad\7,\2\2\u01ad\u01ae\7?\2\2\u01aez\3\2\2\2\u01af\u01b0"+
"\7\61\2\2\u01b0\u01b1\7?\2\2\u01b1|\3\2\2\2\u01b2\u01b3\7\'\2\2\u01b3"+
"\u01b4\7?\2\2\u01b4~\3\2\2\2\u01b5\u01b6\7>\2\2\u01b6\u01b7\7>\2\2\u01b7"+
"\u01b8\7?\2\2\u01b8\u0080\3\2\2\2\u01b9\u01ba\7@\2\2\u01ba\u01bb\7@\2"+
"\2\u01bb\u01bc\7?\2\2\u01bc\u0082\3\2\2\2\u01bd\u01be\7(\2\2\u01be\u01bf"+
"\7?\2\2\u01bf\u0084\3\2\2\2\u01c0\u01c1\7~\2\2\u01c1\u01c2\7?\2\2\u01c2"+
"\u0086\3\2\2\2\u01c3\u01c4\7`\2\2\u01c4\u01c5\7?\2\2\u01c5\u0088\3\2\2"+
"\2\u01c6\u01c7\7\60\2\2\u01c7\u01c8\7d\2\2\u01c8\u01c9\7{\2\2\u01c9\u01ca"+
"\7v\2\2\u01ca\u01cb\7g\2\2\u01cb\u008a\3\2\2\2\u01cc\u01cd\7%\2\2\u01cd"+
"\u008c\3\2\2\2\u01ce\u01cf\7\60\2\2\u01cf\u008e\3\2\2\2\u01d0\u01d1\7"+
"d\2\2\u01d1\u01d2\7t\2\2\u01d2\u02af\7m\2\2\u01d3\u01d4\7q\2\2\u01d4\u01d5"+
"\7t\2\2\u01d5\u02af\7c\2\2\u01d6\u01d7\7m\2\2\u01d7\u01d8\7k\2\2\u01d8"+
"\u02af\7n\2\2\u01d9\u01da\7u\2\2\u01da\u01db\7n\2\2\u01db\u02af\7q\2\2"+
"\u01dc\u01dd\7p\2\2\u01dd\u01de\7q\2\2\u01de\u02af\7r\2\2\u01df\u01e0"+
"\7c\2\2\u01e0\u01e1\7u\2\2\u01e1\u02af\7n\2\2\u01e2\u01e3\7r\2\2\u01e3"+
"\u01e4\7j\2\2\u01e4\u02af\7r\2\2\u01e5\u01e6\7c\2\2\u01e6\u01e7\7p\2\2"+
"\u01e7\u02af\7e\2\2\u01e8\u01e9\7d\2\2\u01e9\u01ea\7r\2\2\u01ea\u02af"+
"\7n\2\2\u01eb\u01ec\7e\2\2\u01ec\u01ed\7n\2\2\u01ed\u02af\7e\2\2\u01ee"+
"\u01ef\7l\2\2\u01ef\u01f0\7u\2\2\u01f0\u02af\7t\2\2\u01f1\u01f2\7c\2\2"+
"\u01f2\u01f3\7p\2\2\u01f3\u02af\7f\2\2\u01f4\u01f5\7t\2\2\u01f5\u01f6"+
"\7n\2\2\u01f6\u02af\7c\2\2\u01f7\u01f8\7d\2\2\u01f8\u01f9\7k\2\2\u01f9"+
"\u02af\7v\2\2\u01fa\u01fb\7t\2\2\u01fb\u01fc\7q\2\2\u01fc\u02af\7n\2\2"+
"\u01fd\u01fe\7r\2\2\u01fe\u01ff\7n\2\2\u01ff\u02af\7c\2\2\u0200\u0201"+
"\7r\2\2\u0201\u0202\7n\2\2\u0202\u02af\7r\2\2\u0203\u0204\7d\2\2\u0204"+
"\u0205\7o\2\2\u0205\u02af\7k\2\2\u0206\u0207\7u\2\2\u0207\u0208\7g\2\2"+
"\u0208\u02af\7e\2\2\u0209\u020a\7t\2\2\u020a\u020b\7v\2\2\u020b\u02af"+
"\7k\2\2\u020c\u020d\7g\2\2\u020d\u020e\7q\2\2\u020e\u02af\7t\2\2\u020f"+
"\u0210\7u\2\2\u0210\u0211\7t\2\2\u0211\u02af\7g\2\2\u0212\u0213\7n\2\2"+
"\u0213\u0214\7u\2\2\u0214\u02af\7t\2\2\u0215\u0216\7r\2\2\u0216\u0217"+
"\7j\2\2\u0217\u02af\7c\2\2\u0218\u0219\7c\2\2\u0219\u021a\7n\2\2\u021a"+
"\u02af\7t\2\2\u021b\u021c\7l\2\2\u021c\u021d\7o\2\2\u021d\u02af\7r\2\2"+
"\u021e\u021f\7d\2\2\u021f\u0220\7x\2\2\u0220\u02af\7e\2\2\u0221\u0222"+
"\7e\2\2\u0222\u0223\7n\2\2\u0223\u02af\7k\2\2\u0224\u0225\7t\2\2\u0225"+
"\u0226\7v\2\2\u0226\u02af\7u\2\2\u0227\u0228\7c\2\2\u0228\u0229\7f\2\2"+
"\u0229\u02af\7e\2\2\u022a\u022b\7t\2\2\u022b\u022c\7t\2\2\u022c\u02af"+
"\7c\2\2\u022d\u022e\7d\2\2\u022e\u022f\7x\2\2\u022f\u02af\7u\2\2\u0230"+
"\u0231\7u\2\2\u0231\u0232\7g\2\2\u0232\u02af\7k\2\2\u0233\u0234\7u\2\2"+
"\u0234\u0235\7c\2\2\u0235\u02af\7z\2\2\u0236\u0237\7u\2\2\u0237\u0238"+
"\7v\2\2\u0238\u02af\7{\2\2\u0239\u023a\7u\2\2\u023a\u023b\7v\2\2\u023b"+
"\u02af\7c\2\2\u023c\u023d\7u\2\2\u023d\u023e\7v\2\2\u023e\u02af\7z\2\2"+
"\u023f\u0240\7f\2\2\u0240\u0241\7g\2\2\u0241\u02af\7{\2\2\u0242\u0243"+
"\7v\2\2\u0243\u0244\7z\2\2\u0244\u02af\7c\2\2\u0245\u0246\7z\2\2\u0246"+
"\u0247\7c\2\2\u0247\u02af\7c\2\2\u0248\u0249\7d\2\2\u0249\u024a\7e\2\2"+
"\u024a\u02af\7e\2\2\u024b\u024c\7c\2\2\u024c\u024d\7j\2\2\u024d\u02af"+
"\7z\2\2\u024e\u024f\7v\2\2\u024f\u0250\7{\2\2\u0250\u02af\7c\2\2\u0251"+
"\u0252\7v\2\2\u0252\u0253\7z\2\2\u0253\u02af\7u\2\2\u0254\u0255\7v\2\2"+
"\u0255\u0256\7c\2\2\u0256\u02af\7u\2\2\u0257\u0258\7u\2\2\u0258\u0259"+
"\7j\2\2\u0259\u02af\7{\2\2\u025a\u025b\7u\2\2\u025b\u025c\7j\2\2\u025c"+
"\u02af\7z\2\2\u025d\u025e\7n\2\2\u025e\u025f\7f\2\2\u025f\u02af\7{\2\2"+
"\u0260\u0261\7n\2\2\u0261\u0262\7f\2\2\u0262\u02af\7c\2\2\u0263\u0264"+
"\7n\2\2\u0264\u0265\7f\2\2\u0265\u02af\7z\2\2\u0266\u0267\7n\2\2\u0267"+
"\u0268\7c\2\2\u0268\u02af\7z\2\2\u0269\u026a\7v\2\2\u026a\u026b\7c\2\2"+
"\u026b\u02af\7{\2\2\u026c\u026d\7v\2\2\u026d\u026e\7c\2\2\u026e\u02af"+
"\7z\2\2\u026f\u0270\7d\2\2\u0270\u0271\7e\2\2\u0271\u02af\7u\2\2\u0272"+
"\u0273\7e\2\2\u0273\u0274\7n\2\2\u0274\u02af\7x\2\2\u0275\u0276\7v\2\2"+
"\u0276\u0277\7u\2\2\u0277\u02af\7z\2\2\u0278\u0279\7n\2\2\u0279\u027a"+
"\7c\2\2\u027a\u02af\7u\2\2\u027b\u027c\7e\2\2\u027c\u027d\7r\2\2\u027d"+
"\u02af\7{\2\2\u027e\u027f\7e\2\2\u027f\u0280\7o\2\2\u0280\u02af\7r\2\2"+
"\u0281\u0282\7e\2\2\u0282\u0283\7r\2\2\u0283\u02af\7z\2\2\u0284\u0285"+
"\7f\2\2\u0285\u0286\7e\2\2\u0286\u02af\7r\2\2\u0287\u0288\7f\2\2\u0288"+
"\u0289\7g\2\2\u0289\u02af\7e\2\2\u028a\u028b\7k\2\2\u028b\u028c\7p\2\2"+
"\u028c\u02af\7e\2\2\u028d\u028e\7c\2\2\u028e\u028f\7z\2\2\u028f\u02af"+
"\7u\2\2\u0290\u0291\7d\2\2\u0291\u0292\7p\2\2\u0292\u02af\7g\2\2\u0293"+
"\u0294\7e\2\2\u0294\u0295\7n\2\2\u0295\u02af\7f\2\2\u0296\u0297\7u\2\2"+
"\u0297\u0298\7d\2\2\u0298\u02af\7e\2\2\u0299\u029a\7k\2\2\u029a\u029b"+
"\7u\2\2\u029b\u02af\7e\2\2\u029c\u029d\7k\2\2\u029d\u029e\7p\2\2\u029e"+
"\u02af\7z\2\2\u029f\u02a0\7d\2\2\u02a0\u02a1\7g\2\2\u02a1\u02af\7s\2\2"+
"\u02a2\u02a3\7u\2\2\u02a3\u02a4\7g\2\2\u02a4\u02af\7f\2\2\u02a5\u02a6"+
"\7f\2\2\u02a6\u02a7\7g\2\2\u02a7\u02af\7z\2\2\u02a8\u02a9\7k\2\2\u02a9"+
"\u02aa\7p\2\2\u02aa\u02af\7{\2\2\u02ab\u02ac\7t\2\2\u02ac\u02ad\7q\2\2"+
"\u02ad\u02af\7t\2\2\u02ae\u01d0\3\2\2\2\u02ae\u01d3\3\2\2\2\u02ae\u01d6"+
"\3\2\2\2\u02ae\u01d9\3\2\2\2\u02ae\u01dc\3\2\2\2\u02ae\u01df\3\2\2\2\u02ae"+
"\u01e2\3\2\2\2\u02ae\u01e5\3\2\2\2\u02ae\u01e8\3\2\2\2\u02ae\u01eb\3\2"+
"\2\2\u02ae\u01ee\3\2\2\2\u02ae\u01f1\3\2\2\2\u02ae\u01f4\3\2\2\2\u02ae"+
"\u01f7\3\2\2\2\u02ae\u01fa\3\2\2\2\u02ae\u01fd\3\2\2\2\u02ae\u0200\3\2"+
"\2\2\u02ae\u0203\3\2\2\2\u02ae\u0206\3\2\2\2\u02ae\u0209\3\2\2\2\u02ae"+
"\u020c\3\2\2\2\u02ae\u020f\3\2\2\2\u02ae\u0212\3\2\2\2\u02ae\u0215\3\2"+
"\2\2\u02ae\u0218\3\2\2\2\u02ae\u021b\3\2\2\2\u02ae\u021e\3\2\2\2\u02ae"+
"\u0221\3\2\2\2\u02ae\u0224\3\2\2\2\u02ae\u0227\3\2\2\2\u02ae\u022a\3\2"+
"\2\2\u02ae\u022d\3\2\2\2\u02ae\u0230\3\2\2\2\u02ae\u0233\3\2\2\2\u02ae"+
"\u0236\3\2\2\2\u02ae\u0239\3\2\2\2\u02ae\u023c\3\2\2\2\u02ae\u023f\3\2"+
"\2\2\u02ae\u0242\3\2\2\2\u02ae\u0245\3\2\2\2\u02ae\u0248\3\2\2\2\u02ae"+
"\u024b\3\2\2\2\u02ae\u024e\3\2\2\2\u02ae\u0251\3\2\2\2\u02ae\u0254\3\2"+
"\2\2\u02ae\u0257\3\2\2\2\u02ae\u025a\3\2\2\2\u02ae\u025d\3\2\2\2\u02ae"+
"\u0260\3\2\2\2\u02ae\u0263\3\2\2\2\u02ae\u0266\3\2\2\2\u02ae\u0269\3\2"+
"\2\2\u02ae\u026c\3\2\2\2\u02ae\u026f\3\2\2\2\u02ae\u0272\3\2\2\2\u02ae"+
"\u0275\3\2\2\2\u02ae\u0278\3\2\2\2\u02ae\u027b\3\2\2\2\u02ae\u027e\3\2"+
"\2\2\u02ae\u0281\3\2\2\2\u02ae\u0284\3\2\2\2\u02ae\u0287\3\2\2\2\u02ae"+
"\u028a\3\2\2\2\u02ae\u028d\3\2\2\2\u02ae\u0290\3\2\2\2\u02ae\u0293\3\2"+
"\2\2\u02ae\u0296\3\2\2\2\u02ae\u0299\3\2\2\2\u02ae\u029c\3\2\2\2\u02ae"+
"\u029f\3\2\2\2\u02ae\u02a2\3\2\2\2\u02ae\u02a5\3\2\2\2\u02ae\u02a8\3\2"+
"\2\2\u02ae\u02ab\3\2\2\2\u02af\u0090\3\2\2\2\u02b0\u02b1\7}\2\2\u02b1"+
"\u02b2\7}\2\2\u02b2\u02b6\3\2\2\2\u02b3\u02b5\13\2\2\2\u02b4\u02b3\3\2"+
"\2\2\u02b5\u02b8\3\2\2\2\u02b6\u02b7\3\2\2\2\u02b6\u02b4\3\2\2\2\u02b7"+
"\u02b9\3\2\2\2\u02b8\u02b6\3\2\2\2\u02b9\u02ba\7\177\2\2\u02ba\u02bb\7"+
"\177\2\2\u02bb\u0092\3\2\2\2\u02bc\u02bd\7d\2\2\u02bd\u02be\7{\2\2\u02be"+
"\u02bf\7v\2\2\u02bf\u02d2\7g\2\2\u02c0\u02c1\7y\2\2\u02c1\u02c2\7q\2\2"+
"\u02c2\u02c3\7t\2\2\u02c3\u02d2\7f\2\2\u02c4\u02c5\7f\2\2\u02c5\u02c6"+
"\7y\2\2\u02c6\u02c7\7q\2\2\u02c7\u02c8\7t\2\2\u02c8\u02d2\7f\2\2\u02c9"+
"\u02ca\7d\2\2\u02ca\u02cb\7q\2\2\u02cb\u02cc\7q\2\2\u02cc\u02d2\7n\2\2"+
"\u02cd\u02ce\7x\2\2\u02ce\u02cf\7q\2\2\u02cf\u02d0\7k\2\2\u02d0\u02d2"+
"\7f\2\2\u02d1\u02bc\3\2\2\2\u02d1\u02c0\3\2\2\2\u02d1\u02c4\3\2\2\2\u02d1"+
"\u02c9\3\2\2\2\u02d1\u02cd\3\2\2\2\u02d2\u0094\3\2\2\2\u02d3\u02d9\7$"+
"\2\2\u02d4\u02d5\7^\2\2\u02d5\u02d8\7$\2\2\u02d6\u02d8\n\2\2\2\u02d7\u02d4"+
"\3\2\2\2\u02d7\u02d6\3\2\2\2\u02d8\u02db\3\2\2\2\u02d9\u02d7\3\2\2\2\u02d9"+
"\u02da\3\2\2\2\u02da\u02dc\3\2\2\2\u02db\u02d9\3\2\2\2\u02dc\u02dd\7$"+
"\2\2\u02dd\u0096\3\2\2\2\u02de\u02e2\7)\2\2\u02df\u02e0\7^\2\2\u02e0\u02e3"+
"\7)\2\2\u02e1\u02e3\n\3\2\2\u02e2\u02df\3\2\2\2\u02e2\u02e1\3\2\2\2\u02e3"+
"\u02e4\3\2\2\2\u02e4\u02e5\7)\2\2\u02e5\u0098\3\2\2\2\u02e6\u02e7\7v\2"+
"\2\u02e7\u02e8\7t\2\2\u02e8\u02e9\7w\2\2\u02e9\u02f0\7g\2\2\u02ea\u02eb"+
"\7h\2\2\u02eb\u02ec\7c\2\2\u02ec\u02ed\7n\2\2\u02ed\u02ee\7u\2\2\u02ee"+
"\u02f0\7g\2\2\u02ef\u02e6\3\2\2\2\u02ef\u02ea\3\2\2\2\u02f0\u009a\3\2"+
"\2\2\u02f1\u02f4\5\u009dO\2\u02f2\u02f4\5\u00a5S\2\u02f3\u02f1\3\2\2\2"+
"\u02f3\u02f2\3\2\2\2\u02f4\u009c\3\2\2\2\u02f5\u02f9\5\u009fP\2\u02f6"+
"\u02f9\5\u00a1Q\2\u02f7\u02f9\5\u00a3R\2\u02f8\u02f5\3\2\2\2\u02f8\u02f6"+
"\3\2\2\2\u02f8\u02f7\3\2\2\2\u02f9\u009e\3\2\2\2\u02fa\u0300\7\'\2\2\u02fb"+
"\u02fc\7\62\2\2\u02fc\u0300\7d\2\2\u02fd\u02fe\7\62\2\2\u02fe\u0300\7"+
"D\2\2\u02ff\u02fa\3\2\2\2\u02ff\u02fb\3\2\2\2\u02ff\u02fd\3\2\2\2\u0300"+
"\u0304\3\2\2\2\u0301\u0303\5\u00adW\2\u0302\u0301\3\2\2\2\u0303\u0306"+
"\3\2\2\2\u0304\u0302\3\2\2\2\u0304\u0305\3\2\2\2\u0305\u0307\3\2\2\2\u0306"+
"\u0304\3\2\2\2\u0307\u0309\7\60\2\2\u0308\u030a\5\u00adW\2\u0309\u0308"+
"\3\2\2\2\u030a\u030b\3\2\2\2\u030b\u0309\3\2\2\2\u030b\u030c\3\2\2\2\u030c"+
"\u00a0\3\2\2\2\u030d\u030f\5\u00afX\2\u030e\u030d\3\2\2\2\u030f\u0312"+
"\3\2\2\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0313\3\2\2\2\u0312"+
"\u0310\3\2\2\2\u0313\u0315\7\60\2\2\u0314\u0316\5\u00afX\2\u0315\u0314"+
"\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0315\3\2\2\2\u0317\u0318\3\2\2\2\u0318"+
"\u00a2\3\2\2\2\u0319\u031f\7&\2\2\u031a\u031b\7\62\2\2\u031b\u031f\7z"+
"\2\2\u031c\u031d\7\62\2\2\u031d\u031f\7Z\2\2\u031e\u0319\3\2\2\2\u031e"+
"\u031a\3\2\2\2\u031e\u031c\3\2\2\2\u031f\u0323\3\2\2\2\u0320\u0322\5\u00b1"+
"Y\2\u0321\u0320\3\2\2\2\u0322\u0325\3\2\2\2\u0323\u0321\3\2\2\2\u0323"+
"\u0324\3\2\2\2\u0324\u0326\3\2\2\2\u0325\u0323\3\2\2\2\u0326\u0328\7\60"+
"\2\2\u0327\u0329\5\u00b1Y\2\u0328\u0327\3\2\2\2\u0329\u032a\3\2\2\2\u032a"+
"\u0328\3\2\2\2\u032a\u032b\3\2\2\2\u032b\u00a4\3\2\2\2\u032c\u0330\5\u00a9"+
"U\2\u032d\u0330\5\u00abV\2\u032e\u0330\5\u00a7T\2\u032f\u032c\3\2\2\2"+
"\u032f\u032d\3\2\2\2\u032f\u032e\3\2\2\2\u0330\u00a6\3\2\2\2\u0331\u0332"+
"\7\62\2\2\u0332\u0334\t\4\2\2\u0333\u0335\5\u00adW\2\u0334\u0333\3\2\2"+
"\2\u0335\u0336\3\2\2\2\u0336\u0334\3\2\2\2\u0336\u0337\3\2\2\2\u0337\u033f"+
"\3\2\2\2\u0338\u033a\7\'\2\2\u0339\u033b\5\u00adW\2\u033a\u0339\3\2\2"+
"\2\u033b\u033c\3\2\2\2\u033c\u033a\3\2\2\2\u033c\u033d\3\2\2\2\u033d\u033f"+
"\3\2\2\2\u033e\u0331\3\2\2\2\u033e\u0338\3\2\2\2\u033f\u00a8\3\2\2\2\u0340"+
"\u0342\5\u00afX\2\u0341\u0340\3\2\2\2\u0342\u0343\3\2\2\2\u0343\u0341"+
"\3\2\2\2\u0343\u0344\3\2\2\2\u0344\u00aa\3\2\2\2\u0345\u034b\7&\2\2\u0346"+
"\u0347\7\62\2\2\u0347\u034b\7z\2\2\u0348\u0349\7\62\2\2\u0349\u034b\7"+
"Z\2\2\u034a\u0345\3\2\2\2\u034a\u0346\3\2\2\2\u034a\u0348\3\2\2\2\u034b"+
"\u034d\3\2\2\2\u034c\u034e\5\u00b1Y\2\u034d\u034c\3\2\2\2\u034e\u034f"+
"\3\2\2\2\u034f\u034d\3\2\2\2\u034f\u0350\3\2\2\2\u0350\u00ac\3\2\2\2\u0351"+
"\u0352\t\5\2\2\u0352\u00ae\3\2\2\2\u0353\u0354\t\6\2\2\u0354\u00b0\3\2"+
"\2\2\u0355\u0356\t\7\2\2\u0356\u00b2\3\2\2\2\u0357\u035b\5\u00b5[\2\u0358"+
"\u035a\5\u00b7\\\2\u0359\u0358\3\2\2\2\u035a\u035d\3\2\2\2\u035b\u0359"+
"\3\2\2\2\u035b\u035c\3\2\2\2\u035c\u00b4\3\2\2\2\u035d\u035b\3\2\2\2\u035e"+
"\u035f\t\b\2\2\u035f\u00b6\3\2\2\2\u0360\u0361\t\t\2\2\u0361\u00b8\3\2"+
"\2\2\u0362\u0366\7#\2\2\u0363\u0365\5\u00b7\\\2\u0364\u0363\3\2\2\2\u0365"+
"\u0368\3\2\2\2\u0366\u0364\3\2\2\2\u0366\u0367\3\2\2\2\u0367\u036a\3\2"+
"\2\2\u0368\u0366\3\2\2\2\u0369\u036b\t\n\2\2\u036a\u0369\3\2\2\2\u036b"+
"\u036c\3\2\2\2\u036c\u036a\3\2\2\2\u036c\u036d\3\2\2\2\u036d\u00ba\3\2"+
"\2\2\u036e\u0370\t\13\2\2\u036f\u036e\3\2\2\2\u0370\u0371\3\2\2\2\u0371"+
"\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0374\b^"+
"\2\2\u0374\u00bc\3\2\2\2\u0375\u0376\7\61\2\2\u0376\u0377\7\61\2\2\u0377"+
"\u037b\3\2\2\2\u0378\u037a\n\f\2\2\u0379\u0378\3\2\2\2\u037a\u037d\3\2"+
"\2\2\u037b\u0379\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037e\3\2\2\2\u037d"+
"\u037b\3\2\2\2\u037e\u037f\b_\3\2\u037f\u00be\3\2\2\2\u0380\u0381\7\61"+
"\2\2\u0381\u0382\7,\2\2\u0382\u0386\3\2\2\2\u0383\u0385\13\2\2\2\u0384"+
"\u0383\3\2\2\2\u0385\u0388\3\2\2\2\u0386\u0387\3\2\2\2\u0386\u0384\3\2"+
"\2\2\u0387\u0389\3\2\2\2\u0388\u0386\3\2\2\2\u0389\u038a\7,\2\2\u038a"+
"\u038b\7\61\2\2\u038b\u038c\3\2\2\2\u038c\u038d\b`\3\2\u038d\u00c0\3\2"+
"\2\2!\2\u02ae\u02b6\u02d1\u02d7\u02d9\u02e2\u02ef\u02f3\u02f8\u02ff\u0304"+
"\u030b\u0310\u0317\u031e\u0323\u032a\u032f\u0336\u033c\u033e\u0343\u034a"+
"\u034f\u035b\u0366\u036c\u0371\u037b\u0386\4\2\3\2\2\4\2";
"\u00f1\u00f2\7g\2\2\u00f2\u00f3\7t\2\2\u00f3\u00f4\7u\2\2\u00f4\32\3\2"+
"\2\2\u00f5\u00f6\7r\2\2\u00f6\u00f7\7c\2\2\u00f7\u00f8\7t\2\2\u00f8\u00f9"+
"\7c\2\2\u00f9\u00fa\7o\2\2\u00fa\34\3\2\2\2\u00fb\u00fc\7<\2\2\u00fc\36"+
"\3\2\2\2\u00fd\u00fe\7d\2\2\u00fe\u00ff\7{\2\2\u00ff\u0100\7v\2\2\u0100"+
"\u0101\7g\2\2\u0101\u0102\7u\2\2\u0102 \3\2\2\2\u0103\u0104\7e\2\2\u0104"+
"\u0105\7{\2\2\u0105\u0106\7e\2\2\u0106\u0107\7n\2\2\u0107\u0108\7g\2\2"+
"\u0108\u0109\7u\2\2\u0109\"\3\2\2\2\u010a\u010b\7r\2\2\u010b\u010c\7e"+
"\2\2\u010c$\3\2\2\2\u010d\u010e\7k\2\2\u010e\u010f\7p\2\2\u010f\u0110"+
"\7n\2\2\u0110\u0111\7k\2\2\u0111\u0112\7p\2\2\u0112\u0113\7g\2\2\u0113"+
"&\3\2\2\2\u0114\u0115\7e\2\2\u0115\u0116\7q\2\2\u0116\u0117\7p\2\2\u0117"+
"\u0118\7u\2\2\u0118\u0119\7v\2\2\u0119(\3\2\2\2\u011a\u011b\7g\2\2\u011b"+
"\u011c\7z\2\2\u011c\u011d\7v\2\2\u011d\u011e\7g\2\2\u011e\u011f\7t\2\2"+
"\u011f\u0120\7p\2\2\u0120*\3\2\2\2\u0121\u0122\7c\2\2\u0122\u0123\7n\2"+
"\2\u0123\u0124\7k\2\2\u0124\u0125\7i\2\2\u0125\u0126\7p\2\2\u0126,\3\2"+
"\2\2\u0127\u0128\7t\2\2\u0128\u0129\7g\2\2\u0129\u012a\7i\2\2\u012a\u012b"+
"\7k\2\2\u012b\u012c\7u\2\2\u012c\u012d\7v\2\2\u012d\u012e\7g\2\2\u012e"+
"\u012f\7t\2\2\u012f.\3\2\2\2\u0130\u0131\7x\2\2\u0131\u0132\7q\2\2\u0132"+
"\u0133\7n\2\2\u0133\u0134\7c\2\2\u0134\u0135\7v\2\2\u0135\u0136\7k\2\2"+
"\u0136\u0137\7n\2\2\u0137\u0138\7g\2\2\u0138\60\3\2\2\2\u0139\u013a\7"+
"k\2\2\u013a\u013b\7p\2\2\u013b\u013c\7v\2\2\u013c\u013d\7g\2\2\u013d\u013e"+
"\7t\2\2\u013e\u013f\7t\2\2\u013f\u0140\7w\2\2\u0140\u0141\7r\2\2\u0141"+
"\u0142\7v\2\2\u0142\62\3\2\2\2\u0143\u0144\7k\2\2\u0144\u0145\7h\2\2\u0145"+
"\64\3\2\2\2\u0146\u0147\7g\2\2\u0147\u0148\7n\2\2\u0148\u0149\7u\2\2\u0149"+
"\u014a\7g\2\2\u014a\66\3\2\2\2\u014b\u014c\7y\2\2\u014c\u014d\7j\2\2\u014d"+
"\u014e\7k\2\2\u014e\u014f\7n\2\2\u014f\u0150\7g\2\2\u01508\3\2\2\2\u0151"+
"\u0152\7f\2\2\u0152\u0153\7q\2\2\u0153:\3\2\2\2\u0154\u0155\7h\2\2\u0155"+
"\u0156\7q\2\2\u0156\u0157\7t\2\2\u0157<\3\2\2\2\u0158\u0159\7t\2\2\u0159"+
"\u015a\7g\2\2\u015a\u015b\7v\2\2\u015b\u015c\7w\2\2\u015c\u015d\7t\2\2"+
"\u015d\u015e\7p\2\2\u015e>\3\2\2\2\u015f\u0160\7c\2\2\u0160\u0161\7u\2"+
"\2\u0161\u0162\7o\2\2\u0162@\3\2\2\2\u0163\u0164\7\60\2\2\u0164\u0165"+
"\7\60\2\2\u0165B\3\2\2\2\u0166\u0167\7u\2\2\u0167\u0168\7k\2\2\u0168\u0169"+
"\7i\2\2\u0169\u016a\7p\2\2\u016a\u016b\7g\2\2\u016b\u016c\7f\2\2\u016c"+
"D\3\2\2\2\u016d\u016e\7,\2\2\u016eF\3\2\2\2\u016f\u0170\7]\2\2\u0170H"+
"\3\2\2\2\u0171\u0172\7_\2\2\u0172J\3\2\2\2\u0173\u0174\7/\2\2\u0174\u0175"+
"\7/\2\2\u0175L\3\2\2\2\u0176\u0177\7-\2\2\u0177\u0178\7-\2\2\u0178N\3"+
"\2\2\2\u0179\u017a\7-\2\2\u017aP\3\2\2\2\u017b\u017c\7/\2\2\u017cR\3\2"+
"\2\2\u017d\u017e\7#\2\2\u017eT\3\2\2\2\u017f\u0180\7(\2\2\u0180V\3\2\2"+
"\2\u0181\u0182\7\u0080\2\2\u0182X\3\2\2\2\u0183\u0184\7@\2\2\u0184\u0185"+
"\7@\2\2\u0185Z\3\2\2\2\u0186\u0187\7>\2\2\u0187\u0188\7>\2\2\u0188\\\3"+
"\2\2\2\u0189\u018a\7\61\2\2\u018a^\3\2\2\2\u018b\u018c\7\'\2\2\u018c`"+
"\3\2\2\2\u018d\u018e\7>\2\2\u018eb\3\2\2\2\u018f\u0190\7@\2\2\u0190d\3"+
"\2\2\2\u0191\u0192\7?\2\2\u0192\u0193\7?\2\2\u0193f\3\2\2\2\u0194\u0195"+
"\7#\2\2\u0195\u0196\7?\2\2\u0196h\3\2\2\2\u0197\u0198\7>\2\2\u0198\u0199"+
"\7?\2\2\u0199j\3\2\2\2\u019a\u019b\7@\2\2\u019b\u019c\7?\2\2\u019cl\3"+
"\2\2\2\u019d\u019e\7`\2\2\u019en\3\2\2\2\u019f\u01a0\7~\2\2\u01a0p\3\2"+
"\2\2\u01a1\u01a2\7(\2\2\u01a2\u01a3\7(\2\2\u01a3r\3\2\2\2\u01a4\u01a5"+
"\7~\2\2\u01a5\u01a6\7~\2\2\u01a6t\3\2\2\2\u01a7\u01a8\7-\2\2\u01a8\u01a9"+
"\7?\2\2\u01a9v\3\2\2\2\u01aa\u01ab\7/\2\2\u01ab\u01ac\7?\2\2\u01acx\3"+
"\2\2\2\u01ad\u01ae\7,\2\2\u01ae\u01af\7?\2\2\u01afz\3\2\2\2\u01b0\u01b1"+
"\7\61\2\2\u01b1\u01b2\7?\2\2\u01b2|\3\2\2\2\u01b3\u01b4\7\'\2\2\u01b4"+
"\u01b5\7?\2\2\u01b5~\3\2\2\2\u01b6\u01b7\7>\2\2\u01b7\u01b8\7>\2\2\u01b8"+
"\u01b9\7?\2\2\u01b9\u0080\3\2\2\2\u01ba\u01bb\7@\2\2\u01bb\u01bc\7@\2"+
"\2\u01bc\u01bd\7?\2\2\u01bd\u0082\3\2\2\2\u01be\u01bf\7(\2\2\u01bf\u01c0"+
"\7?\2\2\u01c0\u0084\3\2\2\2\u01c1\u01c2\7~\2\2\u01c2\u01c3\7?\2\2\u01c3"+
"\u0086\3\2\2\2\u01c4\u01c5\7`\2\2\u01c5\u01c6\7?\2\2\u01c6\u0088\3\2\2"+
"\2\u01c7\u01c8\7\60\2\2\u01c8\u01c9\7d\2\2\u01c9\u01ca\7{\2\2\u01ca\u01cb"+
"\7v\2\2\u01cb\u01cc\7g\2\2\u01cc\u008a\3\2\2\2\u01cd\u01ce\7%\2\2\u01ce"+
"\u008c\3\2\2\2\u01cf\u01d0\7\60\2\2\u01d0\u008e\3\2\2\2\u01d1\u01d2\7"+
"d\2\2\u01d2\u01d3\7t\2\2\u01d3\u02b0\7m\2\2\u01d4\u01d5\7q\2\2\u01d5\u01d6"+
"\7t\2\2\u01d6\u02b0\7c\2\2\u01d7\u01d8\7m\2\2\u01d8\u01d9\7k\2\2\u01d9"+
"\u02b0\7n\2\2\u01da\u01db\7u\2\2\u01db\u01dc\7n\2\2\u01dc\u02b0\7q\2\2"+
"\u01dd\u01de\7p\2\2\u01de\u01df\7q\2\2\u01df\u02b0\7r\2\2\u01e0\u01e1"+
"\7c\2\2\u01e1\u01e2\7u\2\2\u01e2\u02b0\7n\2\2\u01e3\u01e4\7r\2\2\u01e4"+
"\u01e5\7j\2\2\u01e5\u02b0\7r\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7p\2\2"+
"\u01e8\u02b0\7e\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7r\2\2\u01eb\u02b0"+
"\7n\2\2\u01ec\u01ed\7e\2\2\u01ed\u01ee\7n\2\2\u01ee\u02b0\7e\2\2\u01ef"+
"\u01f0\7l\2\2\u01f0\u01f1\7u\2\2\u01f1\u02b0\7t\2\2\u01f2\u01f3\7c\2\2"+
"\u01f3\u01f4\7p\2\2\u01f4\u02b0\7f\2\2\u01f5\u01f6\7t\2\2\u01f6\u01f7"+
"\7n\2\2\u01f7\u02b0\7c\2\2\u01f8\u01f9\7d\2\2\u01f9\u01fa\7k\2\2\u01fa"+
"\u02b0\7v\2\2\u01fb\u01fc\7t\2\2\u01fc\u01fd\7q\2\2\u01fd\u02b0\7n\2\2"+
"\u01fe\u01ff\7r\2\2\u01ff\u0200\7n\2\2\u0200\u02b0\7c\2\2\u0201\u0202"+
"\7r\2\2\u0202\u0203\7n\2\2\u0203\u02b0\7r\2\2\u0204\u0205\7d\2\2\u0205"+
"\u0206\7o\2\2\u0206\u02b0\7k\2\2\u0207\u0208\7u\2\2\u0208\u0209\7g\2\2"+
"\u0209\u02b0\7e\2\2\u020a\u020b\7t\2\2\u020b\u020c\7v\2\2\u020c\u02b0"+
"\7k\2\2\u020d\u020e\7g\2\2\u020e\u020f\7q\2\2\u020f\u02b0\7t\2\2\u0210"+
"\u0211\7u\2\2\u0211\u0212\7t\2\2\u0212\u02b0\7g\2\2\u0213\u0214\7n\2\2"+
"\u0214\u0215\7u\2\2\u0215\u02b0\7t\2\2\u0216\u0217\7r\2\2\u0217\u0218"+
"\7j\2\2\u0218\u02b0\7c\2\2\u0219\u021a\7c\2\2\u021a\u021b\7n\2\2\u021b"+
"\u02b0\7t\2\2\u021c\u021d\7l\2\2\u021d\u021e\7o\2\2\u021e\u02b0\7r\2\2"+
"\u021f\u0220\7d\2\2\u0220\u0221\7x\2\2\u0221\u02b0\7e\2\2\u0222\u0223"+
"\7e\2\2\u0223\u0224\7n\2\2\u0224\u02b0\7k\2\2\u0225\u0226\7t\2\2\u0226"+
"\u0227\7v\2\2\u0227\u02b0\7u\2\2\u0228\u0229\7c\2\2\u0229\u022a\7f\2\2"+
"\u022a\u02b0\7e\2\2\u022b\u022c\7t\2\2\u022c\u022d\7t\2\2\u022d\u02b0"+
"\7c\2\2\u022e\u022f\7d\2\2\u022f\u0230\7x\2\2\u0230\u02b0\7u\2\2\u0231"+
"\u0232\7u\2\2\u0232\u0233\7g\2\2\u0233\u02b0\7k\2\2\u0234\u0235\7u\2\2"+
"\u0235\u0236\7c\2\2\u0236\u02b0\7z\2\2\u0237\u0238\7u\2\2\u0238\u0239"+
"\7v\2\2\u0239\u02b0\7{\2\2\u023a\u023b\7u\2\2\u023b\u023c\7v\2\2\u023c"+
"\u02b0\7c\2\2\u023d\u023e\7u\2\2\u023e\u023f\7v\2\2\u023f\u02b0\7z\2\2"+
"\u0240\u0241\7f\2\2\u0241\u0242\7g\2\2\u0242\u02b0\7{\2\2\u0243\u0244"+
"\7v\2\2\u0244\u0245\7z\2\2\u0245\u02b0\7c\2\2\u0246\u0247\7z\2\2\u0247"+
"\u0248\7c\2\2\u0248\u02b0\7c\2\2\u0249\u024a\7d\2\2\u024a\u024b\7e\2\2"+
"\u024b\u02b0\7e\2\2\u024c\u024d\7c\2\2\u024d\u024e\7j\2\2\u024e\u02b0"+
"\7z\2\2\u024f\u0250\7v\2\2\u0250\u0251\7{\2\2\u0251\u02b0\7c\2\2\u0252"+
"\u0253\7v\2\2\u0253\u0254\7z\2\2\u0254\u02b0\7u\2\2\u0255\u0256\7v\2\2"+
"\u0256\u0257\7c\2\2\u0257\u02b0\7u\2\2\u0258\u0259\7u\2\2\u0259\u025a"+
"\7j\2\2\u025a\u02b0\7{\2\2\u025b\u025c\7u\2\2\u025c\u025d\7j\2\2\u025d"+
"\u02b0\7z\2\2\u025e\u025f\7n\2\2\u025f\u0260\7f\2\2\u0260\u02b0\7{\2\2"+
"\u0261\u0262\7n\2\2\u0262\u0263\7f\2\2\u0263\u02b0\7c\2\2\u0264\u0265"+
"\7n\2\2\u0265\u0266\7f\2\2\u0266\u02b0\7z\2\2\u0267\u0268\7n\2\2\u0268"+
"\u0269\7c\2\2\u0269\u02b0\7z\2\2\u026a\u026b\7v\2\2\u026b\u026c\7c\2\2"+
"\u026c\u02b0\7{\2\2\u026d\u026e\7v\2\2\u026e\u026f\7c\2\2\u026f\u02b0"+
"\7z\2\2\u0270\u0271\7d\2\2\u0271\u0272\7e\2\2\u0272\u02b0\7u\2\2\u0273"+
"\u0274\7e\2\2\u0274\u0275\7n\2\2\u0275\u02b0\7x\2\2\u0276\u0277\7v\2\2"+
"\u0277\u0278\7u\2\2\u0278\u02b0\7z\2\2\u0279\u027a\7n\2\2\u027a\u027b"+
"\7c\2\2\u027b\u02b0\7u\2\2\u027c\u027d\7e\2\2\u027d\u027e\7r\2\2\u027e"+
"\u02b0\7{\2\2\u027f\u0280\7e\2\2\u0280\u0281\7o\2\2\u0281\u02b0\7r\2\2"+
"\u0282\u0283\7e\2\2\u0283\u0284\7r\2\2\u0284\u02b0\7z\2\2\u0285\u0286"+
"\7f\2\2\u0286\u0287\7e\2\2\u0287\u02b0\7r\2\2\u0288\u0289\7f\2\2\u0289"+
"\u028a\7g\2\2\u028a\u02b0\7e\2\2\u028b\u028c\7k\2\2\u028c\u028d\7p\2\2"+
"\u028d\u02b0\7e\2\2\u028e\u028f\7c\2\2\u028f\u0290\7z\2\2\u0290\u02b0"+
"\7u\2\2\u0291\u0292\7d\2\2\u0292\u0293\7p\2\2\u0293\u02b0\7g\2\2\u0294"+
"\u0295\7e\2\2\u0295\u0296\7n\2\2\u0296\u02b0\7f\2\2\u0297\u0298\7u\2\2"+
"\u0298\u0299\7d\2\2\u0299\u02b0\7e\2\2\u029a\u029b\7k\2\2\u029b\u029c"+
"\7u\2\2\u029c\u02b0\7e\2\2\u029d\u029e\7k\2\2\u029e\u029f\7p\2\2\u029f"+
"\u02b0\7z\2\2\u02a0\u02a1\7d\2\2\u02a1\u02a2\7g\2\2\u02a2\u02b0\7s\2\2"+
"\u02a3\u02a4\7u\2\2\u02a4\u02a5\7g\2\2\u02a5\u02b0\7f\2\2\u02a6\u02a7"+
"\7f\2\2\u02a7\u02a8\7g\2\2\u02a8\u02b0\7z\2\2\u02a9\u02aa\7k\2\2\u02aa"+
"\u02ab\7p\2\2\u02ab\u02b0\7{\2\2\u02ac\u02ad\7t\2\2\u02ad\u02ae\7q\2\2"+
"\u02ae\u02b0\7t\2\2\u02af\u01d1\3\2\2\2\u02af\u01d4\3\2\2\2\u02af\u01d7"+
"\3\2\2\2\u02af\u01da\3\2\2\2\u02af\u01dd\3\2\2\2\u02af\u01e0\3\2\2\2\u02af"+
"\u01e3\3\2\2\2\u02af\u01e6\3\2\2\2\u02af\u01e9\3\2\2\2\u02af\u01ec\3\2"+
"\2\2\u02af\u01ef\3\2\2\2\u02af\u01f2\3\2\2\2\u02af\u01f5\3\2\2\2\u02af"+
"\u01f8\3\2\2\2\u02af\u01fb\3\2\2\2\u02af\u01fe\3\2\2\2\u02af\u0201\3\2"+
"\2\2\u02af\u0204\3\2\2\2\u02af\u0207\3\2\2\2\u02af\u020a\3\2\2\2\u02af"+
"\u020d\3\2\2\2\u02af\u0210\3\2\2\2\u02af\u0213\3\2\2\2\u02af\u0216\3\2"+
"\2\2\u02af\u0219\3\2\2\2\u02af\u021c\3\2\2\2\u02af\u021f\3\2\2\2\u02af"+
"\u0222\3\2\2\2\u02af\u0225\3\2\2\2\u02af\u0228\3\2\2\2\u02af\u022b\3\2"+
"\2\2\u02af\u022e\3\2\2\2\u02af\u0231\3\2\2\2\u02af\u0234\3\2\2\2\u02af"+
"\u0237\3\2\2\2\u02af\u023a\3\2\2\2\u02af\u023d\3\2\2\2\u02af\u0240\3\2"+
"\2\2\u02af\u0243\3\2\2\2\u02af\u0246\3\2\2\2\u02af\u0249\3\2\2\2\u02af"+
"\u024c\3\2\2\2\u02af\u024f\3\2\2\2\u02af\u0252\3\2\2\2\u02af\u0255\3\2"+
"\2\2\u02af\u0258\3\2\2\2\u02af\u025b\3\2\2\2\u02af\u025e\3\2\2\2\u02af"+
"\u0261\3\2\2\2\u02af\u0264\3\2\2\2\u02af\u0267\3\2\2\2\u02af\u026a\3\2"+
"\2\2\u02af\u026d\3\2\2\2\u02af\u0270\3\2\2\2\u02af\u0273\3\2\2\2\u02af"+
"\u0276\3\2\2\2\u02af\u0279\3\2\2\2\u02af\u027c\3\2\2\2\u02af\u027f\3\2"+
"\2\2\u02af\u0282\3\2\2\2\u02af\u0285\3\2\2\2\u02af\u0288\3\2\2\2\u02af"+
"\u028b\3\2\2\2\u02af\u028e\3\2\2\2\u02af\u0291\3\2\2\2\u02af\u0294\3\2"+
"\2\2\u02af\u0297\3\2\2\2\u02af\u029a\3\2\2\2\u02af\u029d\3\2\2\2\u02af"+
"\u02a0\3\2\2\2\u02af\u02a3\3\2\2\2\u02af\u02a6\3\2\2\2\u02af\u02a9\3\2"+
"\2\2\u02af\u02ac\3\2\2\2\u02b0\u0090\3\2\2\2\u02b1\u02b2\7}\2\2\u02b2"+
"\u02b3\7}\2\2\u02b3\u02b7\3\2\2\2\u02b4\u02b6\13\2\2\2\u02b5\u02b4\3\2"+
"\2\2\u02b6\u02b9\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b7\u02b5\3\2\2\2\u02b8"+
"\u02ba\3\2\2\2\u02b9\u02b7\3\2\2\2\u02ba\u02bb\7\177\2\2\u02bb\u02bc\7"+
"\177\2\2\u02bc\u0092\3\2\2\2\u02bd\u02be\7d\2\2\u02be\u02bf\7{\2\2\u02bf"+
"\u02c0\7v\2\2\u02c0\u02d3\7g\2\2\u02c1\u02c2\7y\2\2\u02c2\u02c3\7q\2\2"+
"\u02c3\u02c4\7t\2\2\u02c4\u02d3\7f\2\2\u02c5\u02c6\7f\2\2\u02c6\u02c7"+
"\7y\2\2\u02c7\u02c8\7q\2\2\u02c8\u02c9\7t\2\2\u02c9\u02d3\7f\2\2\u02ca"+
"\u02cb\7d\2\2\u02cb\u02cc\7q\2\2\u02cc\u02cd\7q\2\2\u02cd\u02d3\7n\2\2"+
"\u02ce\u02cf\7x\2\2\u02cf\u02d0\7q\2\2\u02d0\u02d1\7k\2\2\u02d1\u02d3"+
"\7f\2\2\u02d2\u02bd\3\2\2\2\u02d2\u02c1\3\2\2\2\u02d2\u02c5\3\2\2\2\u02d2"+
"\u02ca\3\2\2\2\u02d2\u02ce\3\2\2\2\u02d3\u0094\3\2\2\2\u02d4\u02da\7$"+
"\2\2\u02d5\u02d6\7^\2\2\u02d6\u02d9\7$\2\2\u02d7\u02d9\n\2\2\2\u02d8\u02d5"+
"\3\2\2\2\u02d8\u02d7\3\2\2\2\u02d9\u02dc\3\2\2\2\u02da\u02d8\3\2\2\2\u02da"+
"\u02db\3\2\2\2\u02db\u02dd\3\2\2\2\u02dc\u02da\3\2\2\2\u02dd\u02de\7$"+
"\2\2\u02de\u0096\3\2\2\2\u02df\u02e3\7)\2\2\u02e0\u02e1\7^\2\2\u02e1\u02e4"+
"\7)\2\2\u02e2\u02e4\n\3\2\2\u02e3\u02e0\3\2\2\2\u02e3\u02e2\3\2\2\2\u02e4"+
"\u02e5\3\2\2\2\u02e5\u02e6\7)\2\2\u02e6\u0098\3\2\2\2\u02e7\u02e8\7v\2"+
"\2\u02e8\u02e9\7t\2\2\u02e9\u02ea\7w\2\2\u02ea\u02f1\7g\2\2\u02eb\u02ec"+
"\7h\2\2\u02ec\u02ed\7c\2\2\u02ed\u02ee\7n\2\2\u02ee\u02ef\7u\2\2\u02ef"+
"\u02f1\7g\2\2\u02f0\u02e7\3\2\2\2\u02f0\u02eb\3\2\2\2\u02f1\u009a\3\2"+
"\2\2\u02f2\u02f5\5\u009dO\2\u02f3\u02f5\5\u00a5S\2\u02f4\u02f2\3\2\2\2"+
"\u02f4\u02f3\3\2\2\2\u02f5\u009c\3\2\2\2\u02f6\u02fa\5\u009fP\2\u02f7"+
"\u02fa\5\u00a1Q\2\u02f8\u02fa\5\u00a3R\2\u02f9\u02f6\3\2\2\2\u02f9\u02f7"+
"\3\2\2\2\u02f9\u02f8\3\2\2\2\u02fa\u009e\3\2\2\2\u02fb\u0301\7\'\2\2\u02fc"+
"\u02fd\7\62\2\2\u02fd\u0301\7d\2\2\u02fe\u02ff\7\62\2\2\u02ff\u0301\7"+
"D\2\2\u0300\u02fb\3\2\2\2\u0300\u02fc\3\2\2\2\u0300\u02fe\3\2\2\2\u0301"+
"\u0305\3\2\2\2\u0302\u0304\5\u00adW\2\u0303\u0302\3\2\2\2\u0304\u0307"+
"\3\2\2\2\u0305\u0303\3\2\2\2\u0305\u0306\3\2\2\2\u0306\u0308\3\2\2\2\u0307"+
"\u0305\3\2\2\2\u0308\u030a\7\60\2\2\u0309\u030b\5\u00adW\2\u030a\u0309"+
"\3\2\2\2\u030b\u030c\3\2\2\2\u030c\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d"+
"\u00a0\3\2\2\2\u030e\u0310\5\u00afX\2\u030f\u030e\3\2\2\2\u0310\u0313"+
"\3\2\2\2\u0311\u030f\3\2\2\2\u0311\u0312\3\2\2\2\u0312\u0314\3\2\2\2\u0313"+
"\u0311\3\2\2\2\u0314\u0316\7\60\2\2\u0315\u0317\5\u00afX\2\u0316\u0315"+
"\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u0316\3\2\2\2\u0318\u0319\3\2\2\2\u0319"+
"\u00a2\3\2\2\2\u031a\u0320\7&\2\2\u031b\u031c\7\62\2\2\u031c\u0320\7z"+
"\2\2\u031d\u031e\7\62\2\2\u031e\u0320\7Z\2\2\u031f\u031a\3\2\2\2\u031f"+
"\u031b\3\2\2\2\u031f\u031d\3\2\2\2\u0320\u0324\3\2\2\2\u0321\u0323\5\u00b1"+
"Y\2\u0322\u0321\3\2\2\2\u0323\u0326\3\2\2\2\u0324\u0322\3\2\2\2\u0324"+
"\u0325\3\2\2\2\u0325\u0327\3\2\2\2\u0326\u0324\3\2\2\2\u0327\u0329\7\60"+
"\2\2\u0328\u032a\5\u00b1Y\2\u0329\u0328\3\2\2\2\u032a\u032b\3\2\2\2\u032b"+
"\u0329\3\2\2\2\u032b\u032c\3\2\2\2\u032c\u00a4\3\2\2\2\u032d\u0331\5\u00a9"+
"U\2\u032e\u0331\5\u00abV\2\u032f\u0331\5\u00a7T\2\u0330\u032d\3\2\2\2"+
"\u0330\u032e\3\2\2\2\u0330\u032f\3\2\2\2\u0331\u00a6\3\2\2\2\u0332\u0333"+
"\7\62\2\2\u0333\u0335\t\4\2\2\u0334\u0336\5\u00adW\2\u0335\u0334\3\2\2"+
"\2\u0336\u0337\3\2\2\2\u0337\u0335\3\2\2\2\u0337\u0338\3\2\2\2\u0338\u0340"+
"\3\2\2\2\u0339\u033b\7\'\2\2\u033a\u033c\5\u00adW\2\u033b\u033a\3\2\2"+
"\2\u033c\u033d\3\2\2\2\u033d\u033b\3\2\2\2\u033d\u033e\3\2\2\2\u033e\u0340"+
"\3\2\2\2\u033f\u0332\3\2\2\2\u033f\u0339\3\2\2\2\u0340\u00a8\3\2\2\2\u0341"+
"\u0343\5\u00afX\2\u0342\u0341\3\2\2\2\u0343\u0344\3\2\2\2\u0344\u0342"+
"\3\2\2\2\u0344\u0345\3\2\2\2\u0345\u00aa\3\2\2\2\u0346\u034c\7&\2\2\u0347"+
"\u0348\7\62\2\2\u0348\u034c\7z\2\2\u0349\u034a\7\62\2\2\u034a\u034c\7"+
"Z\2\2\u034b\u0346\3\2\2\2\u034b\u0347\3\2\2\2\u034b\u0349\3\2\2\2\u034c"+
"\u034e\3\2\2\2\u034d\u034f\5\u00b1Y\2\u034e\u034d\3\2\2\2\u034f\u0350"+
"\3\2\2\2\u0350\u034e\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u00ac\3\2\2\2\u0352"+
"\u0353\t\5\2\2\u0353\u00ae\3\2\2\2\u0354\u0355\t\6\2\2\u0355\u00b0\3\2"+
"\2\2\u0356\u0357\t\7\2\2\u0357\u00b2\3\2\2\2\u0358\u035c\5\u00b5[\2\u0359"+
"\u035b\5\u00b7\\\2\u035a\u0359\3\2\2\2\u035b\u035e\3\2\2\2\u035c\u035a"+
"\3\2\2\2\u035c\u035d\3\2\2\2\u035d\u00b4\3\2\2\2\u035e\u035c\3\2\2\2\u035f"+
"\u0360\t\b\2\2\u0360\u00b6\3\2\2\2\u0361\u0362\t\t\2\2\u0362\u00b8\3\2"+
"\2\2\u0363\u0367\7#\2\2\u0364\u0366\5\u00b7\\\2\u0365\u0364\3\2\2\2\u0366"+
"\u0369\3\2\2\2\u0367\u0365\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u036b\3\2"+
"\2\2\u0369\u0367\3\2\2\2\u036a\u036c\t\n\2\2\u036b\u036a\3\2\2\2\u036c"+
"\u036d\3\2\2\2\u036d\u036b\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u00ba\3\2"+
"\2\2\u036f\u0371\t\13\2\2\u0370\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372"+
"\u0370\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0374\3\2\2\2\u0374\u0375\b^"+
"\2\2\u0375\u00bc\3\2\2\2\u0376\u0377\7\61\2\2\u0377\u0378\7\61\2\2\u0378"+
"\u037c\3\2\2\2\u0379\u037b\n\f\2\2\u037a\u0379\3\2\2\2\u037b\u037e\3\2"+
"\2\2\u037c\u037a\3\2\2\2\u037c\u037d\3\2\2\2\u037d\u037f\3\2\2\2\u037e"+
"\u037c\3\2\2\2\u037f\u0380\b_\3\2\u0380\u00be\3\2\2\2\u0381\u0382\7\61"+
"\2\2\u0382\u0383\7,\2\2\u0383\u0387\3\2\2\2\u0384\u0386\13\2\2\2\u0385"+
"\u0384\3\2\2\2\u0386\u0389\3\2\2\2\u0387\u0388\3\2\2\2\u0387\u0385\3\2"+
"\2\2\u0388\u038a\3\2\2\2\u0389\u0387\3\2\2\2\u038a\u038b\7,\2\2\u038b"+
"\u038c\7\61\2\2\u038c\u038d\3\2\2\2\u038d\u038e\b`\3\2\u038e\u00c0\3\2"+
"\2\2!\2\u02af\u02b7\u02d2\u02d8\u02da\u02e3\u02f0\u02f4\u02f9\u0300\u0305"+
"\u030c\u0311\u0318\u031f\u0324\u032b\u0330\u0337\u033d\u033f\u0344\u034b"+
"\u0350\u035c\u0367\u036d\u0372\u037c\u0387\4\2\3\2\2\4\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -99,7 +99,7 @@ COMMENT_BLOCK=90
','=9
'resource'=10
'uses'=11
'clobber'=12
'clobbers'=12
'param'=13
':'=14
'bytes'=15

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7
// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7
package dk.camelot64.kickc.parser;
import org.antlr.v4.runtime.tree.ParseTreeListener;
@ -747,6 +747,28 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitParameterList(KickCParser.ParameterListContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#asmDirectives}.
* @param ctx the parse tree
*/
void enterAsmDirectives(KickCParser.AsmDirectivesContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#asmDirectives}.
* @param ctx the parse tree
*/
void exitAsmDirectives(KickCParser.AsmDirectivesContext ctx);
/**
* Enter a parse tree produced by the {@code asmDirectiveClobber}
* labeled alternative in {@link KickCParser#asmDirective}.
* @param ctx the parse tree
*/
void enterAsmDirectiveClobber(KickCParser.AsmDirectiveClobberContext ctx);
/**
* Exit a parse tree produced by the {@code asmDirectiveClobber}
* labeled alternative in {@link KickCParser#asmDirective}.
* @param ctx the parse tree
*/
void exitAsmDirectiveClobber(KickCParser.AsmDirectiveClobberContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#asmLines}.
* @param ctx the parse tree

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7
// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7
package dk.camelot64.kickc.parser;
import org.antlr.v4.runtime.tree.ParseTreeVisitor;
@ -444,6 +444,19 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitParameterList(KickCParser.ParameterListContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#asmDirectives}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitAsmDirectives(KickCParser.AsmDirectivesContext ctx);
/**
* Visit a parse tree produced by the {@code asmDirectiveClobber}
* labeled alternative in {@link KickCParser#asmDirective}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitAsmDirectiveClobber(KickCParser.AsmDirectiveClobberContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#asmLines}.
* @param ctx the parse tree

View File

@ -2,6 +2,8 @@ package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.Compiler;
import dk.camelot64.kickc.NumberParser;
import dk.camelot64.kickc.asm.AsmClobber;
import dk.camelot64.kickc.asm.AsmDataString;
import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.operators.Operator;
import dk.camelot64.kickc.model.operators.Operators;
@ -16,7 +18,6 @@ import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNode;
import sun.reflect.generics.tree.VoidDescriptor;
import java.io.File;
import java.nio.file.Path;
@ -730,15 +731,69 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
@Override
public Object visitStmtAsm(KickCParser.StmtAsmContext ctx) {
// Find all defined labels in the ASM
List<String> definedLabels = gatAsmDefinedLabels(ctx);
List<String> definedLabels = getAsmDefinedLabels(ctx);
// Find all referenced symbols in the ASM
Map<String, SymbolVariableRef> referenced = getAsmReferencedSymbolVariables(ctx, definedLabels);
List<Comment> comments = ensureUnusedComments(getCommentsSymbol(ctx));
StatementAsm statementAsm = new StatementAsm(ctx.asmLines(), referenced, new StatementSource(ctx), comments);
AsmClobber declaredClobber = null;
if(ctx.asmDirectives() != null) {
List<AsmDirective> asmDirectives = this.visitAsmDirectives(ctx.asmDirectives());
for(AsmDirective asmDirective : asmDirectives) {
if(asmDirective instanceof AsmDirectiveClobber) {
declaredClobber = ((AsmDirectiveClobber) asmDirective).getClobber();
}
}
}
StatementAsm statementAsm = new StatementAsm(ctx.asmLines(), referenced, declaredClobber, new StatementSource(ctx), comments);
sequence.addStatement(statementAsm);
return null;
}
@Override
public List<AsmDirective> visitAsmDirectives(KickCParser.AsmDirectivesContext ctx) {
ArrayList<AsmDirective> asmDirectives = new ArrayList<>();
List<KickCParser.AsmDirectiveContext> params = ctx.asmDirective();
for(KickCParser.AsmDirectiveContext param : params) {
AsmDirective directive = (AsmDirective) visit(param);
if(directive != null) {
asmDirectives.add(directive);
}
}
return asmDirectives;
}
/** Directives for inline ASM. */
private interface AsmDirective {
}
/** ASM Directive specifying clobber registers. */
private class AsmDirectiveClobber implements AsmDirective {
private AsmClobber clobber;
public AsmDirectiveClobber(AsmClobber clobber) {
this.clobber = clobber;
}
public AsmClobber getClobber() {
return clobber;
}
}
@Override
public AsmDirectiveClobber visitAsmDirectiveClobber(KickCParser.AsmDirectiveClobberContext ctx) {
String clobberString = ctx.STRING().getText().toUpperCase();
clobberString = clobberString.substring(1, clobberString.length()-1);
if(!clobberString.matches("[AXY]*")) {
throw new CompileError("Error! Illegal clobber value " + clobberString, new StatementSource(ctx));
}
AsmClobber clobber = new AsmClobber();
clobber.setClobberA(clobberString.contains("A"));
clobber.setClobberX(clobberString.contains("X"));
clobber.setClobberY(clobberString.contains("Y"));
return new AsmDirectiveClobber(clobber);
}
/**
* Find all referenced symbol variables
* @param ctx An ASM statement
@ -787,7 +842,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
* @param ctx An ASM statement
* @return All labels defined in the ASM.
*/
private List<String> gatAsmDefinedLabels(KickCParser.StmtAsmContext ctx) {
private List<String> getAsmDefinedLabels(KickCParser.StmtAsmContext ctx) {
List<String> definedLabels = new ArrayList<>();
KickCBaseVisitor<Void> findDefinedLabels = new KickCBaseVisitor<Void>() {
@Override

View File

@ -544,6 +544,20 @@ public class Pass4CodeGeneration {
HashMap<String, Value> bindings = new HashMap<>();
AsmFragmentInstance asmFragmentInstance = new AsmFragmentInstance(program, "inline", block.getScope(), new AsmFragmentTemplate(statementAsm.getAsmLines()), bindings);
asmFragmentInstance.generate(asm);
AsmSegment currentSegment = asm.getCurrentSegment();
if(statementAsm.getDeclaredClobber()!=null) {
currentSegment.setClobberOverwrite(statementAsm.getDeclaredClobber());
} else {
for(AsmLine asmLine : currentSegment.getLines()) {
if(asmLine instanceof AsmInstruction) {
AsmInstruction asmInstruction = (AsmInstruction) asmLine;
if(asmInstruction.getType().getMnemnonic().equals("jsr")) {
currentSegment.setClobberOverwrite(AsmClobber.CLOBBER_ALL);
}
}
}
}
} else if(statement instanceof StatementKickAsm) {
StatementKickAsm statementKasm = (StatementKickAsm) statement;
if(statementKasm.getLocation() == null) {

View File

@ -41,7 +41,7 @@ word getFAC() {
// ARG = FAC
// Set the ARG (floating point argument) to the value of the FAC (floating point accumulator)
void setARGtoFAC() {
asm {
asm(clobbers "AX") {
jsr $bc0f
}
}
@ -49,7 +49,7 @@ void setARGtoFAC() {
// FAC = ARG
// Set the FAC (floating point accumulator) to the value of the ARG (floating point argument)
void setFACtoARG() {
asm {
asm(clobbers "AX") {
jsr $bbfc
}
}
@ -71,7 +71,7 @@ void setMEMtoFAC(byte* mem) {
// Reads 5 bytes
void setFACtoMEM(byte* mem) {
prepareMEM(mem);
asm {
asm(clobbers "AY") {
lda $fe
ldy $ff
jsr $bba2
@ -82,7 +82,7 @@ void setFACtoMEM(byte* mem) {
// Set the FAC to PI/2
// Reads 5 bytes from the BASIC ROM
void setFACtoPIhalf() {
asm {
asm(clobbers "AY") {
lda #$e0
ldy #$e2
jsr $bba2
@ -93,7 +93,7 @@ void setFACtoPIhalf() {
// Set the FAC to 2*PI
// Reads 5 bytes from the BASIC ROM
void setFACto2PI() {
asm {
asm(clobbers "AY"){
lda #$e5
ldy #$e2
jsr $bba2
@ -105,7 +105,7 @@ void setFACto2PI() {
// Reads 5 bytes
void setARGtoMEM(byte* mem) {
prepareMEM(mem);
asm {
asm(clobbers "AY") {
lda $fe
ldy $ff
jsr $ba8c

View File

@ -44,6 +44,16 @@ public class TestPrograms {
AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
}
@Test
public void testInlineAsmClobberNone() throws IOException, URISyntaxException {
compileAndCompare("inline-asm-clobber-none");
}
@Test
public void testInlineAsmJsrClobber() throws IOException, URISyntaxException {
compileAndCompare("inline-asm-jsr-clobber");
}
@Test
public void testComplexConditionalProblem() throws IOException, URISyntaxException {
compileAndCompare("complex-conditional-problem");
@ -1006,7 +1016,7 @@ public class TestPrograms {
@Test
public void testAsmClobber() throws IOException, URISyntaxException {
compileAndCompare("asm-clobber");
compileAndCompare("inline-asm-clobber");
}
@Test
@ -1351,17 +1361,25 @@ public class TestPrograms {
private void compileAndCompare(String filename) throws IOException, URISyntaxException {
TestPrograms tester = new TestPrograms();
tester.testFile(filename, null);
tester.testFile(filename, null, null);
}
private void compileAndCompare(String filename, CompileLog compileLog) throws IOException, URISyntaxException {
TestPrograms tester = new TestPrograms();
tester.testFile(filename, null, compileLog);
}
private void compileAndCompare(String filename, int upliftCombinations) throws IOException, URISyntaxException {
TestPrograms tester = new TestPrograms();
tester.testFile(filename, upliftCombinations);
tester.testFile(filename, upliftCombinations, null);
}
private void testFile(String fileName, Integer upliftCombinations) throws IOException, URISyntaxException {
private void testFile(String fileName, Integer upliftCombinations, CompileLog compileLog) throws IOException, URISyntaxException {
System.out.println("Testing output for " + fileName);
Compiler compiler = new Compiler();
if(compileLog!=null) {
compiler.setLog(compileLog);
}
compiler.addImportPath(stdlibPath);
compiler.addImportPath(testPath);
if(upliftCombinations != null) {

View File

@ -184,12 +184,6 @@ void gen_sintab(byte* sintab, byte length, byte min, byte max) {
byte* f_2pi = $e2e5; // 2 * PI
setFAC((word)max); // fac = max
setARGtoFAC(); // arg = max
// TODO: Kernel JSR clobbers A,X,Y
asm {
lda #0
ldx #0
ldy #0
}
setFAC((word)min); // fac = min
setMEMtoFAC(f_min); // f_min = min
subFACfromARG(); // fac = max - min

View File

@ -0,0 +1,23 @@
// Tests that inline ASM JSR clobbers all registers
byte* SCREEN = $0400;
void main() {
for( byte i:0..10) {
for( byte j:0..10) {
for( byte k:0..10) {
asm(clobbers "") {
pha
txa
pha
tya
pha
jsr $e544
pla
tay
pla
tax
pla
}
}
}
}
}

View File

@ -0,0 +1,9 @@
// Tests that inline ASM JSR clobbers all registers
byte* SCREEN = $0400;
void main() {
for( byte i:0..10) {
asm {
jsr $e544
}
}
}

View File

@ -209,14 +209,9 @@ gen_sintab: {
sta setFAC.w+1
jsr setFAC
jsr setARGtoFAC
// arg = max
// TODO: Kernel JSR clobbers A,X,Y
lda #0
tax
tay
lda min
sta setFAC.w
txa
lda #0
sta setFAC.w+1
jsr setFAC
lda #<f_min

View File

@ -148,314 +148,313 @@ gen_sintab::@3: scope:[gen_sintab] from gen_sintab
[75] call setARGtoFAC
to:gen_sintab::@4
gen_sintab::@4: scope:[gen_sintab] from gen_sintab::@3
asm { lda#0 ldx#0 ldy#0 }
[77] (word) setFAC::w#1 ← ((word)) (byte) gen_sintab::min#2
[78] call setFAC
[76] (word) setFAC::w#1 ← ((word)) (byte) gen_sintab::min#2
[77] call setFAC
to:gen_sintab::@5
gen_sintab::@5: scope:[gen_sintab] from gen_sintab::@4
[79] phi()
[80] call setMEMtoFAC
[78] phi()
[79] call setMEMtoFAC
to:gen_sintab::@6
gen_sintab::@6: scope:[gen_sintab] from gen_sintab::@5
[81] phi()
[82] call subFACfromARG
[80] phi()
[81] call subFACfromARG
to:gen_sintab::@7
gen_sintab::@7: scope:[gen_sintab] from gen_sintab::@6
[83] phi()
[84] call setMEMtoFAC
[82] phi()
[83] call setMEMtoFAC
to:gen_sintab::@8
gen_sintab::@8: scope:[gen_sintab] from gen_sintab::@7
[85] phi()
[86] call setFAC
[84] phi()
[85] call setFAC
to:gen_sintab::@9
gen_sintab::@9: scope:[gen_sintab] from gen_sintab::@8
[87] phi()
[88] call divMEMbyFAC
[86] phi()
[87] call divMEMbyFAC
to:gen_sintab::@10
gen_sintab::@10: scope:[gen_sintab] from gen_sintab::@9
[89] phi()
[90] call setMEMtoFAC
[88] phi()
[89] call setMEMtoFAC
to:gen_sintab::@11
gen_sintab::@11: scope:[gen_sintab] from gen_sintab::@10
[91] phi()
[92] call addMEMtoFAC
[90] phi()
[91] call addMEMtoFAC
to:gen_sintab::@12
gen_sintab::@12: scope:[gen_sintab] from gen_sintab::@11
[93] phi()
[94] call setMEMtoFAC
[92] phi()
[93] call setMEMtoFAC
to:gen_sintab::@1
gen_sintab::@1: scope:[gen_sintab] from gen_sintab::@12 gen_sintab::@23
[95] (byte*) progress_cursor#34 ← phi( gen_sintab::@12/(byte*) progress_init::line#2 gen_sintab::@23/(byte*) progress_cursor#11 )
[95] (byte) progress_idx#34 ← phi( gen_sintab::@12/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_sintab::@23/(byte) progress_idx#12 )
[95] (byte) gen_sintab::i#10 ← phi( gen_sintab::@12/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_sintab::@23/(byte) gen_sintab::i#1 )
[96] (word) setFAC::w#3 ← ((word)) (byte) gen_sintab::i#10
[97] call setFAC
[94] (byte*) progress_cursor#34 ← phi( gen_sintab::@12/(byte*) progress_init::line#2 gen_sintab::@23/(byte*) progress_cursor#11 )
[94] (byte) progress_idx#34 ← phi( gen_sintab::@12/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_sintab::@23/(byte) progress_idx#12 )
[94] (byte) gen_sintab::i#10 ← phi( gen_sintab::@12/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_sintab::@23/(byte) gen_sintab::i#1 )
[95] (word) setFAC::w#3 ← ((word)) (byte) gen_sintab::i#10
[96] call setFAC
to:gen_sintab::@14
gen_sintab::@14: scope:[gen_sintab] from gen_sintab::@1
[98] phi()
[99] call mulFACbyMEM
[97] phi()
[98] call mulFACbyMEM
to:gen_sintab::@15
gen_sintab::@15: scope:[gen_sintab] from gen_sintab::@14
[100] phi()
[101] call setMEMtoFAC
[99] phi()
[100] call setMEMtoFAC
to:gen_sintab::@16
gen_sintab::@16: scope:[gen_sintab] from gen_sintab::@15
[102] (word) setFAC::w#4 ← ((word)) (byte) gen_sintab::length#10
[103] call setFAC
[101] (word) setFAC::w#4 ← ((word)) (byte) gen_sintab::length#10
[102] call setFAC
to:gen_sintab::@17
gen_sintab::@17: scope:[gen_sintab] from gen_sintab::@16
[104] phi()
[105] call divMEMbyFAC
[103] phi()
[104] call divMEMbyFAC
to:gen_sintab::@18
gen_sintab::@18: scope:[gen_sintab] from gen_sintab::@17
[106] phi()
[107] call sinFAC
[105] phi()
[106] call sinFAC
to:gen_sintab::@19
gen_sintab::@19: scope:[gen_sintab] from gen_sintab::@18
[108] phi()
[109] call mulFACbyMEM
[107] phi()
[108] call mulFACbyMEM
to:gen_sintab::@20
gen_sintab::@20: scope:[gen_sintab] from gen_sintab::@19
[110] phi()
[111] call addMEMtoFAC
[109] phi()
[110] call addMEMtoFAC
to:gen_sintab::@21
gen_sintab::@21: scope:[gen_sintab] from gen_sintab::@20
[112] phi()
[113] call getFAC
[114] (word) getFAC::return#2 ← (word) getFAC::return#0
[111] phi()
[112] call getFAC
[113] (word) getFAC::return#2 ← (word) getFAC::return#0
to:gen_sintab::@22
gen_sintab::@22: scope:[gen_sintab] from gen_sintab::@21
[115] (word~) gen_sintab::$23 ← (word) getFAC::return#2
[116] (byte~) gen_sintab::$24 ← ((byte)) (word~) gen_sintab::$23
[117] *((byte*) gen_sintab::sintab#12 + (byte) gen_sintab::i#10) ← (byte~) gen_sintab::$24
[118] call progress_inc
[114] (word~) gen_sintab::$23 ← (word) getFAC::return#2
[115] (byte~) gen_sintab::$24 ← ((byte)) (word~) gen_sintab::$23
[116] *((byte*) gen_sintab::sintab#12 + (byte) gen_sintab::i#10) ← (byte~) gen_sintab::$24
[117] call progress_inc
to:gen_sintab::@23
gen_sintab::@23: scope:[gen_sintab] from gen_sintab::@22
[119] (byte) gen_sintab::i#1 ← ++ (byte) gen_sintab::i#10
[120] if((byte) gen_sintab::i#1<(byte) gen_sintab::length#10) goto gen_sintab::@1
[118] (byte) gen_sintab::i#1 ← ++ (byte) gen_sintab::i#10
[119] if((byte) gen_sintab::i#1<(byte) gen_sintab::length#10) goto gen_sintab::@1
to:gen_sintab::@return
gen_sintab::@return: scope:[gen_sintab] from gen_sintab::@23
[121] return
[120] return
to:@return
progress_inc: scope:[progress_inc] from gen_sintab::@22
[122] (byte) progress_idx#10 ← ++ (byte) progress_idx#34
[123] if((byte) progress_idx#10!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto progress_inc::@1
[121] (byte) progress_idx#10 ← ++ (byte) progress_idx#34
[122] if((byte) progress_idx#10!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto progress_inc::@1
to:progress_inc::@2
progress_inc::@2: scope:[progress_inc] from progress_inc
[124] *((byte*) progress_cursor#34) ← *((const byte[]) progress_inc::progress_chars#0+(byte/signed byte/word/signed word/dword/signed dword) 8)
[125] (byte*) progress_cursor#10 ← ++ (byte*) progress_cursor#34
[123] *((byte*) progress_cursor#34) ← *((const byte[]) progress_inc::progress_chars#0+(byte/signed byte/word/signed word/dword/signed dword) 8)
[124] (byte*) progress_cursor#10 ← ++ (byte*) progress_cursor#34
to:progress_inc::@1
progress_inc::@1: scope:[progress_inc] from progress_inc progress_inc::@2
[126] (byte*) progress_cursor#11 ← phi( progress_inc/(byte*) progress_cursor#34 progress_inc::@2/(byte*) progress_cursor#10 )
[126] (byte) progress_idx#12 ← phi( progress_inc/(byte) progress_idx#10 progress_inc::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[127] *((byte*) progress_cursor#11) ← *((const byte[]) progress_inc::progress_chars#0 + (byte) progress_idx#12)
[125] (byte*) progress_cursor#11 ← phi( progress_inc/(byte*) progress_cursor#34 progress_inc::@2/(byte*) progress_cursor#10 )
[125] (byte) progress_idx#12 ← phi( progress_inc/(byte) progress_idx#10 progress_inc::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[126] *((byte*) progress_cursor#11) ← *((const byte[]) progress_inc::progress_chars#0 + (byte) progress_idx#12)
to:progress_inc::@return
progress_inc::@return: scope:[progress_inc] from progress_inc::@1
[128] return
[127] return
to:@return
getFAC: scope:[getFAC] from gen_sintab::@21
asm { jsr$b1aa sty$fe sta$ff }
[130] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0)
[129] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0)
to:getFAC::@return
getFAC::@return: scope:[getFAC] from getFAC
[131] return
[130] return
to:@return
addMEMtoFAC: scope:[addMEMtoFAC] from gen_sintab::@11 gen_sintab::@20
[132] phi()
[133] call prepareMEM
[131] phi()
[132] call prepareMEM
to:addMEMtoFAC::@1
addMEMtoFAC::@1: scope:[addMEMtoFAC] from addMEMtoFAC
asm { lda$fe ldy$ff jsr$b867 }
to:addMEMtoFAC::@return
addMEMtoFAC::@return: scope:[addMEMtoFAC] from addMEMtoFAC::@1
[135] return
[134] return
to:@return
prepareMEM: scope:[prepareMEM] from addMEMtoFAC divMEMbyFAC mulFACbyMEM setFAC setMEMtoFAC
[136] (byte*) prepareMEM::mem#5 ← phi( addMEMtoFAC/(const byte[]) gen_sintab::f_min#0 divMEMbyFAC/(byte*) prepareMEM::mem#3 mulFACbyMEM/(byte*) prepareMEM::mem#4 setFAC/(byte*~) prepareMEM::mem#8 setMEMtoFAC/(byte*) prepareMEM::mem#1 )
[137] (byte~) prepareMEM::$0 ← < (byte*) prepareMEM::mem#5
[138] *((const byte*) memLo#0) ← (byte~) prepareMEM::$0
[139] (byte~) prepareMEM::$1 ← > (byte*) prepareMEM::mem#5
[140] *((const byte*) memHi#0) ← (byte~) prepareMEM::$1
[135] (byte*) prepareMEM::mem#5 ← phi( addMEMtoFAC/(const byte[]) gen_sintab::f_min#0 divMEMbyFAC/(byte*) prepareMEM::mem#3 mulFACbyMEM/(byte*) prepareMEM::mem#4 setFAC/(byte*~) prepareMEM::mem#8 setMEMtoFAC/(byte*) prepareMEM::mem#1 )
[136] (byte~) prepareMEM::$0 ← < (byte*) prepareMEM::mem#5
[137] *((const byte*) memLo#0) ← (byte~) prepareMEM::$0
[138] (byte~) prepareMEM::$1 ← > (byte*) prepareMEM::mem#5
[139] *((const byte*) memHi#0) ← (byte~) prepareMEM::$1
to:prepareMEM::@return
prepareMEM::@return: scope:[prepareMEM] from prepareMEM
[141] return
[140] return
to:@return
mulFACbyMEM: scope:[mulFACbyMEM] from gen_sintab::@14 gen_sintab::@19
[142] (byte*) mulFACbyMEM::mem#2 ← phi( gen_sintab::@14/(const byte*) gen_sintab::f_2pi#0 gen_sintab::@19/(const byte[]) gen_sintab::f_amp#0 )
[143] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2
[144] call prepareMEM
[141] (byte*) mulFACbyMEM::mem#2 ← phi( gen_sintab::@14/(const byte*) gen_sintab::f_2pi#0 gen_sintab::@19/(const byte[]) gen_sintab::f_amp#0 )
[142] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2
[143] call prepareMEM
to:mulFACbyMEM::@1
mulFACbyMEM::@1: scope:[mulFACbyMEM] from mulFACbyMEM
asm { lda$fe ldy$ff jsr$ba28 }
to:mulFACbyMEM::@return
mulFACbyMEM::@return: scope:[mulFACbyMEM] from mulFACbyMEM::@1
[146] return
[145] return
to:@return
sinFAC: scope:[sinFAC] from gen_sintab::@18
asm { jsr$e26b }
to:sinFAC::@return
sinFAC::@return: scope:[sinFAC] from sinFAC
[148] return
[147] return
to:@return
divMEMbyFAC: scope:[divMEMbyFAC] from gen_sintab::@17 gen_sintab::@9
[149] (byte*) divMEMbyFAC::mem#2 ← phi( gen_sintab::@17/(const byte[]) gen_sintab::f_i#0 gen_sintab::@9/(const byte[]) gen_sintab::f_amp#0 )
[150] (byte*) prepareMEM::mem#3 ← (byte*) divMEMbyFAC::mem#2
[151] call prepareMEM
[148] (byte*) divMEMbyFAC::mem#2 ← phi( gen_sintab::@17/(const byte[]) gen_sintab::f_i#0 gen_sintab::@9/(const byte[]) gen_sintab::f_amp#0 )
[149] (byte*) prepareMEM::mem#3 ← (byte*) divMEMbyFAC::mem#2
[150] call prepareMEM
to:divMEMbyFAC::@1
divMEMbyFAC::@1: scope:[divMEMbyFAC] from divMEMbyFAC
asm { lda$fe ldy$ff jsr$bb0f }
to:divMEMbyFAC::@return
divMEMbyFAC::@return: scope:[divMEMbyFAC] from divMEMbyFAC::@1
[153] return
[152] return
to:@return
setFAC: scope:[setFAC] from gen_sintab gen_sintab::@1 gen_sintab::@16 gen_sintab::@4 gen_sintab::@8
[154] (word) setFAC::w#5 ← phi( gen_sintab/(word) setFAC::w#0 gen_sintab::@1/(word) setFAC::w#3 gen_sintab::@16/(word) setFAC::w#4 gen_sintab::@4/(word) setFAC::w#1 gen_sintab::@8/(byte/signed byte/word/signed word/dword/signed dword) 2 )
[155] (byte*~) prepareMEM::mem#8 ← (byte*)(word) setFAC::w#5
[156] call prepareMEM
[153] (word) setFAC::w#5 ← phi( gen_sintab/(word) setFAC::w#0 gen_sintab::@1/(word) setFAC::w#3 gen_sintab::@16/(word) setFAC::w#4 gen_sintab::@4/(word) setFAC::w#1 gen_sintab::@8/(byte/signed byte/word/signed word/dword/signed dword) 2 )
[154] (byte*~) prepareMEM::mem#8 ← (byte*)(word) setFAC::w#5
[155] call prepareMEM
to:setFAC::@1
setFAC::@1: scope:[setFAC] from setFAC
asm { ldy$fe lda$ff jsr$b391 }
to:setFAC::@return
setFAC::@return: scope:[setFAC] from setFAC::@1
[158] return
[157] return
to:@return
setMEMtoFAC: scope:[setMEMtoFAC] from gen_sintab::@10 gen_sintab::@12 gen_sintab::@15 gen_sintab::@5 gen_sintab::@7
[159] (byte*) setMEMtoFAC::mem#5 ← phi( gen_sintab::@10/(const byte[]) gen_sintab::f_amp#0 gen_sintab::@12/(const byte[]) gen_sintab::f_min#0 gen_sintab::@15/(const byte[]) gen_sintab::f_i#0 gen_sintab::@5/(const byte[]) gen_sintab::f_min#0 gen_sintab::@7/(const byte[]) gen_sintab::f_amp#0 )
[160] (byte*) prepareMEM::mem#1 ← (byte*) setMEMtoFAC::mem#5
[161] call prepareMEM
[158] (byte*) setMEMtoFAC::mem#5 ← phi( gen_sintab::@10/(const byte[]) gen_sintab::f_amp#0 gen_sintab::@12/(const byte[]) gen_sintab::f_min#0 gen_sintab::@15/(const byte[]) gen_sintab::f_i#0 gen_sintab::@5/(const byte[]) gen_sintab::f_min#0 gen_sintab::@7/(const byte[]) gen_sintab::f_amp#0 )
[159] (byte*) prepareMEM::mem#1 ← (byte*) setMEMtoFAC::mem#5
[160] call prepareMEM
to:setMEMtoFAC::@1
setMEMtoFAC::@1: scope:[setMEMtoFAC] from setMEMtoFAC
asm { ldx$fe ldy$ff jsr$bbd4 }
to:setMEMtoFAC::@return
setMEMtoFAC::@return: scope:[setMEMtoFAC] from setMEMtoFAC::@1
[163] return
[162] return
to:@return
subFACfromARG: scope:[subFACfromARG] from gen_sintab::@6
asm { jsr$b853 }
to:subFACfromARG::@return
subFACfromARG::@return: scope:[subFACfromARG] from subFACfromARG
[165] return
[164] return
to:@return
setARGtoFAC: scope:[setARGtoFAC] from gen_sintab::@3
asm { jsr$bc0f }
to:setARGtoFAC::@return
setARGtoFAC::@return: scope:[setARGtoFAC] from setARGtoFAC
[167] return
[166] return
to:@return
progress_init: scope:[progress_init] from init::@5 init::@7
[168] (byte*) progress_init::line#2 ← phi( init::@5/(const byte*) SCREEN#0 init::@7/(const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 )
[167] (byte*) progress_init::line#2 ← phi( init::@5/(const byte*) SCREEN#0 init::@7/(const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28 )
to:progress_init::@return
progress_init::@return: scope:[progress_init] from progress_init
[169] return
[168] return
to:@return
gen_sprites: scope:[gen_sprites] from init::@4
[170] phi()
[169] phi()
to:gen_sprites::@1
gen_sprites::@1: scope:[gen_sprites] from gen_sprites gen_sprites::@3
[171] (byte*) gen_sprites::spr#2 ← phi( gen_sprites/(const byte*) sprites#0 gen_sprites::@3/(byte*) gen_sprites::spr#1 )
[171] (byte) gen_sprites::i#2 ← phi( gen_sprites/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_sprites::@3/(byte) gen_sprites::i#1 )
[172] (byte) gen_chargen_sprite::ch#0 ← *((const byte[]) gen_sprites::cml#0 + (byte) gen_sprites::i#2)
[173] (byte*) gen_chargen_sprite::sprite#0 ← (byte*) gen_sprites::spr#2
[174] call gen_chargen_sprite
[170] (byte*) gen_sprites::spr#2 ← phi( gen_sprites/(const byte*) sprites#0 gen_sprites::@3/(byte*) gen_sprites::spr#1 )
[170] (byte) gen_sprites::i#2 ← phi( gen_sprites/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_sprites::@3/(byte) gen_sprites::i#1 )
[171] (byte) gen_chargen_sprite::ch#0 ← *((const byte[]) gen_sprites::cml#0 + (byte) gen_sprites::i#2)
[172] (byte*) gen_chargen_sprite::sprite#0 ← (byte*) gen_sprites::spr#2
[173] call gen_chargen_sprite
to:gen_sprites::@3
gen_sprites::@3: scope:[gen_sprites] from gen_sprites::@1
[175] (byte*) gen_sprites::spr#1 ← (byte*) gen_sprites::spr#2 + (byte/signed byte/word/signed word/dword/signed dword) $40
[176] (byte) gen_sprites::i#1 ← ++ (byte) gen_sprites::i#2
[177] if((byte) gen_sprites::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto gen_sprites::@1
[174] (byte*) gen_sprites::spr#1 ← (byte*) gen_sprites::spr#2 + (byte/signed byte/word/signed word/dword/signed dword) $40
[175] (byte) gen_sprites::i#1 ← ++ (byte) gen_sprites::i#2
[176] if((byte) gen_sprites::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto gen_sprites::@1
to:gen_sprites::@return
gen_sprites::@return: scope:[gen_sprites] from gen_sprites::@3
[178] return
[177] return
to:@return
gen_chargen_sprite: scope:[gen_chargen_sprite] from gen_sprites::@1
[179] (word~) gen_chargen_sprite::$0 ← ((word)) (byte) gen_chargen_sprite::ch#0
[180] (word~) gen_chargen_sprite::$1 ← (word~) gen_chargen_sprite::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3
[181] (byte*) gen_chargen_sprite::chargen#0 ← (const byte*) CHARGEN#0 + (word~) gen_chargen_sprite::$1
[178] (word~) gen_chargen_sprite::$0 ← ((word)) (byte) gen_chargen_sprite::ch#0
[179] (word~) gen_chargen_sprite::$1 ← (word~) gen_chargen_sprite::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3
[180] (byte*) gen_chargen_sprite::chargen#0 ← (const byte*) CHARGEN#0 + (word~) gen_chargen_sprite::$1
asm { sei }
[183] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32
[182] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32
to:gen_chargen_sprite::@1
gen_chargen_sprite::@1: scope:[gen_chargen_sprite] from gen_chargen_sprite gen_chargen_sprite::@9
[184] (byte*) gen_chargen_sprite::sprite#11 ← phi( gen_chargen_sprite/(byte*) gen_chargen_sprite::sprite#0 gen_chargen_sprite::@9/(byte*) gen_chargen_sprite::sprite#2 )
[184] (byte) gen_chargen_sprite::y#2 ← phi( gen_chargen_sprite/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@9/(byte) gen_chargen_sprite::y#1 )
[185] (byte) gen_chargen_sprite::bits#0 ← *((byte*) gen_chargen_sprite::chargen#0 + (byte) gen_chargen_sprite::y#2)
[183] (byte*) gen_chargen_sprite::sprite#11 ← phi( gen_chargen_sprite/(byte*) gen_chargen_sprite::sprite#0 gen_chargen_sprite::@9/(byte*) gen_chargen_sprite::sprite#2 )
[183] (byte) gen_chargen_sprite::y#2 ← phi( gen_chargen_sprite/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@9/(byte) gen_chargen_sprite::y#1 )
[184] (byte) gen_chargen_sprite::bits#0 ← *((byte*) gen_chargen_sprite::chargen#0 + (byte) gen_chargen_sprite::y#2)
to:gen_chargen_sprite::@2
gen_chargen_sprite::@2: scope:[gen_chargen_sprite] from gen_chargen_sprite::@1 gen_chargen_sprite::@8
[186] (byte) gen_chargen_sprite::x#6 ← phi( gen_chargen_sprite::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::x#1 )
[186] (byte*) gen_chargen_sprite::sprite#10 ← phi( gen_chargen_sprite::@1/(byte*) gen_chargen_sprite::sprite#11 gen_chargen_sprite::@8/(byte*) gen_chargen_sprite::sprite#4 )
[186] (byte) gen_chargen_sprite::s_gen_cnt#4 ← phi( gen_chargen_sprite::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::s_gen_cnt#5 )
[186] (byte) gen_chargen_sprite::s_gen#5 ← phi( gen_chargen_sprite::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::s_gen#6 )
[186] (byte) gen_chargen_sprite::bits#2 ← phi( gen_chargen_sprite::@1/(byte) gen_chargen_sprite::bits#0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::bits#1 )
[187] (byte~) gen_chargen_sprite::$3 ← (byte) gen_chargen_sprite::bits#2 & (byte/word/signed word/dword/signed dword) $80
[188] if((byte~) gen_chargen_sprite::$3==(byte/signed byte/word/signed word/dword/signed dword) 0) goto gen_chargen_sprite::@3
[185] (byte) gen_chargen_sprite::x#6 ← phi( gen_chargen_sprite::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::x#1 )
[185] (byte*) gen_chargen_sprite::sprite#10 ← phi( gen_chargen_sprite::@1/(byte*) gen_chargen_sprite::sprite#11 gen_chargen_sprite::@8/(byte*) gen_chargen_sprite::sprite#4 )
[185] (byte) gen_chargen_sprite::s_gen_cnt#4 ← phi( gen_chargen_sprite::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::s_gen_cnt#5 )
[185] (byte) gen_chargen_sprite::s_gen#5 ← phi( gen_chargen_sprite::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::s_gen#6 )
[185] (byte) gen_chargen_sprite::bits#2 ← phi( gen_chargen_sprite::@1/(byte) gen_chargen_sprite::bits#0 gen_chargen_sprite::@8/(byte) gen_chargen_sprite::bits#1 )
[186] (byte~) gen_chargen_sprite::$3 ← (byte) gen_chargen_sprite::bits#2 & (byte/word/signed word/dword/signed dword) $80
[187] if((byte~) gen_chargen_sprite::$3==(byte/signed byte/word/signed word/dword/signed dword) 0) goto gen_chargen_sprite::@3
to:gen_chargen_sprite::@6
gen_chargen_sprite::@6: scope:[gen_chargen_sprite] from gen_chargen_sprite::@2
[189] phi()
[188] phi()
to:gen_chargen_sprite::@3
gen_chargen_sprite::@3: scope:[gen_chargen_sprite] from gen_chargen_sprite::@2 gen_chargen_sprite::@6
[190] (byte) gen_chargen_sprite::c#3 ← phi( gen_chargen_sprite::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@6/(byte/signed byte/word/signed word/dword/signed dword) 1 )
[189] (byte) gen_chargen_sprite::c#3 ← phi( gen_chargen_sprite::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@6/(byte/signed byte/word/signed word/dword/signed dword) 1 )
to:gen_chargen_sprite::@4
gen_chargen_sprite::@4: scope:[gen_chargen_sprite] from gen_chargen_sprite::@3 gen_chargen_sprite::@5
[191] (byte*) gen_chargen_sprite::sprite#3 ← phi( gen_chargen_sprite::@3/(byte*) gen_chargen_sprite::sprite#10 gen_chargen_sprite::@5/(byte*) gen_chargen_sprite::sprite#4 )
[191] (byte) gen_chargen_sprite::b#2 ← phi( gen_chargen_sprite::@3/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@5/(byte) gen_chargen_sprite::b#1 )
[191] (byte) gen_chargen_sprite::s_gen_cnt#3 ← phi( gen_chargen_sprite::@3/(byte) gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::@5/(byte) gen_chargen_sprite::s_gen_cnt#5 )
[191] (byte) gen_chargen_sprite::s_gen#3 ← phi( gen_chargen_sprite::@3/(byte) gen_chargen_sprite::s_gen#5 gen_chargen_sprite::@5/(byte) gen_chargen_sprite::s_gen#6 )
[192] (byte~) gen_chargen_sprite::$6 ← (byte) gen_chargen_sprite::s_gen#3 << (byte/signed byte/word/signed word/dword/signed dword) 1
[193] (byte) gen_chargen_sprite::s_gen#1 ← (byte~) gen_chargen_sprite::$6 | (byte) gen_chargen_sprite::c#3
[194] (byte) gen_chargen_sprite::s_gen_cnt#1 ← ++ (byte) gen_chargen_sprite::s_gen_cnt#3
[195] if((byte) gen_chargen_sprite::s_gen_cnt#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto gen_chargen_sprite::@5
[190] (byte*) gen_chargen_sprite::sprite#3 ← phi( gen_chargen_sprite::@3/(byte*) gen_chargen_sprite::sprite#10 gen_chargen_sprite::@5/(byte*) gen_chargen_sprite::sprite#4 )
[190] (byte) gen_chargen_sprite::b#2 ← phi( gen_chargen_sprite::@3/(byte/signed byte/word/signed word/dword/signed dword) 0 gen_chargen_sprite::@5/(byte) gen_chargen_sprite::b#1 )
[190] (byte) gen_chargen_sprite::s_gen_cnt#3 ← phi( gen_chargen_sprite::@3/(byte) gen_chargen_sprite::s_gen_cnt#4 gen_chargen_sprite::@5/(byte) gen_chargen_sprite::s_gen_cnt#5 )
[190] (byte) gen_chargen_sprite::s_gen#3 ← phi( gen_chargen_sprite::@3/(byte) gen_chargen_sprite::s_gen#5 gen_chargen_sprite::@5/(byte) gen_chargen_sprite::s_gen#6 )
[191] (byte~) gen_chargen_sprite::$6 ← (byte) gen_chargen_sprite::s_gen#3 << (byte/signed byte/word/signed word/dword/signed dword) 1
[192] (byte) gen_chargen_sprite::s_gen#1 ← (byte~) gen_chargen_sprite::$6 | (byte) gen_chargen_sprite::c#3
[193] (byte) gen_chargen_sprite::s_gen_cnt#1 ← ++ (byte) gen_chargen_sprite::s_gen_cnt#3
[194] if((byte) gen_chargen_sprite::s_gen_cnt#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto gen_chargen_sprite::@5
to:gen_chargen_sprite::@7
gen_chargen_sprite::@7: scope:[gen_chargen_sprite] from gen_chargen_sprite::@4
[196] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) gen_chargen_sprite::s_gen#1
[197] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte) gen_chargen_sprite::s_gen#1
[198] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word/dword/signed dword) 6) ← (byte) gen_chargen_sprite::s_gen#1
[199] (byte*) gen_chargen_sprite::sprite#1 ← ++ (byte*) gen_chargen_sprite::sprite#3
[195] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word/dword/signed dword) 0) ← (byte) gen_chargen_sprite::s_gen#1
[196] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word/dword/signed dword) 3) ← (byte) gen_chargen_sprite::s_gen#1
[197] *((byte*) gen_chargen_sprite::sprite#3 + (byte/signed byte/word/signed word/dword/signed dword) 6) ← (byte) gen_chargen_sprite::s_gen#1
[198] (byte*) gen_chargen_sprite::sprite#1 ← ++ (byte*) gen_chargen_sprite::sprite#3
to:gen_chargen_sprite::@5
gen_chargen_sprite::@5: scope:[gen_chargen_sprite] from gen_chargen_sprite::@4 gen_chargen_sprite::@7
[200] (byte*) gen_chargen_sprite::sprite#4 ← phi( gen_chargen_sprite::@4/(byte*) gen_chargen_sprite::sprite#3 gen_chargen_sprite::@7/(byte*) gen_chargen_sprite::sprite#1 )
[200] (byte) gen_chargen_sprite::s_gen_cnt#5 ← phi( gen_chargen_sprite::@4/(byte) gen_chargen_sprite::s_gen_cnt#1 gen_chargen_sprite::@7/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[200] (byte) gen_chargen_sprite::s_gen#6 ← phi( gen_chargen_sprite::@4/(byte) gen_chargen_sprite::s_gen#1 gen_chargen_sprite::@7/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[201] (byte) gen_chargen_sprite::b#1 ← ++ (byte) gen_chargen_sprite::b#2
[202] if((byte) gen_chargen_sprite::b#1!=(byte/signed byte/word/signed word/dword/signed dword) 3) goto gen_chargen_sprite::@4
[199] (byte*) gen_chargen_sprite::sprite#4 ← phi( gen_chargen_sprite::@4/(byte*) gen_chargen_sprite::sprite#3 gen_chargen_sprite::@7/(byte*) gen_chargen_sprite::sprite#1 )
[199] (byte) gen_chargen_sprite::s_gen_cnt#5 ← phi( gen_chargen_sprite::@4/(byte) gen_chargen_sprite::s_gen_cnt#1 gen_chargen_sprite::@7/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[199] (byte) gen_chargen_sprite::s_gen#6 ← phi( gen_chargen_sprite::@4/(byte) gen_chargen_sprite::s_gen#1 gen_chargen_sprite::@7/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[200] (byte) gen_chargen_sprite::b#1 ← ++ (byte) gen_chargen_sprite::b#2
[201] if((byte) gen_chargen_sprite::b#1!=(byte/signed byte/word/signed word/dword/signed dword) 3) goto gen_chargen_sprite::@4
to:gen_chargen_sprite::@8
gen_chargen_sprite::@8: scope:[gen_chargen_sprite] from gen_chargen_sprite::@5
[203] (byte) gen_chargen_sprite::bits#1 ← (byte) gen_chargen_sprite::bits#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[204] (byte) gen_chargen_sprite::x#1 ← ++ (byte) gen_chargen_sprite::x#6
[205] if((byte) gen_chargen_sprite::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto gen_chargen_sprite::@2
[202] (byte) gen_chargen_sprite::bits#1 ← (byte) gen_chargen_sprite::bits#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[203] (byte) gen_chargen_sprite::x#1 ← ++ (byte) gen_chargen_sprite::x#6
[204] if((byte) gen_chargen_sprite::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto gen_chargen_sprite::@2
to:gen_chargen_sprite::@9
gen_chargen_sprite::@9: scope:[gen_chargen_sprite] from gen_chargen_sprite::@8
[206] (byte*) gen_chargen_sprite::sprite#2 ← (byte*) gen_chargen_sprite::sprite#4 + (byte/signed byte/word/signed word/dword/signed dword) 6
[207] (byte) gen_chargen_sprite::y#1 ← ++ (byte) gen_chargen_sprite::y#2
[208] if((byte) gen_chargen_sprite::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto gen_chargen_sprite::@1
[205] (byte*) gen_chargen_sprite::sprite#2 ← (byte*) gen_chargen_sprite::sprite#4 + (byte/signed byte/word/signed word/dword/signed dword) 6
[206] (byte) gen_chargen_sprite::y#1 ← ++ (byte) gen_chargen_sprite::y#2
[207] if((byte) gen_chargen_sprite::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto gen_chargen_sprite::@1
to:gen_chargen_sprite::@10
gen_chargen_sprite::@10: scope:[gen_chargen_sprite] from gen_chargen_sprite::@9
[209] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37
[208] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37
asm { cli }
to:gen_chargen_sprite::@return
gen_chargen_sprite::@return: scope:[gen_chargen_sprite] from gen_chargen_sprite::@10
[211] return
[210] return
to:@return
place_sprites: scope:[place_sprites] from init::@2
[212] *((const byte*) SPRITES_ENABLE#0) ← (byte/signed byte/word/signed word/dword/signed dword) $7f
[213] *((const byte*) SPRITES_EXPAND_X#0) ← (byte/signed byte/word/signed word/dword/signed dword) $7f
[214] *((const byte*) SPRITES_EXPAND_Y#0) ← (byte/signed byte/word/signed word/dword/signed dword) $7f
[211] *((const byte*) SPRITES_ENABLE#0) ← (byte/signed byte/word/signed word/dword/signed dword) $7f
[212] *((const byte*) SPRITES_EXPAND_X#0) ← (byte/signed byte/word/signed word/dword/signed dword) $7f
[213] *((const byte*) SPRITES_EXPAND_Y#0) ← (byte/signed byte/word/signed word/dword/signed dword) $7f
to:place_sprites::@1
place_sprites::@1: scope:[place_sprites] from place_sprites place_sprites::@1
[215] (byte) place_sprites::col#2 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) 5 place_sprites::@1/(byte) place_sprites::col#1 )
[215] (byte) place_sprites::j2#3 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) 0 place_sprites::@1/(byte) place_sprites::j2#2 )
[215] (byte) place_sprites::spr_x#2 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) $3c place_sprites::@1/(byte) place_sprites::spr_x#1 )
[215] (byte) place_sprites::j#2 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) 0 place_sprites::@1/(byte) place_sprites::j#1 )
[215] (byte) place_sprites::spr_id#2 ← phi( place_sprites/((byte))(const byte*) sprites#0/(byte/signed byte/word/signed word/dword/signed dword) $40 place_sprites::@1/(byte) place_sprites::spr_id#1 )
[216] *((const byte*) place_sprites::sprites_ptr#0 + (byte) place_sprites::j#2) ← (byte) place_sprites::spr_id#2
[217] (byte) place_sprites::spr_id#1 ← ++ (byte) place_sprites::spr_id#2
[218] *((const byte*) SPRITES_XPOS#0 + (byte) place_sprites::j2#3) ← (byte) place_sprites::spr_x#2
[219] *((const byte*) SPRITES_YPOS#0 + (byte) place_sprites::j2#3) ← (byte/signed byte/word/signed word/dword/signed dword) $50
[220] *((const byte*) SPRITES_COLS#0 + (byte) place_sprites::j#2) ← (byte) place_sprites::col#2
[221] (byte) place_sprites::spr_x#1 ← (byte) place_sprites::spr_x#2 + (byte/signed byte/word/signed word/dword/signed dword) $20
[222] (byte) place_sprites::col#1 ← (byte) place_sprites::col#2 ^ (byte/signed byte/word/signed word/dword/signed dword) 7^(byte/signed byte/word/signed word/dword/signed dword) 5
[223] (byte) place_sprites::j2#1 ← ++ (byte) place_sprites::j2#3
[224] (byte) place_sprites::j2#2 ← ++ (byte) place_sprites::j2#1
[225] (byte) place_sprites::j#1 ← ++ (byte) place_sprites::j#2
[226] if((byte) place_sprites::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto place_sprites::@1
[214] (byte) place_sprites::col#2 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) 5 place_sprites::@1/(byte) place_sprites::col#1 )
[214] (byte) place_sprites::j2#3 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) 0 place_sprites::@1/(byte) place_sprites::j2#2 )
[214] (byte) place_sprites::spr_x#2 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) $3c place_sprites::@1/(byte) place_sprites::spr_x#1 )
[214] (byte) place_sprites::j#2 ← phi( place_sprites/(byte/signed byte/word/signed word/dword/signed dword) 0 place_sprites::@1/(byte) place_sprites::j#1 )
[214] (byte) place_sprites::spr_id#2 ← phi( place_sprites/((byte))(const byte*) sprites#0/(byte/signed byte/word/signed word/dword/signed dword) $40 place_sprites::@1/(byte) place_sprites::spr_id#1 )
[215] *((const byte*) place_sprites::sprites_ptr#0 + (byte) place_sprites::j#2) ← (byte) place_sprites::spr_id#2
[216] (byte) place_sprites::spr_id#1 ← ++ (byte) place_sprites::spr_id#2
[217] *((const byte*) SPRITES_XPOS#0 + (byte) place_sprites::j2#3) ← (byte) place_sprites::spr_x#2
[218] *((const byte*) SPRITES_YPOS#0 + (byte) place_sprites::j2#3) ← (byte/signed byte/word/signed word/dword/signed dword) $50
[219] *((const byte*) SPRITES_COLS#0 + (byte) place_sprites::j#2) ← (byte) place_sprites::col#2
[220] (byte) place_sprites::spr_x#1 ← (byte) place_sprites::spr_x#2 + (byte/signed byte/word/signed word/dword/signed dword) $20
[221] (byte) place_sprites::col#1 ← (byte) place_sprites::col#2 ^ (byte/signed byte/word/signed word/dword/signed dword) 7^(byte/signed byte/word/signed word/dword/signed dword) 5
[222] (byte) place_sprites::j2#1 ← ++ (byte) place_sprites::j2#3
[223] (byte) place_sprites::j2#2 ← ++ (byte) place_sprites::j2#1
[224] (byte) place_sprites::j#1 ← ++ (byte) place_sprites::j#2
[225] if((byte) place_sprites::j#1!=(byte/signed byte/word/signed word/dword/signed dword) 7) goto place_sprites::@1
to:place_sprites::@return
place_sprites::@return: scope:[place_sprites] from place_sprites::@1
[227] return
[226] return
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -237,13 +237,13 @@
(byte) gen_sintab::i#1 i zp ZP_BYTE:2 16.5
(byte) gen_sintab::i#10 i zp ZP_BYTE:2 1.8333333333333333
(byte) gen_sintab::length
(byte) gen_sintab::length#10 length zp ZP_BYTE:3 0.44
(byte) gen_sintab::length#10 length zp ZP_BYTE:3 0.4489795918367347
(byte) gen_sintab::max
(byte) gen_sintab::max#2 reg byte x 2.0
(byte) gen_sintab::min
(byte) gen_sintab::min#2 min zp ZP_BYTE:2 0.3333333333333333
(byte) gen_sintab::min#2 min zp ZP_BYTE:2 0.4
(byte*) gen_sintab::sintab
(byte*) gen_sintab::sintab#12 sintab zp ZP_WORD:8 0.22
(byte*) gen_sintab::sintab#12 sintab zp ZP_WORD:8 0.22448979591836735
(void()) gen_sprites()
(label) gen_sprites::@1
(label) gen_sprites::@3
@ -339,7 +339,7 @@
(void()) progress_init((byte*) progress_init::line)
(label) progress_init::@return
(byte*) progress_init::line
(byte*) progress_init::line#2 line zp ZP_WORD:10 0.06666666666666667
(byte*) progress_init::line#2 line zp ZP_WORD:10 0.06896551724137931
(void()) setARGtoFAC()
(label) setARGtoFAC::@return
(void()) setFAC((word) setFAC::w)

View File

@ -0,0 +1,34 @@
// Tests that inline ASM JSR clobbers all registers
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
main: {
lda #0
b1:
ldx #0
b2:
ldy #0
b3:
pha
txa
pha
tya
pha
jsr $e544
pla
tay
pla
tax
pla
iny
cpy #$b
bne b3
inx
cpx #$b
bne b2
clc
adc #1
cmp #$b
bne b1
rts
}

View File

@ -0,0 +1,35 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@5
[5] (byte) main::i#6 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@5/(byte) main::i#1 )
to:main::@2
main::@2: scope:[main] from main::@1 main::@4
[6] (byte) main::j#4 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/(byte) main::j#1 )
to:main::@3
main::@3: scope:[main] from main::@2 main::@3
[7] (byte) main::k#2 ← phi( main::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/(byte) main::k#1 )
asm { pha txa pha tya pha jsr$e544 pla tay pla tax pla }
[9] (byte) main::k#1 ← ++ (byte) main::k#2
[10] if((byte) main::k#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@3
[11] (byte) main::j#1 ← ++ (byte) main::j#4
[12] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@2
to:main::@5
main::@5: scope:[main] from main::@4
[13] (byte) main::i#1 ← ++ (byte) main::i#6
[14] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@5
[15] return
to:@return

View File

@ -0,0 +1,570 @@
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) $400
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@1
main::@1: scope:[main] from main main::@5
(byte) main::i#6 ← phi( main/(byte) main::i#0 main::@5/(byte) main::i#1 )
(byte) main::j#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@2
main::@2: scope:[main] from main::@1 main::@4
(byte) main::i#5 ← phi( main::@1/(byte) main::i#6 main::@4/(byte) main::i#3 )
(byte) main::j#4 ← phi( main::@1/(byte) main::j#0 main::@4/(byte) main::j#1 )
(byte) main::k#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@3
main::@3: scope:[main] from main::@2 main::@3
(byte) main::i#4 ← phi( main::@2/(byte) main::i#5 main::@3/(byte) main::i#4 )
(byte) main::j#3 ← phi( main::@2/(byte) main::j#4 main::@3/(byte) main::j#3 )
(byte) main::k#2 ← phi( main::@2/(byte) main::k#0 main::@3/(byte) main::k#1 )
asm { pha txa pha tya pha jsr$e544 pla tay pla tax pla }
(byte) main::k#1 ← (byte) main::k#2 + rangenext(0,$a)
(bool~) main::$0 ← (byte) main::k#1 != rangelast(0,$a)
if((bool~) main::$0) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@3
(byte) main::i#3 ← phi( main::@3/(byte) main::i#4 )
(byte) main::j#2 ← phi( main::@3/(byte) main::j#3 )
(byte) main::j#1 ← (byte) main::j#2 + rangenext(0,$a)
(bool~) main::$1 ← (byte) main::j#1 != rangelast(0,$a)
if((bool~) main::$1) goto main::@2
to:main::@5
main::@5: scope:[main] from main::@4
(byte) main::i#2 ← phi( main::@4/(byte) main::i#3 )
(byte) main::i#1 ← (byte) main::i#2 + rangenext(0,$a)
(bool~) main::$2 ← (byte) main::i#1 != rangelast(0,$a)
if((bool~) main::$2) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@5
return
to:@return
@1: scope:[] from @begin
call main
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
SYMBOL TABLE SSA
(label) @1
(label) @2
(label) @begin
(label) @end
(byte*) SCREEN
(byte*) SCREEN#0
(void()) main()
(bool~) main::$0
(bool~) main::$1
(bool~) main::$2
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@return
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::i#2
(byte) main::i#3
(byte) main::i#4
(byte) main::i#5
(byte) main::i#6
(byte) main::j
(byte) main::j#0
(byte) main::j#1
(byte) main::j#2
(byte) main::j#3
(byte) main::j#4
(byte) main::k
(byte) main::k#0
(byte) main::k#1
(byte) main::k#2
Culled Empty Block (label) @2
Successful SSA optimization Pass2CullEmptyBlocks
Alias (byte) main::j#2 = (byte) main::j#3
Alias (byte) main::i#2 = (byte) main::i#3 (byte) main::i#4
Successful SSA optimization Pass2AliasElimination
Self Phi Eliminated (byte) main::j#2
Self Phi Eliminated (byte) main::i#2
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte) main::j#2 (byte) main::j#4
Redundant Phi (byte) main::i#2 (byte) main::i#5
Successful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) main::$0 [10] if((byte) main::k#1!=rangelast(0,$a)) goto main::@3
Simple Condition (bool~) main::$1 [14] if((byte) main::j#1!=rangelast(0,$a)) goto main::@2
Simple Condition (bool~) main::$2 [18] if((byte) main::i#1!=rangelast(0,$a)) goto main::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) SCREEN#0 = ((byte*))$400
Constant (const byte) main::i#0 = 0
Constant (const byte) main::j#0 = 0
Constant (const byte) main::k#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Successful SSA optimization PassNEliminateUnusedVars
Resolved ranged next value main::k#1 ← ++ main::k#2 to ++
Resolved ranged comparison value if(main::k#1!=rangelast(0,$a)) goto main::@3 to (byte/signed byte/word/signed word/dword/signed dword) $b
Resolved ranged next value main::j#1 ← ++ main::j#4 to ++
Resolved ranged comparison value if(main::j#1!=rangelast(0,$a)) goto main::@2 to (byte/signed byte/word/signed word/dword/signed dword) $b
Resolved ranged next value main::i#1 ← ++ main::i#5 to ++
Resolved ranged comparison value if(main::i#1!=rangelast(0,$a)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) $b
Self Phi Eliminated (byte) main::i#5
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte) main::i#5 (byte) main::i#6
Successful SSA optimization Pass2RedundantPhiElimination
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::j#0
Inlining constant with var siblings (const byte) main::k#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::k#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::j#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@7(between main::@5 and main::@1)
Added new block during phi lifting main::@8(between main::@4 and main::@2)
Added new block during phi lifting main::@9(between main::@3 and main::@3)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Created 3 initial phi equivalence classes
Coalesced [16] main::i#7 ← main::i#1
Coalesced [17] main::j#5 ← main::j#1
Coalesced [18] main::k#3 ← main::k#1
Coalesced down to 3 phi equivalence classes
Culled Empty Block (label) main::@7
Culled Empty Block (label) main::@8
Culled Empty Block (label) main::@9
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@5
[5] (byte) main::i#6 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@5/(byte) main::i#1 )
to:main::@2
main::@2: scope:[main] from main::@1 main::@4
[6] (byte) main::j#4 ← phi( main::@1/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/(byte) main::j#1 )
to:main::@3
main::@3: scope:[main] from main::@2 main::@3
[7] (byte) main::k#2 ← phi( main::@2/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/(byte) main::k#1 )
asm { pha txa pha tya pha jsr$e544 pla tay pla tax pla }
[9] (byte) main::k#1 ← ++ (byte) main::k#2
[10] if((byte) main::k#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@3
[11] (byte) main::j#1 ← ++ (byte) main::j#4
[12] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@2
to:main::@5
main::@5: scope:[main] from main::@4
[13] (byte) main::i#1 ← ++ (byte) main::i#6
[14] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@5
[15] return
to:@return
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#6 2.75
(byte) main::j
(byte) main::j#1 151.5
(byte) main::j#4 40.4
(byte) main::k
(byte) main::k#1 1501.5
(byte) main::k#2 1001.0
Initial phi equivalence classes
[ main::i#6 main::i#1 ]
[ main::j#4 main::j#1 ]
[ main::k#2 main::k#1 ]
Complete equivalence classes
[ main::i#6 main::i#1 ]
[ main::j#4 main::j#1 ]
[ main::k#2 main::k#1 ]
Allocated zp ZP_BYTE:2 [ main::i#6 main::i#1 ]
Allocated zp ZP_BYTE:3 [ main::j#4 main::j#1 ]
Allocated zp ZP_BYTE:4 [ main::k#2 main::k#1 ]
INITIAL ASM
//SEG0 File Comments
// Tests that inline ASM JSR clobbers all registers
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
.label k = 4
.label j = 3
.label i = 2
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte) main::i#6 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b1
//SEG13 [5] phi from main::@5 to main::@1 [phi:main::@5->main::@1]
b1_from_b5:
//SEG14 [5] phi (byte) main::i#6 = (byte) main::i#1 [phi:main::@5->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG17 [6] phi (byte) main::j#4 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1
lda #0
sta j
jmp b2
//SEG18 [6] phi from main::@4 to main::@2 [phi:main::@4->main::@2]
b2_from_b4:
//SEG19 [6] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@4->main::@2#0] -- register_copy
jmp b2
//SEG20 main::@2
b2:
//SEG21 [7] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
b3_from_b2:
//SEG22 [7] phi (byte) main::k#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@2->main::@3#0] -- vbuz1=vbuc1
lda #0
sta k
jmp b3
//SEG23 [7] phi from main::@3 to main::@3 [phi:main::@3->main::@3]
b3_from_b3:
//SEG24 [7] phi (byte) main::k#2 = (byte) main::k#1 [phi:main::@3->main::@3#0] -- register_copy
jmp b3
//SEG25 main::@3
b3:
//SEG26 asm { pha txa pha tya pha jsr$e544 pla tay pla tax pla }
pha
txa
pha
tya
pha
jsr $e544
pla
tay
pla
tax
pla
//SEG27 [9] (byte) main::k#1 ← ++ (byte) main::k#2 -- vbuz1=_inc_vbuz1
inc k
//SEG28 [10] if((byte) main::k#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@3 -- vbuz1_neq_vbuc1_then_la1
lda k
cmp #$b
bne b3_from_b3
jmp b4
//SEG29 main::@4
b4:
//SEG30 [11] (byte) main::j#1 ← ++ (byte) main::j#4 -- vbuz1=_inc_vbuz1
inc j
//SEG31 [12] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@2 -- vbuz1_neq_vbuc1_then_la1
lda j
cmp #$b
bne b2_from_b4
jmp b5
//SEG32 main::@5
b5:
//SEG33 [13] (byte) main::i#1 ← ++ (byte) main::i#6 -- vbuz1=_inc_vbuz1
inc i
//SEG34 [14] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$b
bne b1_from_b5
jmp breturn
//SEG35 main::@return
breturn:
//SEG36 [15] return
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Potential registers zp ZP_BYTE:2 [ main::i#6 main::i#1 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:3 [ main::j#4 main::j#1 ] : zp ZP_BYTE:3 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:4 [ main::k#2 main::k#1 ] : zp ZP_BYTE:4 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 2,502.5: zp ZP_BYTE:4 [ main::k#2 main::k#1 ] 191.9: zp ZP_BYTE:3 [ main::j#4 main::j#1 ] 19.25: zp ZP_BYTE:2 [ main::i#6 main::i#1 ]
Uplift Scope []
Uplifting [main] best 54463 combination reg byte y [ main::k#2 main::k#1 ] reg byte x [ main::j#4 main::j#1 ] reg byte a [ main::i#6 main::i#1 ]
Uplifting [] best 54463 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
// Tests that inline ASM JSR clobbers all registers
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte) main::i#6 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
jmp b1
//SEG13 [5] phi from main::@5 to main::@1 [phi:main::@5->main::@1]
b1_from_b5:
//SEG14 [5] phi (byte) main::i#6 = (byte) main::i#1 [phi:main::@5->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
//SEG17 [6] phi (byte) main::j#4 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
ldx #0
jmp b2
//SEG18 [6] phi from main::@4 to main::@2 [phi:main::@4->main::@2]
b2_from_b4:
//SEG19 [6] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@4->main::@2#0] -- register_copy
jmp b2
//SEG20 main::@2
b2:
//SEG21 [7] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
b3_from_b2:
//SEG22 [7] phi (byte) main::k#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@2->main::@3#0] -- vbuyy=vbuc1
ldy #0
jmp b3
//SEG23 [7] phi from main::@3 to main::@3 [phi:main::@3->main::@3]
b3_from_b3:
//SEG24 [7] phi (byte) main::k#2 = (byte) main::k#1 [phi:main::@3->main::@3#0] -- register_copy
jmp b3
//SEG25 main::@3
b3:
//SEG26 asm { pha txa pha tya pha jsr$e544 pla tay pla tax pla }
pha
txa
pha
tya
pha
jsr $e544
pla
tay
pla
tax
pla
//SEG27 [9] (byte) main::k#1 ← ++ (byte) main::k#2 -- vbuyy=_inc_vbuyy
iny
//SEG28 [10] if((byte) main::k#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@3 -- vbuyy_neq_vbuc1_then_la1
cpy #$b
bne b3_from_b3
jmp b4
//SEG29 main::@4
b4:
//SEG30 [11] (byte) main::j#1 ← ++ (byte) main::j#4 -- vbuxx=_inc_vbuxx
inx
//SEG31 [12] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@2 -- vbuxx_neq_vbuc1_then_la1
cpx #$b
bne b2_from_b4
jmp b5
//SEG32 main::@5
b5:
//SEG33 [13] (byte) main::i#1 ← ++ (byte) main::i#6 -- vbuaa=_inc_vbuaa
clc
adc #1
//SEG34 [14] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 -- vbuaa_neq_vbuc1_then_la1
cmp #$b
bne b1_from_b5
jmp breturn
//SEG35 main::@return
breturn:
//SEG36 [15] return
rts
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b3
Removing instruction jmp b4
Removing instruction jmp b5
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b3_from_b3 with b3
Replacing label b2_from_b4 with b2
Replacing label b1_from_b5 with b1
Removing instruction b1_from_bbegin:
Removing instruction b1:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1_from_b5:
Removing instruction b2_from_b1:
Removing instruction b2_from_b4:
Removing instruction b3_from_b2:
Removing instruction b3_from_b3:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction b4:
Removing instruction b5:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b3
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte a 16.5
(byte) main::i#6 reg byte a 2.75
(byte) main::j
(byte) main::j#1 reg byte x 151.5
(byte) main::j#4 reg byte x 40.4
(byte) main::k
(byte) main::k#1 reg byte y 1501.5
(byte) main::k#2 reg byte y 1001.0
reg byte a [ main::i#6 main::i#1 ]
reg byte x [ main::j#4 main::j#1 ]
reg byte y [ main::k#2 main::k#1 ]
FINAL ASSEMBLER
Score: 44461
//SEG0 File Comments
// Tests that inline ASM JSR clobbers all registers
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG2 Global Constants & labels
//SEG3 @begin
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
//SEG5 @1
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
//SEG9 @end
//SEG10 main
main: {
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG12 [5] phi (byte) main::i#6 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuaa=vbuc1
lda #0
//SEG13 [5] phi from main::@5 to main::@1 [phi:main::@5->main::@1]
//SEG14 [5] phi (byte) main::i#6 = (byte) main::i#1 [phi:main::@5->main::@1#0] -- register_copy
//SEG15 main::@1
b1:
//SEG16 [6] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG17 [6] phi (byte) main::j#4 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->main::@2#0] -- vbuxx=vbuc1
ldx #0
//SEG18 [6] phi from main::@4 to main::@2 [phi:main::@4->main::@2]
//SEG19 [6] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@4->main::@2#0] -- register_copy
//SEG20 main::@2
b2:
//SEG21 [7] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
//SEG22 [7] phi (byte) main::k#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@2->main::@3#0] -- vbuyy=vbuc1
ldy #0
//SEG23 [7] phi from main::@3 to main::@3 [phi:main::@3->main::@3]
//SEG24 [7] phi (byte) main::k#2 = (byte) main::k#1 [phi:main::@3->main::@3#0] -- register_copy
//SEG25 main::@3
b3:
//SEG26 asm { pha txa pha tya pha jsr$e544 pla tay pla tax pla }
pha
txa
pha
tya
pha
jsr $e544
pla
tay
pla
tax
pla
//SEG27 [9] (byte) main::k#1 ← ++ (byte) main::k#2 -- vbuyy=_inc_vbuyy
iny
//SEG28 [10] if((byte) main::k#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@3 -- vbuyy_neq_vbuc1_then_la1
cpy #$b
bne b3
//SEG29 main::@4
//SEG30 [11] (byte) main::j#1 ← ++ (byte) main::j#4 -- vbuxx=_inc_vbuxx
inx
//SEG31 [12] if((byte) main::j#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@2 -- vbuxx_neq_vbuc1_then_la1
cpx #$b
bne b2
//SEG32 main::@5
//SEG33 [13] (byte) main::i#1 ← ++ (byte) main::i#6 -- vbuaa=_inc_vbuaa
clc
adc #1
//SEG34 [14] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 -- vbuaa_neq_vbuc1_then_la1
cmp #$b
bne b1
//SEG35 main::@return
//SEG36 [15] return
rts
}

View File

@ -0,0 +1,24 @@
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte a 16.5
(byte) main::i#6 reg byte a 2.75
(byte) main::j
(byte) main::j#1 reg byte x 151.5
(byte) main::j#4 reg byte x 40.4
(byte) main::k
(byte) main::k#1 reg byte y 1501.5
(byte) main::k#2 reg byte y 1001.0
reg byte a [ main::i#6 main::i#1 ]
reg byte x [ main::j#4 main::j#1 ]
reg byte y [ main::k#2 main::k#1 ]

View File

@ -0,0 +1,16 @@
// Tests that inline ASM JSR clobbers all registers
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
main: {
.label i = 2
lda #0
sta i
b1:
jsr $e544
inc i
lda i
cmp #$b
bne b1
rts
}

View File

@ -0,0 +1,21 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::i#1 )
asm { jsr$e544 }
[7] (byte) main::i#1 ← ++ (byte) main::i#2
[8] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
[9] return
to:@return

View File

@ -0,0 +1,316 @@
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte*) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) $400
to:@1
main: scope:[main] from @1
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 )
asm { jsr$e544 }
(byte) main::i#1 ← (byte) main::i#2 + rangenext(0,$a)
(bool~) main::$0 ← (byte) main::i#1 != rangelast(0,$a)
if((bool~) main::$0) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
call main
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
SYMBOL TABLE SSA
(label) @1
(label) @2
(label) @begin
(label) @end
(byte*) SCREEN
(byte*) SCREEN#0
(void()) main()
(bool~) main::$0
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::i#2
Culled Empty Block (label) @2
Successful SSA optimization Pass2CullEmptyBlocks
Simple Condition (bool~) main::$0 [6] if((byte) main::i#1!=rangelast(0,$a)) goto main::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) SCREEN#0 = ((byte*))$400
Constant (const byte) main::i#0 = 0
Successful SSA optimization Pass2ConstantIdentification
Successful SSA optimization PassNEliminateUnusedVars
Resolved ranged next value main::i#1 ← ++ main::i#2 to ++
Resolved ranged comparison value if(main::i#1!=rangelast(0,$a)) goto main::@1 to (byte/signed byte/word/signed word/dword/signed dword) $b
Inlining constant with var siblings (const byte) main::i#0
Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@3(between main::@1 and main::@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
CALL GRAPH
Calls in [] to main:2
Created 1 initial phi equivalence classes
Coalesced [10] main::i#3 ← main::i#1
Coalesced down to 1 phi equivalence classes
Culled Empty Block (label) main::@3
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte) main::i#2 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/(byte) main::i#1 )
asm { jsr$e544 }
[7] (byte) main::i#1 ← ++ (byte) main::i#2
[8] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@1
[9] return
to:@return
VARIABLE REGISTER WEIGHTS
(byte*) SCREEN
(void()) main()
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 11.0
Initial phi equivalence classes
[ main::i#2 main::i#1 ]
Complete equivalence classes
[ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
INITIAL ASM
//SEG0 File Comments
// Tests that inline ASM JSR clobbers all registers
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
.label i = 2
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 asm { jsr$e544 }
jsr $e544
//SEG17 [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc i
//SEG18 [8] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$b
bne b1_from_b1
jmp breturn
//SEG19 main::@return
breturn:
//SEG20 [9] return
rts
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement asm { jsr$e544 } always clobbers reg byte a reg byte x reg byte y
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte x as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Statement [8] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) always clobbers reg byte a
Statement asm { jsr$e544 } always clobbers reg byte a reg byte x reg byte y
Statement [8] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 [ main::i#1 ] ( main:2 [ main::i#1 ] ) always clobbers reg byte a
Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 ,
REGISTER UPLIFT SCOPES
Uplift Scope [main] 27.5: zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplift Scope []
Uplifting [main] best 343 combination zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplifting [] best 343 combination
Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::i#2 main::i#1 ]
Uplifting [main] best 343 combination zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
// Tests that inline ASM JSR clobbers all registers
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
.label i = 2
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b1
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 asm { jsr$e544 }
jsr $e544
//SEG17 [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc i
//SEG18 [8] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$b
bne b1_from_b1
jmp breturn
//SEG19 main::@return
breturn:
//SEG20 [9] return
rts
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Replacing label b1_from_b1 with b1
Removing instruction b1_from_bbegin:
Removing instruction b1:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp b1
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 i zp ZP_BYTE:2 16.5
(byte) main::i#2 i zp ZP_BYTE:2 11.0
zp ZP_BYTE:2 [ main::i#2 main::i#1 ]
FINAL ASSEMBLER
Score: 241
//SEG0 File Comments
// Tests that inline ASM JSR clobbers all registers
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG2 Global Constants & labels
//SEG3 @begin
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
//SEG5 @1
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
//SEG9 @end
//SEG10 main
main: {
.label i = 2
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG12 [5] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1
lda #0
sta i
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
//SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 main::@1
b1:
//SEG16 asm { jsr$e544 }
jsr $e544
//SEG17 [7] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc i
//SEG18 [8] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) $b) goto main::@1 -- vbuz1_neq_vbuc1_then_la1
lda i
cmp #$b
bne b1
//SEG19 main::@return
//SEG20 [9] return
rts
}

View File

@ -0,0 +1,12 @@
(label) @1
(label) @begin
(label) @end
(byte*) SCREEN
(void()) main()
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 i zp ZP_BYTE:2 16.5
(byte) main::i#2 i zp ZP_BYTE:2 11.0
zp ZP_BYTE:2 [ main::i#2 main::i#1 ]

View File

@ -1661,16 +1661,19 @@ Statement [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed
Statement [57] *((byte*) print_char_cursor#23) ← (byte) print_char::ch#2 [ print_char_cursor#23 ] ( main:2::print_word:31::print_byte:44::print_char:51 [ main::i#10 print_line_cursor#13 print_word::w#0 print_byte::b#2 print_char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:51 [ main::i#10 print_line_cursor#13 print_byte::b#2 print_char_cursor#23 ] main:2::print_word:31::print_byte:44::print_char:54 [ main::i#10 print_line_cursor#13 print_word::w#0 print_char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:54 [ main::i#10 print_line_cursor#13 print_char_cursor#23 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:2 [ main::i#10 main::i#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:5 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
Statement [61] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::getFAC:28 [ main::i#10 print_char_cursor#32 print_line_cursor#13 getFAC::return#0 ] ) always clobbers reg byte a
Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte y
Statement [74] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2 [ prepareMEM::mem#4 ] ( main:2::mulFACbyMEM:14 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#4 ] main:2::mulFACbyMEM:24 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#4 ] ) always clobbers reg byte a
Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte y
Statement asm { lda$fe ldy$ff jsr$bb0f } always clobbers reg byte a reg byte y
Statement [85] (byte*~) prepareMEM::mem#7 ← (byte*)(word) setFAC::w#3 [ prepareMEM::mem#7 ] ( main:2::setFAC:5 [ prepareMEM::mem#7 ] main:2::setFAC:12 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#7 ] main:2::setFAC:18 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#7 ] ) always clobbers reg byte a
Statement asm { ldy$fe lda$ff jsr$b391 } always clobbers reg byte a reg byte y
Statement [90] (byte*) prepareMEM::mem#1 ← (byte*) setMEMtoFAC::mem#2 [ prepareMEM::mem#1 ] ( main:2::setMEMtoFAC:9 [ prepareMEM::mem#1 ] main:2::setMEMtoFAC:16 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#1 ] ) always clobbers reg byte a
Statement asm { ldx$fe ldy$ff jsr$bbd4 } always clobbers reg byte x reg byte y
Statement asm { jsr$b1aa sty$fe sta$ff } 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#10 main::i#1 ]
Statement [61] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::getFAC:28 [ main::i#10 print_char_cursor#32 print_line_cursor#13 getFAC::return#0 ] ) always clobbers reg byte a
Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte x reg byte y
Statement [74] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2 [ prepareMEM::mem#4 ] ( main:2::mulFACbyMEM:14 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#4 ] main:2::mulFACbyMEM:24 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#4 ] ) always clobbers reg byte a
Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$e26b } always clobbers reg byte a reg byte x reg byte y
Statement asm { lda$fe ldy$ff jsr$bb0f } always clobbers reg byte a reg byte x reg byte y
Statement [85] (byte*~) prepareMEM::mem#7 ← (byte*)(word) setFAC::w#3 [ prepareMEM::mem#7 ] ( main:2::setFAC:5 [ prepareMEM::mem#7 ] main:2::setFAC:12 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#7 ] main:2::setFAC:18 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#7 ] ) always clobbers reg byte a
Statement asm { ldy$fe lda$ff jsr$b391 } always clobbers reg byte a reg byte x reg byte y
Statement [90] (byte*) prepareMEM::mem#1 ← (byte*) setMEMtoFAC::mem#2 [ prepareMEM::mem#1 ] ( main:2::setMEMtoFAC:9 [ prepareMEM::mem#1 ] main:2::setMEMtoFAC:16 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#1 ] ) always clobbers reg byte a
Statement asm { ldx$fe ldy$ff jsr$bbd4 } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$bafe } always clobbers reg byte a reg byte x reg byte y
Statement [11] (word) setFAC::w#1 ← ((word)) (byte) main::i#10 [ main::i#10 print_char_cursor#32 print_line_cursor#13 setFAC::w#1 ] ( main:2 [ main::i#10 print_char_cursor#32 print_line_cursor#13 setFAC::w#1 ] ) always clobbers reg byte a
Statement [29] (word) getFAC::return#2 ← (word) getFAC::return#0 [ main::i#10 print_char_cursor#32 print_line_cursor#13 getFAC::return#2 ] ( main:2 [ main::i#10 print_char_cursor#32 print_line_cursor#13 getFAC::return#2 ] ) always clobbers reg byte a
Statement [30] (word) print_word::w#0 ← (word) getFAC::return#2 [ main::i#10 print_char_cursor#32 print_line_cursor#13 print_word::w#0 ] ( main:2 [ main::i#10 print_char_cursor#32 print_line_cursor#13 print_word::w#0 ] ) always clobbers reg byte a
@ -1683,15 +1686,18 @@ Statement [45] (byte) print_byte::b#1 ← < (word) print_word::w#0 [ print_char_
Statement [49] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word/dword/signed dword) 4 [ print_byte::b#2 print_char_cursor#31 print_byte::$0 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 print_line_cursor#13 print_word::w#0 print_byte::b#2 print_char_cursor#31 print_byte::$0 ] main:2::print_word:31::print_byte:46 [ main::i#10 print_line_cursor#13 print_byte::b#2 print_char_cursor#31 print_byte::$0 ] ) always clobbers reg byte a
Statement [52] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word/dword/signed dword) $f [ print_char_cursor#10 print_byte::$2 ] ( main:2::print_word:31::print_byte:44 [ main::i#10 print_line_cursor#13 print_word::w#0 print_char_cursor#10 print_byte::$2 ] main:2::print_word:31::print_byte:46 [ main::i#10 print_line_cursor#13 print_char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
Statement [57] *((byte*) print_char_cursor#23) ← (byte) print_char::ch#2 [ print_char_cursor#23 ] ( main:2::print_word:31::print_byte:44::print_char:51 [ main::i#10 print_line_cursor#13 print_word::w#0 print_byte::b#2 print_char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:51 [ main::i#10 print_line_cursor#13 print_byte::b#2 print_char_cursor#23 ] main:2::print_word:31::print_byte:44::print_char:54 [ main::i#10 print_line_cursor#13 print_word::w#0 print_char_cursor#23 ] main:2::print_word:31::print_byte:46::print_char:54 [ main::i#10 print_line_cursor#13 print_char_cursor#23 ] ) always clobbers reg byte y
Statement asm { jsr$b1aa sty$fe sta$ff } always clobbers reg byte a reg byte x reg byte y
Statement [61] (word) getFAC::return#0 ← *((const byte*) memHi#0) w= *((const byte*) memLo#0) [ getFAC::return#0 ] ( main:2::getFAC:28 [ main::i#10 print_char_cursor#32 print_line_cursor#13 getFAC::return#0 ] ) always clobbers reg byte a
Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte y
Statement asm { lda$fe ldy$ff jsr$b867 } always clobbers reg byte a reg byte x reg byte y
Statement [74] (byte*) prepareMEM::mem#4 ← (byte*) mulFACbyMEM::mem#2 [ prepareMEM::mem#4 ] ( main:2::mulFACbyMEM:14 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#4 ] main:2::mulFACbyMEM:24 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#4 ] ) always clobbers reg byte a
Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte y
Statement asm { lda$fe ldy$ff jsr$bb0f } always clobbers reg byte a reg byte y
Statement asm { lda$fe ldy$ff jsr$ba28 } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$e26b } always clobbers reg byte a reg byte x reg byte y
Statement asm { lda$fe ldy$ff jsr$bb0f } always clobbers reg byte a reg byte x reg byte y
Statement [85] (byte*~) prepareMEM::mem#7 ← (byte*)(word) setFAC::w#3 [ prepareMEM::mem#7 ] ( main:2::setFAC:5 [ prepareMEM::mem#7 ] main:2::setFAC:12 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#7 ] main:2::setFAC:18 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#7 ] ) always clobbers reg byte a
Statement asm { ldy$fe lda$ff jsr$b391 } always clobbers reg byte a reg byte y
Statement asm { ldy$fe lda$ff jsr$b391 } always clobbers reg byte a reg byte x reg byte y
Statement [90] (byte*) prepareMEM::mem#1 ← (byte*) setMEMtoFAC::mem#2 [ prepareMEM::mem#1 ] ( main:2::setMEMtoFAC:9 [ prepareMEM::mem#1 ] main:2::setMEMtoFAC:16 [ main::i#10 print_char_cursor#32 print_line_cursor#13 prepareMEM::mem#1 ] ) always clobbers reg byte a
Statement asm { ldx$fe ldy$ff jsr$bbd4 } always clobbers reg byte x reg byte y
Statement asm { ldx$fe ldy$ff jsr$bbd4 } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$bafe } always clobbers reg byte a reg byte x reg byte y
Potential registers zp ZP_BYTE:2 [ main::i#10 main::i#1 ] : zp ZP_BYTE:2 ,
Potential registers zp ZP_WORD:3 [ print_line_cursor#6 print_line_cursor#13 print_line_cursor#1 ] : zp ZP_WORD:3 ,
Potential registers zp ZP_BYTE:5 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] : zp ZP_BYTE:5 , reg byte x ,