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:
parent
5cf5d88228
commit
f67a5bc897
@ -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")) {
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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*
|
||||
;
|
||||
|
@ -99,7 +99,7 @@ COMMENT_BLOCK=90
|
||||
','=9
|
||||
'resource'=10
|
||||
'uses'=11
|
||||
'clobber'=12
|
||||
'clobbers'=12
|
||||
'param'=13
|
||||
':'=14
|
||||
'bytes'=15
|
||||
|
@ -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}
|
||||
*
|
||||
|
@ -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}
|
||||
*
|
||||
|
@ -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 {
|
||||
|
@ -99,7 +99,7 @@ COMMENT_BLOCK=90
|
||||
','=9
|
||||
'resource'=10
|
||||
'uses'=11
|
||||
'clobber'=12
|
||||
'clobbers'=12
|
||||
'param'=13
|
||||
':'=14
|
||||
'bytes'=15
|
||||
|
@ -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
@ -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
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
23
src/test/kc/inline-asm-clobber-none.kc
Normal file
23
src/test/kc/inline-asm-clobber-none.kc
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
9
src/test/kc/inline-asm-jsr-clobber.kc
Normal file
9
src/test/kc/inline-asm-jsr-clobber.kc
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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
@ -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)
|
||||
|
34
src/test/ref/inline-asm-clobber-none.asm
Normal file
34
src/test/ref/inline-asm-clobber-none.asm
Normal 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
|
||||
}
|
35
src/test/ref/inline-asm-clobber-none.cfg
Normal file
35
src/test/ref/inline-asm-clobber-none.cfg
Normal 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
|
570
src/test/ref/inline-asm-clobber-none.log
Normal file
570
src/test/ref/inline-asm-clobber-none.log
Normal 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
|
||||
}
|
||||
|
24
src/test/ref/inline-asm-clobber-none.sym
Normal file
24
src/test/ref/inline-asm-clobber-none.sym
Normal 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 ]
|
16
src/test/ref/inline-asm-jsr-clobber.asm
Normal file
16
src/test/ref/inline-asm-jsr-clobber.asm
Normal 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
|
||||
}
|
21
src/test/ref/inline-asm-jsr-clobber.cfg
Normal file
21
src/test/ref/inline-asm-jsr-clobber.cfg
Normal 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
|
316
src/test/ref/inline-asm-jsr-clobber.log
Normal file
316
src/test/ref/inline-asm-jsr-clobber.log
Normal 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
|
||||
}
|
||||
|
12
src/test/ref/inline-asm-jsr-clobber.sym
Normal file
12
src/test/ref/inline-asm-jsr-clobber.sym
Normal 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 ]
|
@ -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 ,
|
||||
|
Loading…
x
Reference in New Issue
Block a user