1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-08 14:37:40 +00:00

Added ConstantCastValue for when noop casts are used on constant values.

This commit is contained in:
jespergravgaard 2018-04-29 21:39:12 +02:00
parent a3109431bf
commit 3879ac83b0
28 changed files with 2544 additions and 1312 deletions

View File

@ -4,6 +4,7 @@ import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.operators.Operator;
import dk.camelot64.kickc.model.operators.OperatorBinary;
import dk.camelot64.kickc.model.operators.OperatorUnary;
import dk.camelot64.kickc.model.operators.Operators;
import dk.camelot64.kickc.model.symbols.ConstantVar;
import dk.camelot64.kickc.model.symbols.Variable;
@ -55,6 +56,11 @@ public class AsmFormat {
VariableRef toVar = ((ConstantVarPointer) value).getToVar();
Variable variable = program.getScope().getVariable(toVar);
return getAsmParamName(variable, codeScope);
} else if(value instanceof ConstantCastValue) {
ConstantCastValue castValue = (ConstantCastValue) value;
OperatorUnary castOperator = Operators.getCastUnary(castValue.getToType());
ConstantUnary castUnary = new ConstantUnary(castOperator, castValue.getValue());
return getAsmConstant(program, castUnary, precedence, codeScope);
} else {
throw new RuntimeException("Constant type not supported " + value);
}

View File

@ -236,6 +236,11 @@ public class AsmFragmentInstanceSpec {
SymbolType toType = castVal.getToType();
value = castVal.getValue();
return bind(value, toType);
} else if(value instanceof ConstantCastValue) {
ConstantCastValue castVal = (ConstantCastValue) value;
SymbolType toType = castVal.getToType();
value = castVal.getValue();
return bind(value, toType);
} else if(value instanceof PointerDereference) {
PointerDereference deref = (PointerDereference) value;
SymbolType ptrType = null;

View File

@ -135,7 +135,7 @@ public class Operators {
}
}
public static Operator getCastUnary(SymbolType castType) {
public static OperatorUnary getCastUnary(SymbolType castType) {
if(SymbolType.BYTE.equals(castType)) {
return CAST_BYTE;
} else if(SymbolType.SBYTE.equals(castType)) {

View File

@ -15,32 +15,18 @@ public class Procedure extends Scope {
public static final ProcedureRef ROOT = new ProcedureRef("");
private final SymbolType returnType;
private List<String> parameterNames;
private boolean declaredInline;
public Procedure(String name, SymbolType returnType, Scope parentScope) {
super(name, parentScope);
this.returnType = returnType;
}
private Procedure(
String name,
SymbolType returnType,
List<String> parameterNames,
HashMap<String, Symbol> symbols,
int intermediateVarCount,
int intermediateLabelCount) {
super(name, symbols, intermediateVarCount, intermediateLabelCount);
this.returnType = returnType;
this.parameterNames = parameterNames;
this.declaredInline = false;
}
public List<String> getParameterNames() {
return parameterNames;
}
public void setParameterNames(List<String> parameterNames) {
this.parameterNames = parameterNames;
}
public Label getLabel() {
return new Label(getFullName(), getScope(), false);
}
@ -83,6 +69,10 @@ public class Procedure extends Scope {
return new SymbolTypeProcedure(returnType);
}
public boolean isDeclaredInline() {
return declaredInline;
}
@Override
public String toString() {
return toString(null);
@ -91,6 +81,9 @@ public class Procedure extends Scope {
@Override
public String toString(Program program) {
StringBuilder res = new StringBuilder();
if(declaredInline) {
res.append("inline ");
}
res.append("(" + getType().getTypeName() + ") ");
res.append(getFullName());
res.append("(");
@ -129,4 +122,9 @@ public class Procedure extends Scope {
result = 31 * result + (parameterNames != null ? parameterNames.hashCode() : 0);
return result;
}
public void setDeclaredInline(boolean declaredInline) {
this.declaredInline = declaredInline;
}
}

View File

@ -178,6 +178,8 @@ public class SymbolTypeInference {
return ((ConstantVarPointer) rValue).getType(symbols);
} else if(rValue instanceof CastValue) {
return ((CastValue) rValue).getToType();
} else if(rValue instanceof ConstantCastValue) {
return ((ConstantCastValue) rValue).getToType();
}
if(type == null) {
throw new RuntimeException("Cannot infer type for " + rValue.toString());

View File

@ -0,0 +1,65 @@
package dk.camelot64.kickc.model.values;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.operators.Operator;
import dk.camelot64.kickc.model.operators.OperatorUnary;
import dk.camelot64.kickc.model.operators.Operators;
import dk.camelot64.kickc.model.symbols.ProgramScope;
import dk.camelot64.kickc.model.types.SymbolType;
/** A Cast of a constant that requires no actual operation.
* The types have the same size and the code will execute as if the value already had the type cast to.
* Examples: byte to/from signed byte, word to/from sighed word.
* Exactly the same as {@link CastValue} - just constant
*/
public class ConstantCastValue implements ConstantValue {
/** The type cast to. */
private SymbolType toType;
/** The value being cast. */
private ConstantValue value;
public ConstantCastValue(SymbolType toType, ConstantValue value) {
this.toType = toType;
this.value = value;
}
@Override
public SymbolType getType(ProgramScope scope) {
return getToType();
}
@Override
public ConstantLiteral calculateLiteral(ProgramScope scope) {
ConstantLiteral valueLiteral = value.calculateLiteral(scope);
OperatorUnary castOperator = Operators.getCastUnary(toType);
return castOperator.calculateLiteral(valueLiteral);
}
public SymbolType getToType() {
return toType;
}
public void setToType(SymbolType toType) {
this.toType = toType;
}
public ConstantValue getValue() {
return value;
}
public void setValue(ConstantValue value) {
this.value = value;
}
@Override
public String toString(Program program) {
return "("+ toType.toString()+")"+ value.toString(program);
}
@Override
public String toString() {
return toString(null);
}
}

View File

@ -22,8 +22,16 @@ declSeq
;
decl
: typeDecl NAME '(' parameterListDecl? ')' '{' stmtSeq? '}' #declMethod
| declVar #declVariable
: declVariable
| declFunction
;
declVariable
: directive* typeDecl directive* NAME ('=' expr)? ';'
;
declFunction
: directive* typeDecl directive* NAME '(' parameterListDecl? ')' '{' stmtSeq? '}'
;
parameterListDecl
@ -32,14 +40,11 @@ parameterListDecl
parameterDecl
: directive* typeDecl directive* NAME ;
declVar
: directive* typeDecl directive* NAME ('=' expr)? ';'
;
directive
: 'const' #directiveConst
| 'align' '(' NUMBER ')' #directiveAlign
| 'register' '(' NAME ')' #directiveRegister
| 'inline' #directiveInline
;
stmtSeq
@ -47,7 +52,7 @@ stmtSeq
;
stmt
: declVar #stmtDeclVar
: declVariable #stmtDeclVar
| '{' stmtSeq? '}' #stmtBlock
| expr ';' #stmtExpr
| 'if' '(' expr ')' stmt ( 'else' stmt )? #stmtIfElse

View File

@ -55,79 +55,81 @@ T__53=54
T__54=55
T__55=56
T__56=57
MNEMONIC=58
SIMPLETYPE=59
STRING=60
CHAR=61
BOOLEAN=62
NUMBER=63
NUMFLOAT=64
BINFLOAT=65
DECFLOAT=66
HEXFLOAT=67
NUMINT=68
BININTEGER=69
DECINTEGER=70
HEXINTEGER=71
NAME=72
ASMREL=73
WS=74
COMMENT_LINE=75
COMMENT_BLOCK=76
T__57=58
MNEMONIC=59
SIMPLETYPE=60
STRING=61
CHAR=62
BOOLEAN=63
NUMBER=64
NUMFLOAT=65
BINFLOAT=66
DECFLOAT=67
HEXFLOAT=68
NUMINT=69
BININTEGER=70
DECINTEGER=71
HEXINTEGER=72
NAME=73
ASMREL=74
WS=75
COMMENT_LINE=76
COMMENT_BLOCK=77
'import'=1
'('=2
')'=3
'{'=4
'}'=5
','=6
'='=7
';'=8
'='=2
';'=3
'('=4
')'=5
'{'=6
'}'=7
','=8
'const'=9
'align'=10
'register'=11
'if'=12
'else'=13
'while'=14
'do'=15
'for'=16
'return'=17
'asm'=18
':'=19
'..'=20
'signed'=21
'*'=22
'['=23
']'=24
'--'=25
'++'=26
'+'=27
'-'=28
'!'=29
'&'=30
'~'=31
'>>'=32
'<<'=33
'/'=34
'%'=35
'<'=36
'>'=37
'=='=38
'!='=39
'<='=40
'>='=41
'^'=42
'|'=43
'&&'=44
'||'=45
'+='=46
'-='=47
'*='=48
'/='=49
'%='=50
'<<='=51
'>>='=52
'&='=53
'|='=54
'^='=55
'.byte'=56
'#'=57
'inline'=12
'if'=13
'else'=14
'while'=15
'do'=16
'for'=17
'return'=18
'asm'=19
':'=20
'..'=21
'signed'=22
'*'=23
'['=24
']'=25
'--'=26
'++'=27
'+'=28
'-'=29
'!'=30
'&'=31
'~'=32
'>>'=33
'<<'=34
'/'=35
'%'=36
'<'=37
'>'=38
'=='=39
'!='=40
'<='=41
'>='=42
'^'=43
'|'=44
'&&'=45
'||'=46
'+='=47
'-='=48
'*='=49
'/='=50
'%='=51
'<<='=52
'>>='=53
'&='=54
'|='=55
'^='=56
'.byte'=57
'#'=58

View File

@ -76,13 +76,13 @@ public class KickCBaseListener implements KickCListener {
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterDeclMethod(KickCParser.DeclMethodContext ctx) { }
@Override public void enterDecl(KickCParser.DeclContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDeclMethod(KickCParser.DeclMethodContext ctx) { }
@Override public void exitDecl(KickCParser.DeclContext ctx) { }
/**
* {@inheritDoc}
*
@ -95,6 +95,18 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDeclVariable(KickCParser.DeclVariableContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterDeclFunction(KickCParser.DeclFunctionContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDeclFunction(KickCParser.DeclFunctionContext ctx) { }
/**
* {@inheritDoc}
*
@ -119,18 +131,6 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitParameterDecl(KickCParser.ParameterDeclContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterDeclVar(KickCParser.DeclVarContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDeclVar(KickCParser.DeclVarContext ctx) { }
/**
* {@inheritDoc}
*
@ -167,6 +167,18 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterDirectiveInline(KickCParser.DirectiveInlineContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitDirectiveInline(KickCParser.DirectiveInlineContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -52,7 +52,7 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclMethod(KickCParser.DeclMethodContext ctx) { return visitChildren(ctx); }
@Override public T visitDecl(KickCParser.DeclContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -60,6 +60,13 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclVariable(KickCParser.DeclVariableContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclFunction(KickCParser.DeclFunctionContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -74,13 +81,6 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitParameterDecl(KickCParser.ParameterDeclContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDeclVar(KickCParser.DeclVarContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -102,6 +102,13 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitDirectiveInline(KickCParser.DirectiveInlineContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -24,10 +24,10 @@ public class KickCLexer extends Lexer {
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, MNEMONIC=58, SIMPLETYPE=59,
STRING=60, CHAR=61, BOOLEAN=62, NUMBER=63, NUMFLOAT=64, BINFLOAT=65, DECFLOAT=66,
HEXFLOAT=67, NUMINT=68, BININTEGER=69, DECINTEGER=70, HEXINTEGER=71, NAME=72,
ASMREL=73, WS=74, COMMENT_LINE=75, COMMENT_BLOCK=76;
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, MNEMONIC=59,
SIMPLETYPE=60, STRING=61, CHAR=62, BOOLEAN=63, NUMBER=64, NUMFLOAT=65,
BINFLOAT=66, DECFLOAT=67, HEXFLOAT=68, NUMINT=69, BININTEGER=70, DECINTEGER=71,
HEXINTEGER=72, NAME=73, ASMREL=74, WS=75, COMMENT_LINE=76, COMMENT_BLOCK=77;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@ -44,27 +44,27 @@ public class KickCLexer extends Lexer {
"T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
"T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
"T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
"MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
"BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
"HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START",
"NAME_CHAR", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
"T__57", "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER",
"NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
"DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME",
"NAME_START", "NAME_CHAR", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
private static final String[] _LITERAL_NAMES = {
null, "'import'", "'('", "')'", "'{'", "'}'", "','", "'='", "';'", "'const'",
"'align'", "'register'", "'if'", "'else'", "'while'", "'do'", "'for'",
"'return'", "'asm'", "':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'",
"'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'",
"'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'",
"'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='",
"'^='", "'.byte'", "'#'"
null, "'import'", "'='", "';'", "'('", "')'", "'{'", "'}'", "','", "'const'",
"'align'", "'register'", "'inline'", "'if'", "'else'", "'while'", "'do'",
"'for'", "'return'", "'asm'", "':'", "'..'", "'signed'", "'*'", "'['",
"']'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'",
"'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'",
"'&&'", "'||'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='",
"'&='", "'|='", "'^='", "'.byte'", "'#'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, "MNEMONIC",
null, null, null, null, null, null, null, null, null, null, null, "MNEMONIC",
"SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT",
"DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
"NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
@ -127,7 +127,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\2N\u030f\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2O\u0318\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"+
@ -136,282 +136,285 @@ public class KickCLexer extends Lexer {
",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\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\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3"+
"\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\17\3\17"+
"\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22"+
"\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\24\3\24\3\25\3\25\3\25\3\26"+
"\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\32\3\32"+
"\3\32\3\33\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\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\60\3\60\3\60\3\61"+
"\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\65\3\65"+
"\3\65\3\65\3\66\3\66\3\66\3\67\3\67\3\67\38\38\38\39\39\39\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;\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;\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;\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;\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;\3;\3;\3;\3;\3;\3"+
";\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\3;\5;\u023c\n;\3<\3<\3"+
"<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\3<\5<\u0253\n<\3"+
"=\3=\3=\3=\7=\u0259\n=\f=\16=\u025c\13=\3=\3=\3>\3>\3>\3>\5>\u0264\n>"+
"\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3?\5?\u0271\n?\3@\3@\5@\u0275\n@\3A\3A"+
"\3A\5A\u027a\nA\3B\3B\3B\3B\3B\5B\u0281\nB\3B\7B\u0284\nB\fB\16B\u0287"+
"\13B\3B\3B\6B\u028b\nB\rB\16B\u028c\3C\7C\u0290\nC\fC\16C\u0293\13C\3"+
"C\3C\6C\u0297\nC\rC\16C\u0298\3D\3D\3D\3D\3D\5D\u02a0\nD\3D\7D\u02a3\n"+
"D\fD\16D\u02a6\13D\3D\3D\6D\u02aa\nD\rD\16D\u02ab\3E\3E\3E\5E\u02b1\n"+
"E\3F\3F\3F\6F\u02b6\nF\rF\16F\u02b7\3F\3F\6F\u02bc\nF\rF\16F\u02bd\5F"+
"\u02c0\nF\3G\6G\u02c3\nG\rG\16G\u02c4\3H\3H\3H\3H\3H\5H\u02cc\nH\3H\6"+
"H\u02cf\nH\rH\16H\u02d0\3I\3I\3J\3J\3K\3K\3L\3L\7L\u02db\nL\fL\16L\u02de"+
"\13L\3M\3M\3N\3N\3O\3O\7O\u02e6\nO\fO\16O\u02e9\13O\3O\6O\u02ec\nO\rO"+
"\16O\u02ed\3P\6P\u02f1\nP\rP\16P\u02f2\3P\3P\3Q\3Q\3Q\3Q\7Q\u02fb\nQ\f"+
"Q\16Q\u02fe\13Q\3Q\3Q\3R\3R\3R\3R\7R\u0306\nR\fR\16R\u0309\13R\3R\3R\3"+
"R\3R\3R\3\u0307\2S\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\63"+
"e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+
"F\u008bG\u008dH\u008fI\u0091\2\u0093\2\u0095\2\u0097J\u0099\2\u009b\2"+
"\u009dK\u009fL\u00a1M\u00a3N\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--//\5\2\13\f\17\17\"\"\4\2"+
"\f\f\17\17\2\u0376\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\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3"+
"\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2"+
"\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E"+
"\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2"+
"\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2"+
"\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k"+
"\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2"+
"\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2"+
"\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+
"\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0097\3\2\2\2\2\u009d\3\2\2"+
"\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\3\u00a5\3\2\2\2\5\u00ac"+
"\3\2\2\2\7\u00ae\3\2\2\2\t\u00b0\3\2\2\2\13\u00b2\3\2\2\2\r\u00b4\3\2"+
"\2\2\17\u00b6\3\2\2\2\21\u00b8\3\2\2\2\23\u00ba\3\2\2\2\25\u00c0\3\2\2"+
"\2\27\u00c6\3\2\2\2\31\u00cf\3\2\2\2\33\u00d2\3\2\2\2\35\u00d7\3\2\2\2"+
"\37\u00dd\3\2\2\2!\u00e0\3\2\2\2#\u00e4\3\2\2\2%\u00eb\3\2\2\2\'\u00ef"+
"\3\2\2\2)\u00f1\3\2\2\2+\u00f4\3\2\2\2-\u00fb\3\2\2\2/\u00fd\3\2\2\2\61"+
"\u00ff\3\2\2\2\63\u0101\3\2\2\2\65\u0104\3\2\2\2\67\u0107\3\2\2\29\u0109"+
"\3\2\2\2;\u010b\3\2\2\2=\u010d\3\2\2\2?\u010f\3\2\2\2A\u0111\3\2\2\2C"+
"\u0114\3\2\2\2E\u0117\3\2\2\2G\u0119\3\2\2\2I\u011b\3\2\2\2K\u011d\3\2"+
"\2\2M\u011f\3\2\2\2O\u0122\3\2\2\2Q\u0125\3\2\2\2S\u0128\3\2\2\2U\u012b"+
"\3\2\2\2W\u012d\3\2\2\2Y\u012f\3\2\2\2[\u0132\3\2\2\2]\u0135\3\2\2\2_"+
"\u0138\3\2\2\2a\u013b\3\2\2\2c\u013e\3\2\2\2e\u0141\3\2\2\2g\u0144\3\2"+
"\2\2i\u0148\3\2\2\2k\u014c\3\2\2\2m\u014f\3\2\2\2o\u0152\3\2\2\2q\u0155"+
"\3\2\2\2s\u015b\3\2\2\2u\u023b\3\2\2\2w\u0252\3\2\2\2y\u0254\3\2\2\2{"+
"\u025f\3\2\2\2}\u0270\3\2\2\2\177\u0274\3\2\2\2\u0081\u0279\3\2\2\2\u0083"+
"\u0280\3\2\2\2\u0085\u0291\3\2\2\2\u0087\u029f\3\2\2\2\u0089\u02b0\3\2"+
"\2\2\u008b\u02bf\3\2\2\2\u008d\u02c2\3\2\2\2\u008f\u02cb\3\2\2\2\u0091"+
"\u02d2\3\2\2\2\u0093\u02d4\3\2\2\2\u0095\u02d6\3\2\2\2\u0097\u02d8\3\2"+
"\2\2\u0099\u02df\3\2\2\2\u009b\u02e1\3\2\2\2\u009d\u02e3\3\2\2\2\u009f"+
"\u02f0\3\2\2\2\u00a1\u02f6\3\2\2\2\u00a3\u0301\3\2\2\2\u00a5\u00a6\7k"+
"\2\2\u00a6\u00a7\7o\2\2\u00a7\u00a8\7r\2\2\u00a8\u00a9\7q\2\2\u00a9\u00aa"+
"\7t\2\2\u00aa\u00ab\7v\2\2\u00ab\4\3\2\2\2\u00ac\u00ad\7*\2\2\u00ad\6"+
"\3\2\2\2\u00ae\u00af\7+\2\2\u00af\b\3\2\2\2\u00b0\u00b1\7}\2\2\u00b1\n"+
"\3\2\2\2\u00b2\u00b3\7\177\2\2\u00b3\f\3\2\2\2\u00b4\u00b5\7.\2\2\u00b5"+
"\16\3\2\2\2\u00b6\u00b7\7?\2\2\u00b7\20\3\2\2\2\u00b8\u00b9\7=\2\2\u00b9"+
"\22\3\2\2\2\u00ba\u00bb\7e\2\2\u00bb\u00bc\7q\2\2\u00bc\u00bd\7p\2\2\u00bd"+
"\u00be\7u\2\2\u00be\u00bf\7v\2\2\u00bf\24\3\2\2\2\u00c0\u00c1\7c\2\2\u00c1"+
"\u00c2\7n\2\2\u00c2\u00c3\7k\2\2\u00c3\u00c4\7i\2\2\u00c4\u00c5\7p\2\2"+
"\u00c5\26\3\2\2\2\u00c6\u00c7\7t\2\2\u00c7\u00c8\7g\2\2\u00c8\u00c9\7"+
"i\2\2\u00c9\u00ca\7k\2\2\u00ca\u00cb\7u\2\2\u00cb\u00cc\7v\2\2\u00cc\u00cd"+
"\7g\2\2\u00cd\u00ce\7t\2\2\u00ce\30\3\2\2\2\u00cf\u00d0\7k\2\2\u00d0\u00d1"+
"\7h\2\2\u00d1\32\3\2\2\2\u00d2\u00d3\7g\2\2\u00d3\u00d4\7n\2\2\u00d4\u00d5"+
"\7u\2\2\u00d5\u00d6\7g\2\2\u00d6\34\3\2\2\2\u00d7\u00d8\7y\2\2\u00d8\u00d9"+
"\7j\2\2\u00d9\u00da\7k\2\2\u00da\u00db\7n\2\2\u00db\u00dc\7g\2\2\u00dc"+
"\36\3\2\2\2\u00dd\u00de\7f\2\2\u00de\u00df\7q\2\2\u00df \3\2\2\2\u00e0"+
"\u00e1\7h\2\2\u00e1\u00e2\7q\2\2\u00e2\u00e3\7t\2\2\u00e3\"\3\2\2\2\u00e4"+
"\u00e5\7t\2\2\u00e5\u00e6\7g\2\2\u00e6\u00e7\7v\2\2\u00e7\u00e8\7w\2\2"+
"\u00e8\u00e9\7t\2\2\u00e9\u00ea\7p\2\2\u00ea$\3\2\2\2\u00eb\u00ec\7c\2"+
"\2\u00ec\u00ed\7u\2\2\u00ed\u00ee\7o\2\2\u00ee&\3\2\2\2\u00ef\u00f0\7"+
"<\2\2\u00f0(\3\2\2\2\u00f1\u00f2\7\60\2\2\u00f2\u00f3\7\60\2\2\u00f3*"+
"\3\2\2\2\u00f4\u00f5\7u\2\2\u00f5\u00f6\7k\2\2\u00f6\u00f7\7i\2\2\u00f7"+
"\u00f8\7p\2\2\u00f8\u00f9\7g\2\2\u00f9\u00fa\7f\2\2\u00fa,\3\2\2\2\u00fb"+
"\u00fc\7,\2\2\u00fc.\3\2\2\2\u00fd\u00fe\7]\2\2\u00fe\60\3\2\2\2\u00ff"+
"\u0100\7_\2\2\u0100\62\3\2\2\2\u0101\u0102\7/\2\2\u0102\u0103\7/\2\2\u0103"+
"\64\3\2\2\2\u0104\u0105\7-\2\2\u0105\u0106\7-\2\2\u0106\66\3\2\2\2\u0107"+
"\u0108\7-\2\2\u01088\3\2\2\2\u0109\u010a\7/\2\2\u010a:\3\2\2\2\u010b\u010c"+
"\7#\2\2\u010c<\3\2\2\2\u010d\u010e\7(\2\2\u010e>\3\2\2\2\u010f\u0110\7"+
"\u0080\2\2\u0110@\3\2\2\2\u0111\u0112\7@\2\2\u0112\u0113\7@\2\2\u0113"+
"B\3\2\2\2\u0114\u0115\7>\2\2\u0115\u0116\7>\2\2\u0116D\3\2\2\2\u0117\u0118"+
"\7\61\2\2\u0118F\3\2\2\2\u0119\u011a\7\'\2\2\u011aH\3\2\2\2\u011b\u011c"+
"\7>\2\2\u011cJ\3\2\2\2\u011d\u011e\7@\2\2\u011eL\3\2\2\2\u011f\u0120\7"+
"?\2\2\u0120\u0121\7?\2\2\u0121N\3\2\2\2\u0122\u0123\7#\2\2\u0123\u0124"+
"\7?\2\2\u0124P\3\2\2\2\u0125\u0126\7>\2\2\u0126\u0127\7?\2\2\u0127R\3"+
"\2\2\2\u0128\u0129\7@\2\2\u0129\u012a\7?\2\2\u012aT\3\2\2\2\u012b\u012c"+
"\7`\2\2\u012cV\3\2\2\2\u012d\u012e\7~\2\2\u012eX\3\2\2\2\u012f\u0130\7"+
"(\2\2\u0130\u0131\7(\2\2\u0131Z\3\2\2\2\u0132\u0133\7~\2\2\u0133\u0134"+
"\7~\2\2\u0134\\\3\2\2\2\u0135\u0136\7-\2\2\u0136\u0137\7?\2\2\u0137^\3"+
"\2\2\2\u0138\u0139\7/\2\2\u0139\u013a\7?\2\2\u013a`\3\2\2\2\u013b\u013c"+
"\7,\2\2\u013c\u013d\7?\2\2\u013db\3\2\2\2\u013e\u013f\7\61\2\2\u013f\u0140"+
"\7?\2\2\u0140d\3\2\2\2\u0141\u0142\7\'\2\2\u0142\u0143\7?\2\2\u0143f\3"+
"\2\2\2\u0144\u0145\7>\2\2\u0145\u0146\7>\2\2\u0146\u0147\7?\2\2\u0147"+
"h\3\2\2\2\u0148\u0149\7@\2\2\u0149\u014a\7@\2\2\u014a\u014b\7?\2\2\u014b"+
"j\3\2\2\2\u014c\u014d\7(\2\2\u014d\u014e\7?\2\2\u014el\3\2\2\2\u014f\u0150"+
"\7~\2\2\u0150\u0151\7?\2\2\u0151n\3\2\2\2\u0152\u0153\7`\2\2\u0153\u0154"+
"\7?\2\2\u0154p\3\2\2\2\u0155\u0156\7\60\2\2\u0156\u0157\7d\2\2\u0157\u0158"+
"\7{\2\2\u0158\u0159\7v\2\2\u0159\u015a\7g\2\2\u015ar\3\2\2\2\u015b\u015c"+
"\7%\2\2\u015ct\3\2\2\2\u015d\u015e\7d\2\2\u015e\u015f\7t\2\2\u015f\u023c"+
"\7m\2\2\u0160\u0161\7q\2\2\u0161\u0162\7t\2\2\u0162\u023c\7c\2\2\u0163"+
"\u0164\7m\2\2\u0164\u0165\7k\2\2\u0165\u023c\7n\2\2\u0166\u0167\7u\2\2"+
"\u0167\u0168\7n\2\2\u0168\u023c\7q\2\2\u0169\u016a\7p\2\2\u016a\u016b"+
"\7q\2\2\u016b\u023c\7r\2\2\u016c\u016d\7c\2\2\u016d\u016e\7u\2\2\u016e"+
"\u023c\7n\2\2\u016f\u0170\7r\2\2\u0170\u0171\7j\2\2\u0171\u023c\7r\2\2"+
"\u0172\u0173\7c\2\2\u0173\u0174\7p\2\2\u0174\u023c\7e\2\2\u0175\u0176"+
"\7d\2\2\u0176\u0177\7r\2\2\u0177\u023c\7n\2\2\u0178\u0179\7e\2\2\u0179"+
"\u017a\7n\2\2\u017a\u023c\7e\2\2\u017b\u017c\7l\2\2\u017c\u017d\7u\2\2"+
"\u017d\u023c\7t\2\2\u017e\u017f\7c\2\2\u017f\u0180\7p\2\2\u0180\u023c"+
"\7f\2\2\u0181\u0182\7t\2\2\u0182\u0183\7n\2\2\u0183\u023c\7c\2\2\u0184"+
"\u0185\7d\2\2\u0185\u0186\7k\2\2\u0186\u023c\7v\2\2\u0187\u0188\7t\2\2"+
"\u0188\u0189\7q\2\2\u0189\u023c\7n\2\2\u018a\u018b\7r\2\2\u018b\u018c"+
"\7n\2\2\u018c\u023c\7c\2\2\u018d\u018e\7r\2\2\u018e\u018f\7n\2\2\u018f"+
"\u023c\7r\2\2\u0190\u0191\7d\2\2\u0191\u0192\7o\2\2\u0192\u023c\7k\2\2"+
"\u0193\u0194\7u\2\2\u0194\u0195\7g\2\2\u0195\u023c\7e\2\2\u0196\u0197"+
"\7t\2\2\u0197\u0198\7v\2\2\u0198\u023c\7k\2\2\u0199\u019a\7g\2\2\u019a"+
"\u019b\7q\2\2\u019b\u023c\7t\2\2\u019c\u019d\7u\2\2\u019d\u019e\7t\2\2"+
"\u019e\u023c\7g\2\2\u019f\u01a0\7n\2\2\u01a0\u01a1\7u\2\2\u01a1\u023c"+
"\7t\2\2\u01a2\u01a3\7r\2\2\u01a3\u01a4\7j\2\2\u01a4\u023c\7c\2\2\u01a5"+
"\u01a6\7c\2\2\u01a6\u01a7\7n\2\2\u01a7\u023c\7t\2\2\u01a8\u01a9\7l\2\2"+
"\u01a9\u01aa\7o\2\2\u01aa\u023c\7r\2\2\u01ab\u01ac\7d\2\2\u01ac\u01ad"+
"\7x\2\2\u01ad\u023c\7e\2\2\u01ae\u01af\7e\2\2\u01af\u01b0\7n\2\2\u01b0"+
"\u023c\7k\2\2\u01b1\u01b2\7t\2\2\u01b2\u01b3\7v\2\2\u01b3\u023c\7u\2\2"+
"\u01b4\u01b5\7c\2\2\u01b5\u01b6\7f\2\2\u01b6\u023c\7e\2\2\u01b7\u01b8"+
"\7t\2\2\u01b8\u01b9\7t\2\2\u01b9\u023c\7c\2\2\u01ba\u01bb\7d\2\2\u01bb"+
"\u01bc\7x\2\2\u01bc\u023c\7u\2\2\u01bd\u01be\7u\2\2\u01be\u01bf\7g\2\2"+
"\u01bf\u023c\7k\2\2\u01c0\u01c1\7u\2\2\u01c1\u01c2\7c\2\2\u01c2\u023c"+
"\7z\2\2\u01c3\u01c4\7u\2\2\u01c4\u01c5\7v\2\2\u01c5\u023c\7{\2\2\u01c6"+
"\u01c7\7u\2\2\u01c7\u01c8\7v\2\2\u01c8\u023c\7c\2\2\u01c9\u01ca\7u\2\2"+
"\u01ca\u01cb\7v\2\2\u01cb\u023c\7z\2\2\u01cc\u01cd\7f\2\2\u01cd\u01ce"+
"\7g\2\2\u01ce\u023c\7{\2\2\u01cf\u01d0\7v\2\2\u01d0\u01d1\7z\2\2\u01d1"+
"\u023c\7c\2\2\u01d2\u01d3\7z\2\2\u01d3\u01d4\7c\2\2\u01d4\u023c\7c\2\2"+
"\u01d5\u01d6\7d\2\2\u01d6\u01d7\7e\2\2\u01d7\u023c\7e\2\2\u01d8\u01d9"+
"\7c\2\2\u01d9\u01da\7j\2\2\u01da\u023c\7z\2\2\u01db\u01dc\7v\2\2\u01dc"+
"\u01dd\7{\2\2\u01dd\u023c\7c\2\2\u01de\u01df\7v\2\2\u01df\u01e0\7z\2\2"+
"\u01e0\u023c\7u\2\2\u01e1\u01e2\7v\2\2\u01e2\u01e3\7c\2\2\u01e3\u023c"+
"\7u\2\2\u01e4\u01e5\7u\2\2\u01e5\u01e6\7j\2\2\u01e6\u023c\7{\2\2\u01e7"+
"\u01e8\7u\2\2\u01e8\u01e9\7j\2\2\u01e9\u023c\7z\2\2\u01ea\u01eb\7n\2\2"+
"\u01eb\u01ec\7f\2\2\u01ec\u023c\7{\2\2\u01ed\u01ee\7n\2\2\u01ee\u01ef"+
"\7f\2\2\u01ef\u023c\7c\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2\7f\2\2\u01f2"+
"\u023c\7z\2\2\u01f3\u01f4\7n\2\2\u01f4\u01f5\7c\2\2\u01f5\u023c\7z\2\2"+
"\u01f6\u01f7\7v\2\2\u01f7\u01f8\7c\2\2\u01f8\u023c\7{\2\2\u01f9\u01fa"+
"\7v\2\2\u01fa\u01fb\7c\2\2\u01fb\u023c\7z\2\2\u01fc\u01fd\7d\2\2\u01fd"+
"\u01fe\7e\2\2\u01fe\u023c\7u\2\2\u01ff\u0200\7e\2\2\u0200\u0201\7n\2\2"+
"\u0201\u023c\7x\2\2\u0202\u0203\7v\2\2\u0203\u0204\7u\2\2\u0204\u023c"+
"\7z\2\2\u0205\u0206\7n\2\2\u0206\u0207\7c\2\2\u0207\u023c\7u\2\2\u0208"+
"\u0209\7e\2\2\u0209\u020a\7r\2\2\u020a\u023c\7{\2\2\u020b\u020c\7e\2\2"+
"\u020c\u020d\7o\2\2\u020d\u023c\7r\2\2\u020e\u020f\7e\2\2\u020f\u0210"+
"\7r\2\2\u0210\u023c\7z\2\2\u0211\u0212\7f\2\2\u0212\u0213\7e\2\2\u0213"+
"\u023c\7r\2\2\u0214\u0215\7f\2\2\u0215\u0216\7g\2\2\u0216\u023c\7e\2\2"+
"\u0217\u0218\7k\2\2\u0218\u0219\7p\2\2\u0219\u023c\7e\2\2\u021a\u021b"+
"\7c\2\2\u021b\u021c\7z\2\2\u021c\u023c\7u\2\2\u021d\u021e\7d\2\2\u021e"+
"\u021f\7p\2\2\u021f\u023c\7g\2\2\u0220\u0221\7e\2\2\u0221\u0222\7n\2\2"+
"\u0222\u023c\7f\2\2\u0223\u0224\7u\2\2\u0224\u0225\7d\2\2\u0225\u023c"+
"\7e\2\2\u0226\u0227\7k\2\2\u0227\u0228\7u\2\2\u0228\u023c\7e\2\2\u0229"+
"\u022a\7k\2\2\u022a\u022b\7p\2\2\u022b\u023c\7z\2\2\u022c\u022d\7d\2\2"+
"\u022d\u022e\7g\2\2\u022e\u023c\7s\2\2\u022f\u0230\7u\2\2\u0230\u0231"+
"\7g\2\2\u0231\u023c\7f\2\2\u0232\u0233\7f\2\2\u0233\u0234\7g\2\2\u0234"+
"\u023c\7z\2\2\u0235\u0236\7k\2\2\u0236\u0237\7p\2\2\u0237\u023c\7{\2\2"+
"\u0238\u0239\7t\2\2\u0239\u023a\7q\2\2\u023a\u023c\7t\2\2\u023b\u015d"+
"\3\2\2\2\u023b\u0160\3\2\2\2\u023b\u0163\3\2\2\2\u023b\u0166\3\2\2\2\u023b"+
"\u0169\3\2\2\2\u023b\u016c\3\2\2\2\u023b\u016f\3\2\2\2\u023b\u0172\3\2"+
"\2\2\u023b\u0175\3\2\2\2\u023b\u0178\3\2\2\2\u023b\u017b\3\2\2\2\u023b"+
"\u017e\3\2\2\2\u023b\u0181\3\2\2\2\u023b\u0184\3\2\2\2\u023b\u0187\3\2"+
"\2\2\u023b\u018a\3\2\2\2\u023b\u018d\3\2\2\2\u023b\u0190\3\2\2\2\u023b"+
"\u0193\3\2\2\2\u023b\u0196\3\2\2\2\u023b\u0199\3\2\2\2\u023b\u019c\3\2"+
"\2\2\u023b\u019f\3\2\2\2\u023b\u01a2\3\2\2\2\u023b\u01a5\3\2\2\2\u023b"+
"\u01a8\3\2\2\2\u023b\u01ab\3\2\2\2\u023b\u01ae\3\2\2\2\u023b\u01b1\3\2"+
"\2\2\u023b\u01b4\3\2\2\2\u023b\u01b7\3\2\2\2\u023b\u01ba\3\2\2\2\u023b"+
"\u01bd\3\2\2\2\u023b\u01c0\3\2\2\2\u023b\u01c3\3\2\2\2\u023b\u01c6\3\2"+
"\2\2\u023b\u01c9\3\2\2\2\u023b\u01cc\3\2\2\2\u023b\u01cf\3\2\2\2\u023b"+
"\u01d2\3\2\2\2\u023b\u01d5\3\2\2\2\u023b\u01d8\3\2\2\2\u023b\u01db\3\2"+
"\2\2\u023b\u01de\3\2\2\2\u023b\u01e1\3\2\2\2\u023b\u01e4\3\2\2\2\u023b"+
"\u01e7\3\2\2\2\u023b\u01ea\3\2\2\2\u023b\u01ed\3\2\2\2\u023b\u01f0\3\2"+
"\2\2\u023b\u01f3\3\2\2\2\u023b\u01f6\3\2\2\2\u023b\u01f9\3\2\2\2\u023b"+
"\u01fc\3\2\2\2\u023b\u01ff\3\2\2\2\u023b\u0202\3\2\2\2\u023b\u0205\3\2"+
"\2\2\u023b\u0208\3\2\2\2\u023b\u020b\3\2\2\2\u023b\u020e\3\2\2\2\u023b"+
"\u0211\3\2\2\2\u023b\u0214\3\2\2\2\u023b\u0217\3\2\2\2\u023b\u021a\3\2"+
"\2\2\u023b\u021d\3\2\2\2\u023b\u0220\3\2\2\2\u023b\u0223\3\2\2\2\u023b"+
"\u0226\3\2\2\2\u023b\u0229\3\2\2\2\u023b\u022c\3\2\2\2\u023b\u022f\3\2"+
"\2\2\u023b\u0232\3\2\2\2\u023b\u0235\3\2\2\2\u023b\u0238\3\2\2\2\u023c"+
"v\3\2\2\2\u023d\u023e\7d\2\2\u023e\u023f\7{\2\2\u023f\u0240\7v\2\2\u0240"+
"\u0253\7g\2\2\u0241\u0242\7y\2\2\u0242\u0243\7q\2\2\u0243\u0244\7t\2\2"+
"\u0244\u0253\7f\2\2\u0245\u0246\7f\2\2\u0246\u0247\7y\2\2\u0247\u0248"+
"\7q\2\2\u0248\u0249\7t\2\2\u0249\u0253\7f\2\2\u024a\u024b\7d\2\2\u024b"+
"\u024c\7q\2\2\u024c\u024d\7q\2\2\u024d\u0253\7n\2\2\u024e\u024f\7x\2\2"+
"\u024f\u0250\7q\2\2\u0250\u0251\7k\2\2\u0251\u0253\7f\2\2\u0252\u023d"+
"\3\2\2\2\u0252\u0241\3\2\2\2\u0252\u0245\3\2\2\2\u0252\u024a\3\2\2\2\u0252"+
"\u024e\3\2\2\2\u0253x\3\2\2\2\u0254\u025a\7$\2\2\u0255\u0256\7^\2\2\u0256"+
"\u0259\7$\2\2\u0257\u0259\n\2\2\2\u0258\u0255\3\2\2\2\u0258\u0257\3\2"+
"\2\2\u0259\u025c\3\2\2\2\u025a\u0258\3\2\2\2\u025a\u025b\3\2\2\2\u025b"+
"\u025d\3\2\2\2\u025c\u025a\3\2\2\2\u025d\u025e\7$\2\2\u025ez\3\2\2\2\u025f"+
"\u0263\7)\2\2\u0260\u0261\7^\2\2\u0261\u0264\7)\2\2\u0262\u0264\n\3\2"+
"\2\u0263\u0260\3\2\2\2\u0263\u0262\3\2\2\2\u0264\u0265\3\2\2\2\u0265\u0266"+
"\7)\2\2\u0266|\3\2\2\2\u0267\u0268\7v\2\2\u0268\u0269\7t\2\2\u0269\u026a"+
"\7w\2\2\u026a\u0271\7g\2\2\u026b\u026c\7h\2\2\u026c\u026d\7c\2\2\u026d"+
"\u026e\7n\2\2\u026e\u026f\7u\2\2\u026f\u0271\7g\2\2\u0270\u0267\3\2\2"+
"\2\u0270\u026b\3\2\2\2\u0271~\3\2\2\2\u0272\u0275\5\u0081A\2\u0273\u0275"+
"\5\u0089E\2\u0274\u0272\3\2\2\2\u0274\u0273\3\2\2\2\u0275\u0080\3\2\2"+
"\2\u0276\u027a\5\u0083B\2\u0277\u027a\5\u0085C\2\u0278\u027a\5\u0087D"+
"\2\u0279\u0276\3\2\2\2\u0279\u0277\3\2\2\2\u0279\u0278\3\2\2\2\u027a\u0082"+
"\3\2\2\2\u027b\u0281\7\'\2\2\u027c\u027d\7\62\2\2\u027d\u0281\7d\2\2\u027e"+
"\u027f\7\62\2\2\u027f\u0281\7D\2\2\u0280\u027b\3\2\2\2\u0280\u027c\3\2"+
"\2\2\u0280\u027e\3\2\2\2\u0281\u0285\3\2\2\2\u0282\u0284\5\u0091I\2\u0283"+
"\u0282\3\2\2\2\u0284\u0287\3\2\2\2\u0285\u0283\3\2\2\2\u0285\u0286\3\2"+
"\2\2\u0286\u0288\3\2\2\2\u0287\u0285\3\2\2\2\u0288\u028a\7\60\2\2\u0289"+
"\u028b\5\u0091I\2\u028a\u0289\3\2\2\2\u028b\u028c\3\2\2\2\u028c\u028a"+
"\3\2\2\2\u028c\u028d\3\2\2\2\u028d\u0084\3\2\2\2\u028e\u0290\5\u0093J"+
"\2\u028f\u028e\3\2\2\2\u0290\u0293\3\2\2\2\u0291\u028f\3\2\2\2\u0291\u0292"+
"\3\2\2\2\u0292\u0294\3\2\2\2\u0293\u0291\3\2\2\2\u0294\u0296\7\60\2\2"+
"\u0295\u0297\5\u0093J\2\u0296\u0295\3\2\2\2\u0297\u0298\3\2\2\2\u0298"+
"\u0296\3\2\2\2\u0298\u0299\3\2\2\2\u0299\u0086\3\2\2\2\u029a\u02a0\7&"+
"\2\2\u029b\u029c\7\62\2\2\u029c\u02a0\7z\2\2\u029d\u029e\7\62\2\2\u029e"+
"\u02a0\7Z\2\2\u029f\u029a\3\2\2\2\u029f\u029b\3\2\2\2\u029f\u029d\3\2"+
"\2\2\u02a0\u02a4\3\2\2\2\u02a1\u02a3\5\u0095K\2\u02a2\u02a1\3\2\2\2\u02a3"+
"\u02a6\3\2\2\2\u02a4\u02a2\3\2\2\2\u02a4\u02a5\3\2\2\2\u02a5\u02a7\3\2"+
"\2\2\u02a6\u02a4\3\2\2\2\u02a7\u02a9\7\60\2\2\u02a8\u02aa\5\u0095K\2\u02a9"+
"\u02a8\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab\u02a9\3\2\2\2\u02ab\u02ac\3\2"+
"\2\2\u02ac\u0088\3\2\2\2\u02ad\u02b1\5\u008dG\2\u02ae\u02b1\5\u008fH\2"+
"\u02af\u02b1\5\u008bF\2\u02b0\u02ad\3\2\2\2\u02b0\u02ae\3\2\2\2\u02b0"+
"\u02af\3\2\2\2\u02b1\u008a\3\2\2\2\u02b2\u02b3\7\62\2\2\u02b3\u02b5\t"+
"\4\2\2\u02b4\u02b6\5\u0091I\2\u02b5\u02b4\3\2\2\2\u02b6\u02b7\3\2\2\2"+
"\u02b7\u02b5\3\2\2\2\u02b7\u02b8\3\2\2\2\u02b8\u02c0\3\2\2\2\u02b9\u02bb"+
"\7\'\2\2\u02ba\u02bc\5\u0091I\2\u02bb\u02ba\3\2\2\2\u02bc\u02bd\3\2\2"+
"\2\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2\u02be\u02c0\3\2\2\2\u02bf\u02b2"+
"\3\2\2\2\u02bf\u02b9\3\2\2\2\u02c0\u008c\3\2\2\2\u02c1\u02c3\5\u0093J"+
"\2\u02c2\u02c1\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u02c2\3\2\2\2\u02c4\u02c5"+
"\3\2\2\2\u02c5\u008e\3\2\2\2\u02c6\u02cc\7&\2\2\u02c7\u02c8\7\62\2\2\u02c8"+
"\u02cc\7z\2\2\u02c9\u02ca\7\62\2\2\u02ca\u02cc\7Z\2\2\u02cb\u02c6\3\2"+
"\2\2\u02cb\u02c7\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cc\u02ce\3\2\2\2\u02cd"+
"\u02cf\5\u0095K\2\u02ce\u02cd\3\2\2\2\u02cf\u02d0\3\2\2\2\u02d0\u02ce"+
"\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u0090\3\2\2\2\u02d2\u02d3\t\5\2\2\u02d3"+
"\u0092\3\2\2\2\u02d4\u02d5\t\6\2\2\u02d5\u0094\3\2\2\2\u02d6\u02d7\t\7"+
"\2\2\u02d7\u0096\3\2\2\2\u02d8\u02dc\5\u0099M\2\u02d9\u02db\5\u009bN\2"+
"\u02da\u02d9\3\2\2\2\u02db\u02de\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd"+
"\3\2\2\2\u02dd\u0098\3\2\2\2\u02de\u02dc\3\2\2\2\u02df\u02e0\t\b\2\2\u02e0"+
"\u009a\3\2\2\2\u02e1\u02e2\t\t\2\2\u02e2\u009c\3\2\2\2\u02e3\u02e7\7#"+
"\2\2\u02e4\u02e6\5\u009bN\2\u02e5\u02e4\3\2\2\2\u02e6\u02e9\3\2\2\2\u02e7"+
"\u02e5\3\2\2\2\u02e7\u02e8\3\2\2\2\u02e8\u02eb\3\2\2\2\u02e9\u02e7\3\2"+
"\2\2\u02ea\u02ec\t\n\2\2\u02eb\u02ea\3\2\2\2\u02ec\u02ed\3\2\2\2\u02ed"+
"\u02eb\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u009e\3\2\2\2\u02ef\u02f1\t\13"+
"\2\2\u02f0\u02ef\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f2"+
"\u02f3\3\2\2\2\u02f3\u02f4\3\2\2\2\u02f4\u02f5\bP\2\2\u02f5\u00a0\3\2"+
"\2\2\u02f6\u02f7\7\61\2\2\u02f7\u02f8\7\61\2\2\u02f8\u02fc\3\2\2\2\u02f9"+
"\u02fb\n\f\2\2\u02fa\u02f9\3\2\2\2\u02fb\u02fe\3\2\2\2\u02fc\u02fa\3\2"+
"\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02ff\3\2\2\2\u02fe\u02fc\3\2\2\2\u02ff"+
"\u0300\bQ\2\2\u0300\u00a2\3\2\2\2\u0301\u0302\7\61\2\2\u0302\u0303\7,"+
"\2\2\u0303\u0307\3\2\2\2\u0304\u0306\13\2\2\2\u0305\u0304\3\2\2\2\u0306"+
"\u0309\3\2\2\2\u0307\u0308\3\2\2\2\u0307\u0305\3\2\2\2\u0308\u030a\3\2"+
"\2\2\u0309\u0307\3\2\2\2\u030a\u030b\7,\2\2\u030b\u030c\7\61\2\2\u030c"+
"\u030d\3\2\2\2\u030d\u030e\bR\2\2\u030e\u00a4\3\2\2\2 \2\u023b\u0252\u0258"+
"\u025a\u0263\u0270\u0274\u0279\u0280\u0285\u028c\u0291\u0298\u029f\u02a4"+
"\u02ab\u02b0\u02b7\u02bd\u02bf\u02c4\u02cb\u02d0\u02dc\u02e7\u02ed\u02f2"+
"\u02fc\u0307\3\b\2\2";
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\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\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f"+
"\3\f\3\f\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\16\3\16\3\16"+
"\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21"+
"\3\22\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\25\3\25\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30"+
"\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\36"+
"\3\36\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\60\3\60\3\60\3\61\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64"+
"\3\64\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\67\3\67\3\67\38\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<\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<\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<"+
"\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<\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<\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<\5<\u0245\n<\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3=\3="+
"\3=\3=\3=\3=\3=\5=\u025c\n=\3>\3>\3>\3>\7>\u0262\n>\f>\16>\u0265\13>\3"+
">\3>\3?\3?\3?\3?\5?\u026d\n?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\5@\u027a"+
"\n@\3A\3A\5A\u027e\nA\3B\3B\3B\5B\u0283\nB\3C\3C\3C\3C\3C\5C\u028a\nC"+
"\3C\7C\u028d\nC\fC\16C\u0290\13C\3C\3C\6C\u0294\nC\rC\16C\u0295\3D\7D"+
"\u0299\nD\fD\16D\u029c\13D\3D\3D\6D\u02a0\nD\rD\16D\u02a1\3E\3E\3E\3E"+
"\3E\5E\u02a9\nE\3E\7E\u02ac\nE\fE\16E\u02af\13E\3E\3E\6E\u02b3\nE\rE\16"+
"E\u02b4\3F\3F\3F\5F\u02ba\nF\3G\3G\3G\6G\u02bf\nG\rG\16G\u02c0\3G\3G\6"+
"G\u02c5\nG\rG\16G\u02c6\5G\u02c9\nG\3H\6H\u02cc\nH\rH\16H\u02cd\3I\3I"+
"\3I\3I\3I\5I\u02d5\nI\3I\6I\u02d8\nI\rI\16I\u02d9\3J\3J\3K\3K\3L\3L\3"+
"M\3M\7M\u02e4\nM\fM\16M\u02e7\13M\3N\3N\3O\3O\3P\3P\7P\u02ef\nP\fP\16"+
"P\u02f2\13P\3P\6P\u02f5\nP\rP\16P\u02f6\3Q\6Q\u02fa\nQ\rQ\16Q\u02fb\3"+
"Q\3Q\3R\3R\3R\3R\7R\u0304\nR\fR\16R\u0307\13R\3R\3R\3S\3S\3S\3S\7S\u030f"+
"\nS\fS\16S\u0312\13S\3S\3S\3S\3S\3S\3\u0310\2T\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\u0081"+
"B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093\2\u0095"+
"\2\u0097\2\u0099K\u009b\2\u009d\2\u009fL\u00a1M\u00a3N\u00a5O\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--//\5\2\13\f\17\17\"\"\4\2\f\f\17\17\2\u037f\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\2%\3\2\2\2\2"+
"\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2"+
"\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2"+
"\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K"+
"\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2"+
"\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2"+
"\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q"+
"\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2"+
"\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087"+
"\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2"+
"\2\2\u0091\3\2\2\2\2\u0099\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+
"\3\2\2\2\2\u00a5\3\2\2\2\3\u00a7\3\2\2\2\5\u00ae\3\2\2\2\7\u00b0\3\2\2"+
"\2\t\u00b2\3\2\2\2\13\u00b4\3\2\2\2\r\u00b6\3\2\2\2\17\u00b8\3\2\2\2\21"+
"\u00ba\3\2\2\2\23\u00bc\3\2\2\2\25\u00c2\3\2\2\2\27\u00c8\3\2\2\2\31\u00d1"+
"\3\2\2\2\33\u00d8\3\2\2\2\35\u00db\3\2\2\2\37\u00e0\3\2\2\2!\u00e6\3\2"+
"\2\2#\u00e9\3\2\2\2%\u00ed\3\2\2\2\'\u00f4\3\2\2\2)\u00f8\3\2\2\2+\u00fa"+
"\3\2\2\2-\u00fd\3\2\2\2/\u0104\3\2\2\2\61\u0106\3\2\2\2\63\u0108\3\2\2"+
"\2\65\u010a\3\2\2\2\67\u010d\3\2\2\29\u0110\3\2\2\2;\u0112\3\2\2\2=\u0114"+
"\3\2\2\2?\u0116\3\2\2\2A\u0118\3\2\2\2C\u011a\3\2\2\2E\u011d\3\2\2\2G"+
"\u0120\3\2\2\2I\u0122\3\2\2\2K\u0124\3\2\2\2M\u0126\3\2\2\2O\u0128\3\2"+
"\2\2Q\u012b\3\2\2\2S\u012e\3\2\2\2U\u0131\3\2\2\2W\u0134\3\2\2\2Y\u0136"+
"\3\2\2\2[\u0138\3\2\2\2]\u013b\3\2\2\2_\u013e\3\2\2\2a\u0141\3\2\2\2c"+
"\u0144\3\2\2\2e\u0147\3\2\2\2g\u014a\3\2\2\2i\u014d\3\2\2\2k\u0151\3\2"+
"\2\2m\u0155\3\2\2\2o\u0158\3\2\2\2q\u015b\3\2\2\2s\u015e\3\2\2\2u\u0164"+
"\3\2\2\2w\u0244\3\2\2\2y\u025b\3\2\2\2{\u025d\3\2\2\2}\u0268\3\2\2\2\177"+
"\u0279\3\2\2\2\u0081\u027d\3\2\2\2\u0083\u0282\3\2\2\2\u0085\u0289\3\2"+
"\2\2\u0087\u029a\3\2\2\2\u0089\u02a8\3\2\2\2\u008b\u02b9\3\2\2\2\u008d"+
"\u02c8\3\2\2\2\u008f\u02cb\3\2\2\2\u0091\u02d4\3\2\2\2\u0093\u02db\3\2"+
"\2\2\u0095\u02dd\3\2\2\2\u0097\u02df\3\2\2\2\u0099\u02e1\3\2\2\2\u009b"+
"\u02e8\3\2\2\2\u009d\u02ea\3\2\2\2\u009f\u02ec\3\2\2\2\u00a1\u02f9\3\2"+
"\2\2\u00a3\u02ff\3\2\2\2\u00a5\u030a\3\2\2\2\u00a7\u00a8\7k\2\2\u00a8"+
"\u00a9\7o\2\2\u00a9\u00aa\7r\2\2\u00aa\u00ab\7q\2\2\u00ab\u00ac\7t\2\2"+
"\u00ac\u00ad\7v\2\2\u00ad\4\3\2\2\2\u00ae\u00af\7?\2\2\u00af\6\3\2\2\2"+
"\u00b0\u00b1\7=\2\2\u00b1\b\3\2\2\2\u00b2\u00b3\7*\2\2\u00b3\n\3\2\2\2"+
"\u00b4\u00b5\7+\2\2\u00b5\f\3\2\2\2\u00b6\u00b7\7}\2\2\u00b7\16\3\2\2"+
"\2\u00b8\u00b9\7\177\2\2\u00b9\20\3\2\2\2\u00ba\u00bb\7.\2\2\u00bb\22"+
"\3\2\2\2\u00bc\u00bd\7e\2\2\u00bd\u00be\7q\2\2\u00be\u00bf\7p\2\2\u00bf"+
"\u00c0\7u\2\2\u00c0\u00c1\7v\2\2\u00c1\24\3\2\2\2\u00c2\u00c3\7c\2\2\u00c3"+
"\u00c4\7n\2\2\u00c4\u00c5\7k\2\2\u00c5\u00c6\7i\2\2\u00c6\u00c7\7p\2\2"+
"\u00c7\26\3\2\2\2\u00c8\u00c9\7t\2\2\u00c9\u00ca\7g\2\2\u00ca\u00cb\7"+
"i\2\2\u00cb\u00cc\7k\2\2\u00cc\u00cd\7u\2\2\u00cd\u00ce\7v\2\2\u00ce\u00cf"+
"\7g\2\2\u00cf\u00d0\7t\2\2\u00d0\30\3\2\2\2\u00d1\u00d2\7k\2\2\u00d2\u00d3"+
"\7p\2\2\u00d3\u00d4\7n\2\2\u00d4\u00d5\7k\2\2\u00d5\u00d6\7p\2\2\u00d6"+
"\u00d7\7g\2\2\u00d7\32\3\2\2\2\u00d8\u00d9\7k\2\2\u00d9\u00da\7h\2\2\u00da"+
"\34\3\2\2\2\u00db\u00dc\7g\2\2\u00dc\u00dd\7n\2\2\u00dd\u00de\7u\2\2\u00de"+
"\u00df\7g\2\2\u00df\36\3\2\2\2\u00e0\u00e1\7y\2\2\u00e1\u00e2\7j\2\2\u00e2"+
"\u00e3\7k\2\2\u00e3\u00e4\7n\2\2\u00e4\u00e5\7g\2\2\u00e5 \3\2\2\2\u00e6"+
"\u00e7\7f\2\2\u00e7\u00e8\7q\2\2\u00e8\"\3\2\2\2\u00e9\u00ea\7h\2\2\u00ea"+
"\u00eb\7q\2\2\u00eb\u00ec\7t\2\2\u00ec$\3\2\2\2\u00ed\u00ee\7t\2\2\u00ee"+
"\u00ef\7g\2\2\u00ef\u00f0\7v\2\2\u00f0\u00f1\7w\2\2\u00f1\u00f2\7t\2\2"+
"\u00f2\u00f3\7p\2\2\u00f3&\3\2\2\2\u00f4\u00f5\7c\2\2\u00f5\u00f6\7u\2"+
"\2\u00f6\u00f7\7o\2\2\u00f7(\3\2\2\2\u00f8\u00f9\7<\2\2\u00f9*\3\2\2\2"+
"\u00fa\u00fb\7\60\2\2\u00fb\u00fc\7\60\2\2\u00fc,\3\2\2\2\u00fd\u00fe"+
"\7u\2\2\u00fe\u00ff\7k\2\2\u00ff\u0100\7i\2\2\u0100\u0101\7p\2\2\u0101"+
"\u0102\7g\2\2\u0102\u0103\7f\2\2\u0103.\3\2\2\2\u0104\u0105\7,\2\2\u0105"+
"\60\3\2\2\2\u0106\u0107\7]\2\2\u0107\62\3\2\2\2\u0108\u0109\7_\2\2\u0109"+
"\64\3\2\2\2\u010a\u010b\7/\2\2\u010b\u010c\7/\2\2\u010c\66\3\2\2\2\u010d"+
"\u010e\7-\2\2\u010e\u010f\7-\2\2\u010f8\3\2\2\2\u0110\u0111\7-\2\2\u0111"+
":\3\2\2\2\u0112\u0113\7/\2\2\u0113<\3\2\2\2\u0114\u0115\7#\2\2\u0115>"+
"\3\2\2\2\u0116\u0117\7(\2\2\u0117@\3\2\2\2\u0118\u0119\7\u0080\2\2\u0119"+
"B\3\2\2\2\u011a\u011b\7@\2\2\u011b\u011c\7@\2\2\u011cD\3\2\2\2\u011d\u011e"+
"\7>\2\2\u011e\u011f\7>\2\2\u011fF\3\2\2\2\u0120\u0121\7\61\2\2\u0121H"+
"\3\2\2\2\u0122\u0123\7\'\2\2\u0123J\3\2\2\2\u0124\u0125\7>\2\2\u0125L"+
"\3\2\2\2\u0126\u0127\7@\2\2\u0127N\3\2\2\2\u0128\u0129\7?\2\2\u0129\u012a"+
"\7?\2\2\u012aP\3\2\2\2\u012b\u012c\7#\2\2\u012c\u012d\7?\2\2\u012dR\3"+
"\2\2\2\u012e\u012f\7>\2\2\u012f\u0130\7?\2\2\u0130T\3\2\2\2\u0131\u0132"+
"\7@\2\2\u0132\u0133\7?\2\2\u0133V\3\2\2\2\u0134\u0135\7`\2\2\u0135X\3"+
"\2\2\2\u0136\u0137\7~\2\2\u0137Z\3\2\2\2\u0138\u0139\7(\2\2\u0139\u013a"+
"\7(\2\2\u013a\\\3\2\2\2\u013b\u013c\7~\2\2\u013c\u013d\7~\2\2\u013d^\3"+
"\2\2\2\u013e\u013f\7-\2\2\u013f\u0140\7?\2\2\u0140`\3\2\2\2\u0141\u0142"+
"\7/\2\2\u0142\u0143\7?\2\2\u0143b\3\2\2\2\u0144\u0145\7,\2\2\u0145\u0146"+
"\7?\2\2\u0146d\3\2\2\2\u0147\u0148\7\61\2\2\u0148\u0149\7?\2\2\u0149f"+
"\3\2\2\2\u014a\u014b\7\'\2\2\u014b\u014c\7?\2\2\u014ch\3\2\2\2\u014d\u014e"+
"\7>\2\2\u014e\u014f\7>\2\2\u014f\u0150\7?\2\2\u0150j\3\2\2\2\u0151\u0152"+
"\7@\2\2\u0152\u0153\7@\2\2\u0153\u0154\7?\2\2\u0154l\3\2\2\2\u0155\u0156"+
"\7(\2\2\u0156\u0157\7?\2\2\u0157n\3\2\2\2\u0158\u0159\7~\2\2\u0159\u015a"+
"\7?\2\2\u015ap\3\2\2\2\u015b\u015c\7`\2\2\u015c\u015d\7?\2\2\u015dr\3"+
"\2\2\2\u015e\u015f\7\60\2\2\u015f\u0160\7d\2\2\u0160\u0161\7{\2\2\u0161"+
"\u0162\7v\2\2\u0162\u0163\7g\2\2\u0163t\3\2\2\2\u0164\u0165\7%\2\2\u0165"+
"v\3\2\2\2\u0166\u0167\7d\2\2\u0167\u0168\7t\2\2\u0168\u0245\7m\2\2\u0169"+
"\u016a\7q\2\2\u016a\u016b\7t\2\2\u016b\u0245\7c\2\2\u016c\u016d\7m\2\2"+
"\u016d\u016e\7k\2\2\u016e\u0245\7n\2\2\u016f\u0170\7u\2\2\u0170\u0171"+
"\7n\2\2\u0171\u0245\7q\2\2\u0172\u0173\7p\2\2\u0173\u0174\7q\2\2\u0174"+
"\u0245\7r\2\2\u0175\u0176\7c\2\2\u0176\u0177\7u\2\2\u0177\u0245\7n\2\2"+
"\u0178\u0179\7r\2\2\u0179\u017a\7j\2\2\u017a\u0245\7r\2\2\u017b\u017c"+
"\7c\2\2\u017c\u017d\7p\2\2\u017d\u0245\7e\2\2\u017e\u017f\7d\2\2\u017f"+
"\u0180\7r\2\2\u0180\u0245\7n\2\2\u0181\u0182\7e\2\2\u0182\u0183\7n\2\2"+
"\u0183\u0245\7e\2\2\u0184\u0185\7l\2\2\u0185\u0186\7u\2\2\u0186\u0245"+
"\7t\2\2\u0187\u0188\7c\2\2\u0188\u0189\7p\2\2\u0189\u0245\7f\2\2\u018a"+
"\u018b\7t\2\2\u018b\u018c\7n\2\2\u018c\u0245\7c\2\2\u018d\u018e\7d\2\2"+
"\u018e\u018f\7k\2\2\u018f\u0245\7v\2\2\u0190\u0191\7t\2\2\u0191\u0192"+
"\7q\2\2\u0192\u0245\7n\2\2\u0193\u0194\7r\2\2\u0194\u0195\7n\2\2\u0195"+
"\u0245\7c\2\2\u0196\u0197\7r\2\2\u0197\u0198\7n\2\2\u0198\u0245\7r\2\2"+
"\u0199\u019a\7d\2\2\u019a\u019b\7o\2\2\u019b\u0245\7k\2\2\u019c\u019d"+
"\7u\2\2\u019d\u019e\7g\2\2\u019e\u0245\7e\2\2\u019f\u01a0\7t\2\2\u01a0"+
"\u01a1\7v\2\2\u01a1\u0245\7k\2\2\u01a2\u01a3\7g\2\2\u01a3\u01a4\7q\2\2"+
"\u01a4\u0245\7t\2\2\u01a5\u01a6\7u\2\2\u01a6\u01a7\7t\2\2\u01a7\u0245"+
"\7g\2\2\u01a8\u01a9\7n\2\2\u01a9\u01aa\7u\2\2\u01aa\u0245\7t\2\2\u01ab"+
"\u01ac\7r\2\2\u01ac\u01ad\7j\2\2\u01ad\u0245\7c\2\2\u01ae\u01af\7c\2\2"+
"\u01af\u01b0\7n\2\2\u01b0\u0245\7t\2\2\u01b1\u01b2\7l\2\2\u01b2\u01b3"+
"\7o\2\2\u01b3\u0245\7r\2\2\u01b4\u01b5\7d\2\2\u01b5\u01b6\7x\2\2\u01b6"+
"\u0245\7e\2\2\u01b7\u01b8\7e\2\2\u01b8\u01b9\7n\2\2\u01b9\u0245\7k\2\2"+
"\u01ba\u01bb\7t\2\2\u01bb\u01bc\7v\2\2\u01bc\u0245\7u\2\2\u01bd\u01be"+
"\7c\2\2\u01be\u01bf\7f\2\2\u01bf\u0245\7e\2\2\u01c0\u01c1\7t\2\2\u01c1"+
"\u01c2\7t\2\2\u01c2\u0245\7c\2\2\u01c3\u01c4\7d\2\2\u01c4\u01c5\7x\2\2"+
"\u01c5\u0245\7u\2\2\u01c6\u01c7\7u\2\2\u01c7\u01c8\7g\2\2\u01c8\u0245"+
"\7k\2\2\u01c9\u01ca\7u\2\2\u01ca\u01cb\7c\2\2\u01cb\u0245\7z\2\2\u01cc"+
"\u01cd\7u\2\2\u01cd\u01ce\7v\2\2\u01ce\u0245\7{\2\2\u01cf\u01d0\7u\2\2"+
"\u01d0\u01d1\7v\2\2\u01d1\u0245\7c\2\2\u01d2\u01d3\7u\2\2\u01d3\u01d4"+
"\7v\2\2\u01d4\u0245\7z\2\2\u01d5\u01d6\7f\2\2\u01d6\u01d7\7g\2\2\u01d7"+
"\u0245\7{\2\2\u01d8\u01d9\7v\2\2\u01d9\u01da\7z\2\2\u01da\u0245\7c\2\2"+
"\u01db\u01dc\7z\2\2\u01dc\u01dd\7c\2\2\u01dd\u0245\7c\2\2\u01de\u01df"+
"\7d\2\2\u01df\u01e0\7e\2\2\u01e0\u0245\7e\2\2\u01e1\u01e2\7c\2\2\u01e2"+
"\u01e3\7j\2\2\u01e3\u0245\7z\2\2\u01e4\u01e5\7v\2\2\u01e5\u01e6\7{\2\2"+
"\u01e6\u0245\7c\2\2\u01e7\u01e8\7v\2\2\u01e8\u01e9\7z\2\2\u01e9\u0245"+
"\7u\2\2\u01ea\u01eb\7v\2\2\u01eb\u01ec\7c\2\2\u01ec\u0245\7u\2\2\u01ed"+
"\u01ee\7u\2\2\u01ee\u01ef\7j\2\2\u01ef\u0245\7{\2\2\u01f0\u01f1\7u\2\2"+
"\u01f1\u01f2\7j\2\2\u01f2\u0245\7z\2\2\u01f3\u01f4\7n\2\2\u01f4\u01f5"+
"\7f\2\2\u01f5\u0245\7{\2\2\u01f6\u01f7\7n\2\2\u01f7\u01f8\7f\2\2\u01f8"+
"\u0245\7c\2\2\u01f9\u01fa\7n\2\2\u01fa\u01fb\7f\2\2\u01fb\u0245\7z\2\2"+
"\u01fc\u01fd\7n\2\2\u01fd\u01fe\7c\2\2\u01fe\u0245\7z\2\2\u01ff\u0200"+
"\7v\2\2\u0200\u0201\7c\2\2\u0201\u0245\7{\2\2\u0202\u0203\7v\2\2\u0203"+
"\u0204\7c\2\2\u0204\u0245\7z\2\2\u0205\u0206\7d\2\2\u0206\u0207\7e\2\2"+
"\u0207\u0245\7u\2\2\u0208\u0209\7e\2\2\u0209\u020a\7n\2\2\u020a\u0245"+
"\7x\2\2\u020b\u020c\7v\2\2\u020c\u020d\7u\2\2\u020d\u0245\7z\2\2\u020e"+
"\u020f\7n\2\2\u020f\u0210\7c\2\2\u0210\u0245\7u\2\2\u0211\u0212\7e\2\2"+
"\u0212\u0213\7r\2\2\u0213\u0245\7{\2\2\u0214\u0215\7e\2\2\u0215\u0216"+
"\7o\2\2\u0216\u0245\7r\2\2\u0217\u0218\7e\2\2\u0218\u0219\7r\2\2\u0219"+
"\u0245\7z\2\2\u021a\u021b\7f\2\2\u021b\u021c\7e\2\2\u021c\u0245\7r\2\2"+
"\u021d\u021e\7f\2\2\u021e\u021f\7g\2\2\u021f\u0245\7e\2\2\u0220\u0221"+
"\7k\2\2\u0221\u0222\7p\2\2\u0222\u0245\7e\2\2\u0223\u0224\7c\2\2\u0224"+
"\u0225\7z\2\2\u0225\u0245\7u\2\2\u0226\u0227\7d\2\2\u0227\u0228\7p\2\2"+
"\u0228\u0245\7g\2\2\u0229\u022a\7e\2\2\u022a\u022b\7n\2\2\u022b\u0245"+
"\7f\2\2\u022c\u022d\7u\2\2\u022d\u022e\7d\2\2\u022e\u0245\7e\2\2\u022f"+
"\u0230\7k\2\2\u0230\u0231\7u\2\2\u0231\u0245\7e\2\2\u0232\u0233\7k\2\2"+
"\u0233\u0234\7p\2\2\u0234\u0245\7z\2\2\u0235\u0236\7d\2\2\u0236\u0237"+
"\7g\2\2\u0237\u0245\7s\2\2\u0238\u0239\7u\2\2\u0239\u023a\7g\2\2\u023a"+
"\u0245\7f\2\2\u023b\u023c\7f\2\2\u023c\u023d\7g\2\2\u023d\u0245\7z\2\2"+
"\u023e\u023f\7k\2\2\u023f\u0240\7p\2\2\u0240\u0245\7{\2\2\u0241\u0242"+
"\7t\2\2\u0242\u0243\7q\2\2\u0243\u0245\7t\2\2\u0244\u0166\3\2\2\2\u0244"+
"\u0169\3\2\2\2\u0244\u016c\3\2\2\2\u0244\u016f\3\2\2\2\u0244\u0172\3\2"+
"\2\2\u0244\u0175\3\2\2\2\u0244\u0178\3\2\2\2\u0244\u017b\3\2\2\2\u0244"+
"\u017e\3\2\2\2\u0244\u0181\3\2\2\2\u0244\u0184\3\2\2\2\u0244\u0187\3\2"+
"\2\2\u0244\u018a\3\2\2\2\u0244\u018d\3\2\2\2\u0244\u0190\3\2\2\2\u0244"+
"\u0193\3\2\2\2\u0244\u0196\3\2\2\2\u0244\u0199\3\2\2\2\u0244\u019c\3\2"+
"\2\2\u0244\u019f\3\2\2\2\u0244\u01a2\3\2\2\2\u0244\u01a5\3\2\2\2\u0244"+
"\u01a8\3\2\2\2\u0244\u01ab\3\2\2\2\u0244\u01ae\3\2\2\2\u0244\u01b1\3\2"+
"\2\2\u0244\u01b4\3\2\2\2\u0244\u01b7\3\2\2\2\u0244\u01ba\3\2\2\2\u0244"+
"\u01bd\3\2\2\2\u0244\u01c0\3\2\2\2\u0244\u01c3\3\2\2\2\u0244\u01c6\3\2"+
"\2\2\u0244\u01c9\3\2\2\2\u0244\u01cc\3\2\2\2\u0244\u01cf\3\2\2\2\u0244"+
"\u01d2\3\2\2\2\u0244\u01d5\3\2\2\2\u0244\u01d8\3\2\2\2\u0244\u01db\3\2"+
"\2\2\u0244\u01de\3\2\2\2\u0244\u01e1\3\2\2\2\u0244\u01e4\3\2\2\2\u0244"+
"\u01e7\3\2\2\2\u0244\u01ea\3\2\2\2\u0244\u01ed\3\2\2\2\u0244\u01f0\3\2"+
"\2\2\u0244\u01f3\3\2\2\2\u0244\u01f6\3\2\2\2\u0244\u01f9\3\2\2\2\u0244"+
"\u01fc\3\2\2\2\u0244\u01ff\3\2\2\2\u0244\u0202\3\2\2\2\u0244\u0205\3\2"+
"\2\2\u0244\u0208\3\2\2\2\u0244\u020b\3\2\2\2\u0244\u020e\3\2\2\2\u0244"+
"\u0211\3\2\2\2\u0244\u0214\3\2\2\2\u0244\u0217\3\2\2\2\u0244\u021a\3\2"+
"\2\2\u0244\u021d\3\2\2\2\u0244\u0220\3\2\2\2\u0244\u0223\3\2\2\2\u0244"+
"\u0226\3\2\2\2\u0244\u0229\3\2\2\2\u0244\u022c\3\2\2\2\u0244\u022f\3\2"+
"\2\2\u0244\u0232\3\2\2\2\u0244\u0235\3\2\2\2\u0244\u0238\3\2\2\2\u0244"+
"\u023b\3\2\2\2\u0244\u023e\3\2\2\2\u0244\u0241\3\2\2\2\u0245x\3\2\2\2"+
"\u0246\u0247\7d\2\2\u0247\u0248\7{\2\2\u0248\u0249\7v\2\2\u0249\u025c"+
"\7g\2\2\u024a\u024b\7y\2\2\u024b\u024c\7q\2\2\u024c\u024d\7t\2\2\u024d"+
"\u025c\7f\2\2\u024e\u024f\7f\2\2\u024f\u0250\7y\2\2\u0250\u0251\7q\2\2"+
"\u0251\u0252\7t\2\2\u0252\u025c\7f\2\2\u0253\u0254\7d\2\2\u0254\u0255"+
"\7q\2\2\u0255\u0256\7q\2\2\u0256\u025c\7n\2\2\u0257\u0258\7x\2\2\u0258"+
"\u0259\7q\2\2\u0259\u025a\7k\2\2\u025a\u025c\7f\2\2\u025b\u0246\3\2\2"+
"\2\u025b\u024a\3\2\2\2\u025b\u024e\3\2\2\2\u025b\u0253\3\2\2\2\u025b\u0257"+
"\3\2\2\2\u025cz\3\2\2\2\u025d\u0263\7$\2\2\u025e\u025f\7^\2\2\u025f\u0262"+
"\7$\2\2\u0260\u0262\n\2\2\2\u0261\u025e\3\2\2\2\u0261\u0260\3\2\2\2\u0262"+
"\u0265\3\2\2\2\u0263\u0261\3\2\2\2\u0263\u0264\3\2\2\2\u0264\u0266\3\2"+
"\2\2\u0265\u0263\3\2\2\2\u0266\u0267\7$\2\2\u0267|\3\2\2\2\u0268\u026c"+
"\7)\2\2\u0269\u026a\7^\2\2\u026a\u026d\7)\2\2\u026b\u026d\n\3\2\2\u026c"+
"\u0269\3\2\2\2\u026c\u026b\3\2\2\2\u026d\u026e\3\2\2\2\u026e\u026f\7)"+
"\2\2\u026f~\3\2\2\2\u0270\u0271\7v\2\2\u0271\u0272\7t\2\2\u0272\u0273"+
"\7w\2\2\u0273\u027a\7g\2\2\u0274\u0275\7h\2\2\u0275\u0276\7c\2\2\u0276"+
"\u0277\7n\2\2\u0277\u0278\7u\2\2\u0278\u027a\7g\2\2\u0279\u0270\3\2\2"+
"\2\u0279\u0274\3\2\2\2\u027a\u0080\3\2\2\2\u027b\u027e\5\u0083B\2\u027c"+
"\u027e\5\u008bF\2\u027d\u027b\3\2\2\2\u027d\u027c\3\2\2\2\u027e\u0082"+
"\3\2\2\2\u027f\u0283\5\u0085C\2\u0280\u0283\5\u0087D\2\u0281\u0283\5\u0089"+
"E\2\u0282\u027f\3\2\2\2\u0282\u0280\3\2\2\2\u0282\u0281\3\2\2\2\u0283"+
"\u0084\3\2\2\2\u0284\u028a\7\'\2\2\u0285\u0286\7\62\2\2\u0286\u028a\7"+
"d\2\2\u0287\u0288\7\62\2\2\u0288\u028a\7D\2\2\u0289\u0284\3\2\2\2\u0289"+
"\u0285\3\2\2\2\u0289\u0287\3\2\2\2\u028a\u028e\3\2\2\2\u028b\u028d\5\u0093"+
"J\2\u028c\u028b\3\2\2\2\u028d\u0290\3\2\2\2\u028e\u028c\3\2\2\2\u028e"+
"\u028f\3\2\2\2\u028f\u0291\3\2\2\2\u0290\u028e\3\2\2\2\u0291\u0293\7\60"+
"\2\2\u0292\u0294\5\u0093J\2\u0293\u0292\3\2\2\2\u0294\u0295\3\2\2\2\u0295"+
"\u0293\3\2\2\2\u0295\u0296\3\2\2\2\u0296\u0086\3\2\2\2\u0297\u0299\5\u0095"+
"K\2\u0298\u0297\3\2\2\2\u0299\u029c\3\2\2\2\u029a\u0298\3\2\2\2\u029a"+
"\u029b\3\2\2\2\u029b\u029d\3\2\2\2\u029c\u029a\3\2\2\2\u029d\u029f\7\60"+
"\2\2\u029e\u02a0\5\u0095K\2\u029f\u029e\3\2\2\2\u02a0\u02a1\3\2\2\2\u02a1"+
"\u029f\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2\u0088\3\2\2\2\u02a3\u02a9\7&"+
"\2\2\u02a4\u02a5\7\62\2\2\u02a5\u02a9\7z\2\2\u02a6\u02a7\7\62\2\2\u02a7"+
"\u02a9\7Z\2\2\u02a8\u02a3\3\2\2\2\u02a8\u02a4\3\2\2\2\u02a8\u02a6\3\2"+
"\2\2\u02a9\u02ad\3\2\2\2\u02aa\u02ac\5\u0097L\2\u02ab\u02aa\3\2\2\2\u02ac"+
"\u02af\3\2\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ae\3\2\2\2\u02ae\u02b0\3\2"+
"\2\2\u02af\u02ad\3\2\2\2\u02b0\u02b2\7\60\2\2\u02b1\u02b3\5\u0097L\2\u02b2"+
"\u02b1\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2"+
"\2\2\u02b5\u008a\3\2\2\2\u02b6\u02ba\5\u008fH\2\u02b7\u02ba\5\u0091I\2"+
"\u02b8\u02ba\5\u008dG\2\u02b9\u02b6\3\2\2\2\u02b9\u02b7\3\2\2\2\u02b9"+
"\u02b8\3\2\2\2\u02ba\u008c\3\2\2\2\u02bb\u02bc\7\62\2\2\u02bc\u02be\t"+
"\4\2\2\u02bd\u02bf\5\u0093J\2\u02be\u02bd\3\2\2\2\u02bf\u02c0\3\2\2\2"+
"\u02c0\u02be\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02c9\3\2\2\2\u02c2\u02c4"+
"\7\'\2\2\u02c3\u02c5\5\u0093J\2\u02c4\u02c3\3\2\2\2\u02c5\u02c6\3\2\2"+
"\2\u02c6\u02c4\3\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c9\3\2\2\2\u02c8\u02bb"+
"\3\2\2\2\u02c8\u02c2\3\2\2\2\u02c9\u008e\3\2\2\2\u02ca\u02cc\5\u0095K"+
"\2\u02cb\u02ca\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd\u02cb\3\2\2\2\u02cd\u02ce"+
"\3\2\2\2\u02ce\u0090\3\2\2\2\u02cf\u02d5\7&\2\2\u02d0\u02d1\7\62\2\2\u02d1"+
"\u02d5\7z\2\2\u02d2\u02d3\7\62\2\2\u02d3\u02d5\7Z\2\2\u02d4\u02cf\3\2"+
"\2\2\u02d4\u02d0\3\2\2\2\u02d4\u02d2\3\2\2\2\u02d5\u02d7\3\2\2\2\u02d6"+
"\u02d8\5\u0097L\2\u02d7\u02d6\3\2\2\2\u02d8\u02d9\3\2\2\2\u02d9\u02d7"+
"\3\2\2\2\u02d9\u02da\3\2\2\2\u02da\u0092\3\2\2\2\u02db\u02dc\t\5\2\2\u02dc"+
"\u0094\3\2\2\2\u02dd\u02de\t\6\2\2\u02de\u0096\3\2\2\2\u02df\u02e0\t\7"+
"\2\2\u02e0\u0098\3\2\2\2\u02e1\u02e5\5\u009bN\2\u02e2\u02e4\5\u009dO\2"+
"\u02e3\u02e2\3\2\2\2\u02e4\u02e7\3\2\2\2\u02e5\u02e3\3\2\2\2\u02e5\u02e6"+
"\3\2\2\2\u02e6\u009a\3\2\2\2\u02e7\u02e5\3\2\2\2\u02e8\u02e9\t\b\2\2\u02e9"+
"\u009c\3\2\2\2\u02ea\u02eb\t\t\2\2\u02eb\u009e\3\2\2\2\u02ec\u02f0\7#"+
"\2\2\u02ed\u02ef\5\u009dO\2\u02ee\u02ed\3\2\2\2\u02ef\u02f2\3\2\2\2\u02f0"+
"\u02ee\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0\3\2"+
"\2\2\u02f3\u02f5\t\n\2\2\u02f4\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6"+
"\u02f4\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7\u00a0\3\2\2\2\u02f8\u02fa\t\13"+
"\2\2\u02f9\u02f8\3\2\2\2\u02fa\u02fb\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fb"+
"\u02fc\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02fe\bQ\2\2\u02fe\u00a2\3\2"+
"\2\2\u02ff\u0300\7\61\2\2\u0300\u0301\7\61\2\2\u0301\u0305\3\2\2\2\u0302"+
"\u0304\n\f\2\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"+
"\u0309\bR\2\2\u0309\u00a4\3\2\2\2\u030a\u030b\7\61\2\2\u030b\u030c\7,"+
"\2\2\u030c\u0310\3\2\2\2\u030d\u030f\13\2\2\2\u030e\u030d\3\2\2\2\u030f"+
"\u0312\3\2\2\2\u0310\u0311\3\2\2\2\u0310\u030e\3\2\2\2\u0311\u0313\3\2"+
"\2\2\u0312\u0310\3\2\2\2\u0313\u0314\7,\2\2\u0314\u0315\7\61\2\2\u0315"+
"\u0316\3\2\2\2\u0316\u0317\bS\2\2\u0317\u00a6\3\2\2\2 \2\u0244\u025b\u0261"+
"\u0263\u026c\u0279\u027d\u0282\u0289\u028e\u0295\u029a\u02a1\u02a8\u02ad"+
"\u02b4\u02b9\u02c0\u02c6\u02c8\u02cd\u02d4\u02d9\u02e5\u02f0\u02f6\u02fb"+
"\u0305\u0310\3\b\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -55,79 +55,81 @@ T__53=54
T__54=55
T__55=56
T__56=57
MNEMONIC=58
SIMPLETYPE=59
STRING=60
CHAR=61
BOOLEAN=62
NUMBER=63
NUMFLOAT=64
BINFLOAT=65
DECFLOAT=66
HEXFLOAT=67
NUMINT=68
BININTEGER=69
DECINTEGER=70
HEXINTEGER=71
NAME=72
ASMREL=73
WS=74
COMMENT_LINE=75
COMMENT_BLOCK=76
T__57=58
MNEMONIC=59
SIMPLETYPE=60
STRING=61
CHAR=62
BOOLEAN=63
NUMBER=64
NUMFLOAT=65
BINFLOAT=66
DECFLOAT=67
HEXFLOAT=68
NUMINT=69
BININTEGER=70
DECINTEGER=71
HEXINTEGER=72
NAME=73
ASMREL=74
WS=75
COMMENT_LINE=76
COMMENT_BLOCK=77
'import'=1
'('=2
')'=3
'{'=4
'}'=5
','=6
'='=7
';'=8
'='=2
';'=3
'('=4
')'=5
'{'=6
'}'=7
','=8
'const'=9
'align'=10
'register'=11
'if'=12
'else'=13
'while'=14
'do'=15
'for'=16
'return'=17
'asm'=18
':'=19
'..'=20
'signed'=21
'*'=22
'['=23
']'=24
'--'=25
'++'=26
'+'=27
'-'=28
'!'=29
'&'=30
'~'=31
'>>'=32
'<<'=33
'/'=34
'%'=35
'<'=36
'>'=37
'=='=38
'!='=39
'<='=40
'>='=41
'^'=42
'|'=43
'&&'=44
'||'=45
'+='=46
'-='=47
'*='=48
'/='=49
'%='=50
'<<='=51
'>>='=52
'&='=53
'|='=54
'^='=55
'.byte'=56
'#'=57
'inline'=12
'if'=13
'else'=14
'while'=15
'do'=16
'for'=17
'return'=18
'asm'=19
':'=20
'..'=21
'signed'=22
'*'=23
'['=24
']'=25
'--'=26
'++'=27
'+'=28
'-'=29
'!'=30
'&'=31
'~'=32
'>>'=33
'<<'=34
'/'=35
'%'=36
'<'=37
'>'=38
'=='=39
'!='=40
'<='=41
'>='=42
'^'=43
'|'=44
'&&'=45
'||'=46
'+='=47
'-='=48
'*='=49
'/='=50
'%='=51
'<<='=52
'>>='=53
'&='=54
'|='=55
'^='=56
'.byte'=57
'#'=58

View File

@ -58,29 +58,35 @@ public interface KickCListener extends ParseTreeListener {
*/
void exitDeclSeq(KickCParser.DeclSeqContext ctx);
/**
* Enter a parse tree produced by the {@code declMethod}
* labeled alternative in {@link KickCParser#decl}.
* Enter a parse tree produced by {@link KickCParser#decl}.
* @param ctx the parse tree
*/
void enterDeclMethod(KickCParser.DeclMethodContext ctx);
void enterDecl(KickCParser.DeclContext ctx);
/**
* Exit a parse tree produced by the {@code declMethod}
* labeled alternative in {@link KickCParser#decl}.
* Exit a parse tree produced by {@link KickCParser#decl}.
* @param ctx the parse tree
*/
void exitDeclMethod(KickCParser.DeclMethodContext ctx);
void exitDecl(KickCParser.DeclContext ctx);
/**
* Enter a parse tree produced by the {@code declVariable}
* labeled alternative in {@link KickCParser#decl}.
* Enter a parse tree produced by {@link KickCParser#declVariable}.
* @param ctx the parse tree
*/
void enterDeclVariable(KickCParser.DeclVariableContext ctx);
/**
* Exit a parse tree produced by the {@code declVariable}
* labeled alternative in {@link KickCParser#decl}.
* Exit a parse tree produced by {@link KickCParser#declVariable}.
* @param ctx the parse tree
*/
void exitDeclVariable(KickCParser.DeclVariableContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#declFunction}.
* @param ctx the parse tree
*/
void enterDeclFunction(KickCParser.DeclFunctionContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#declFunction}.
* @param ctx the parse tree
*/
void exitDeclFunction(KickCParser.DeclFunctionContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#parameterListDecl}.
* @param ctx the parse tree
@ -101,16 +107,6 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitParameterDecl(KickCParser.ParameterDeclContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#declVar}.
* @param ctx the parse tree
*/
void enterDeclVar(KickCParser.DeclVarContext ctx);
/**
* Exit a parse tree produced by {@link KickCParser#declVar}.
* @param ctx the parse tree
*/
void exitDeclVar(KickCParser.DeclVarContext ctx);
/**
* Enter a parse tree produced by the {@code directiveConst}
* labeled alternative in {@link KickCParser#directive}.
@ -147,6 +143,18 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx);
/**
* Enter a parse tree produced by the {@code directiveInline}
* labeled alternative in {@link KickCParser#directive}.
* @param ctx the parse tree
*/
void enterDirectiveInline(KickCParser.DirectiveInlineContext ctx);
/**
* Exit a parse tree produced by the {@code directiveInline}
* labeled alternative in {@link KickCParser#directive}.
* @param ctx the parse tree
*/
void exitDirectiveInline(KickCParser.DirectiveInlineContext ctx);
/**
* Enter a parse tree produced by {@link KickCParser#stmtSeq}.
* @param ctx the parse tree

File diff suppressed because it is too large Load Diff

View File

@ -41,19 +41,23 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
*/
T visitDeclSeq(KickCParser.DeclSeqContext ctx);
/**
* Visit a parse tree produced by the {@code declMethod}
* labeled alternative in {@link KickCParser#decl}.
* Visit a parse tree produced by {@link KickCParser#decl}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitDeclMethod(KickCParser.DeclMethodContext ctx);
T visitDecl(KickCParser.DeclContext ctx);
/**
* Visit a parse tree produced by the {@code declVariable}
* labeled alternative in {@link KickCParser#decl}.
* Visit a parse tree produced by {@link KickCParser#declVariable}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitDeclVariable(KickCParser.DeclVariableContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#declFunction}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitDeclFunction(KickCParser.DeclFunctionContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#parameterListDecl}.
* @param ctx the parse tree
@ -66,12 +70,6 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitParameterDecl(KickCParser.ParameterDeclContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#declVar}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitDeclVar(KickCParser.DeclVarContext ctx);
/**
* Visit a parse tree produced by the {@code directiveConst}
* labeled alternative in {@link KickCParser#directive}.
@ -93,6 +91,13 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx);
/**
* Visit a parse tree produced by the {@code directiveInline}
* labeled alternative in {@link KickCParser#directive}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitDirectiveInline(KickCParser.DirectiveInlineContext ctx);
/**
* Visit a parse tree produced by {@link KickCParser#stmtSeq}.
* @param ctx the parse tree

View File

@ -86,10 +86,11 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
}
@Override
public Object visitDeclMethod(KickCParser.DeclMethodContext ctx) {
public Object visitDeclFunction(KickCParser.DeclFunctionContext ctx) {
SymbolType type = (SymbolType) visit(ctx.typeDecl());
String name = ctx.NAME().getText();
Procedure procedure = getCurrentSymbols().addProcedure(name, type);
addDirectives(procedure, ctx.directive());
scopeStack.push(procedure);
Label procExit = procedure.addLabel(SymbolRef.PROCEXIT_BLOCK_NAME);
VariableUnversioned returnVar = null;
@ -140,12 +141,6 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
@Override
public Object visitDeclVariable(KickCParser.DeclVariableContext ctx) {
this.visit(ctx.declVar());
return null;
}
@Override
public Object visitDeclVar(KickCParser.DeclVarContext ctx) {
SymbolType type = (SymbolType) visit(ctx.typeDecl());
String varName = ctx.NAME().getText();
VariableUnversioned lValue = getCurrentSymbols().addVariable(varName, type);
@ -171,6 +166,8 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
return null;
}
/**
* Add declared directives to an lValue (typically a variable).
*
@ -200,16 +197,42 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
}
lValue.setDeclaredRegister(register);
} else {
throw new CompileError("Unknown directive " + directive);
throw new CompileError("Unsupported variable directive " + directive);
}
}
}
/**
* Add declared directives to a procedure.
*
* @param procedure The procedure
* @param directivesCtx The directives to add
*/
private void addDirectives(Procedure procedure, List<KickCParser.DirectiveContext> directivesCtx) {
List<Directive> directives = new ArrayList<>();
for(KickCParser.DirectiveContext directiveContext : directivesCtx) {
directives.add((Directive) this.visit(directiveContext));
}
for(Directive directive : directives) {
if(directive instanceof DirectiveInline) {
procedure.setDeclaredInline(true);
} else {
throw new CompileError("Unsupported function directive " + directive);
}
}
}
@Override
public Directive visitDirectiveConst(KickCParser.DirectiveConstContext ctx) {
return new DirectiveConst();
}
@Override
public Object visitDirectiveInline(KickCParser.DirectiveInlineContext ctx) {
return new DirectiveInline();
}
@Override
public Directive visitDirectiveAlign(KickCParser.DirectiveAlignContext ctx) {
Number alignment = NumberParser.parseLiteral(ctx.NUMBER().getText());
@ -467,12 +490,6 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
return null;
}
@Override
public Object visitStmtDeclVar(KickCParser.StmtDeclVarContext ctx) {
this.visit(ctx.declVar());
return null;
}
private void addInitialAssignment(KickCParser.ExprContext initializer, Variable lValue) {
PrePostModifierHandler.addPreModifiers(this, initializer);
RValue rValue = (RValue) visit(initializer);
@ -695,6 +712,10 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor<Object> {
private static class DirectiveConst implements Directive {
}
/** Function declared inline. */
private static class DirectiveInline implements Directive {
}
/** Variable memory alignment. */
private static class DirectiveAlign implements Directive {
private int alignment;

View File

@ -131,7 +131,9 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization {
if(assignment.getOperator() == null) {
// Constant assignment
ConstantValue constant = getConstant(assignment.getrValue2());
constants.put(variable, constant);
if(constant!=null) {
constants.put(variable, constant);
}
} else {
// Constant unary expression
ConstantValue constant = createUnary(
@ -215,6 +217,12 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization {
} else if(rValue instanceof ConstantVar) {
ConstantVar constantVar = (ConstantVar) rValue;
return constantVar.getRef();
} else if(rValue instanceof CastValue) {
CastValue castValue = (CastValue) rValue;
ConstantValue castConstant = getConstant(castValue.getValue());
if(castConstant !=null) {
return new ConstantCastValue(castValue.getToType(), castConstant);
}
}
return null;
}

View File

@ -2,10 +2,7 @@ package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.operators.Operators;
import dk.camelot64.kickc.model.values.CastValue;
import dk.camelot64.kickc.model.values.RValue;
import dk.camelot64.kickc.model.values.SymbolRef;
import dk.camelot64.kickc.model.values.VariableRef;
import dk.camelot64.kickc.model.values.*;
import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.model.statements.StatementAssignment;
import dk.camelot64.kickc.model.types.SymbolType;
@ -64,7 +61,11 @@ public class Pass2NopCastElimination extends Pass2SsaOptimization {
if(isNopCast) {
getLog().append("Eliminating Noop Cast "+assignment.toString(getProgram(), false));
// Add the alias for replacement
castAliasses.put((VariableRef) assignment.getlValue(), new CastValue(toType, assignment.getrValue2()));
if(assignment.getrValue2() instanceof ConstantValue) {
castAliasses.put((VariableRef) assignment.getlValue(), new ConstantCastValue(toType, (ConstantValue) assignment.getrValue2()));
} else {
castAliasses.put((VariableRef) assignment.getlValue(), new CastValue(toType, assignment.getrValue2()));
}
// Remove the assignment
stmtIt.remove();
}

View File

@ -99,6 +99,8 @@ public class PassNVariableReferenceInfos extends Pass2Base {
return used;
} else if(rValue instanceof CastValue) {
return getReferenced(((CastValue) rValue).getValue());
} else if(rValue instanceof ConstantCastValue) {
return getReferenced(((ConstantCastValue) rValue).getValue());
} else if(rValue instanceof ConstantVarPointer) {
return getReferenced(((ConstantVarPointer) rValue).getToVar());
} else {

View File

@ -107,6 +107,8 @@ public class ValueReplacer {
}
} else if(value instanceof CastValue) {
subValues.add(new ReplaceableCastValue((CastValue) value));
} else if(value instanceof ConstantCastValue) {
subValues.add(new ReplaceableConstantCastValue((ConstantCastValue) value));
} else if(value instanceof ConstantVarPointer) {
subValues.add(new ReplaceableVarPointer((ConstantVarPointer) value));
}
@ -160,7 +162,7 @@ public class ValueReplacer {
}
/**
* Replaceable pointer inside a pointer dererence value.
* Replaceable value inside a noop cast.
*/
public static class ReplaceableCastValue extends ReplaceableValue {
private final CastValue castValue;
@ -182,6 +184,29 @@ public class ValueReplacer {
}
/**
* Replaceable value inside a constant noop cast.
*/
public static class ReplaceableConstantCastValue extends ReplaceableValue {
private final ConstantCastValue castValue;
public ReplaceableConstantCastValue(ConstantCastValue castValue) {
this.castValue = castValue;
}
@Override
public RValue get() {
return castValue.getValue();
}
@Override
public void set(RValue val) {
castValue.setValue((ConstantValue) val);
}
}
/**
* Replaceable pointer inside a variable pointer.
*/

View File

@ -44,6 +44,11 @@ public class TestPrograms {
AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false);
}
@Test
public void testInlineFunction() throws IOException, URISyntaxException {
compileAndCompare("inline-function");
}
@Test
public void testCompoundAssignment() throws IOException, URISyntaxException {
compileAndCompare("compound-assignment");

View File

@ -9,6 +9,6 @@ void print2(byte* at, byte* msg) {
byte j=0;
for(byte i=0; msg[i]!='@'; i++) {
at[j] = msg[i];
j = j + 2;
j += 2;
}
}

View File

@ -0,0 +1,30 @@
// Test inline function
// Splits screen so upper half is lower case and lower half lower case
byte* RASTER = $d012;
byte* D018 = $d018;
byte* BGCOL = $d021;
byte* screen = $0400;
byte* charset1 = $1000;
byte* charset2 = $1800;
void main() {
asm { sei }
while(true) {
while(*RASTER!=$ff) {}
//*D018 = toD018(screen, charset1);
*D018 = (byte)(((word)screen/$40)|((word)charset1/$400));
*BGCOL = $6;
while(*RASTER!=$62) {}
//*D018 = toD018(screen, charset1);
*D018 = (byte)(((word)screen/$40)|((word)charset2/$400));
*BGCOL = $b;
}
}
/*
inline byte toD018( byte* screen, byte* charset) {
return (byte)(((word)screen/$40)|((word)charset/$400));
}
*/

View File

@ -10,7 +10,7 @@ void print2(byte* at, byte* msg) {
byte j=0;
for(byte i=0; msg[i]!='@'; i++) {
at[j] = msg[i];
j = j + 2;
j += 2;
}
}
@ -27,8 +27,7 @@ SYMBOLS
(label) main::@return
(byte*) main::hello
(void()) print2((byte*) print2::at , (byte*) print2::msg)
(byte/signed word/word/dword/signed dword~) print2::$0
(bool~) print2::$1
(bool~) print2::$0
(label) print2::@1
(label) print2::@2
(label) print2::@return
@ -60,11 +59,10 @@ print2: scope:[print2] from
to:print2::@1
print2::@1: scope:[print2] from print2 print2::@1
*((byte*) print2::at + (byte) print2::j) ← *((byte*) print2::msg + (byte) print2::i)
(byte/signed word/word/dword/signed dword~) print2::$0 ← (byte) print2::j + (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) print2::j ← (byte/signed word/word/dword/signed dword~) print2::$0
(byte) print2::j ← (byte) print2::j + (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) print2::i ← ++ (byte) print2::i
(bool~) print2::$1 ← *((byte*) print2::msg + (byte) print2::i) != (byte) '@'
if((bool~) print2::$1) goto print2::@1
(bool~) print2::$0 ← *((byte*) print2::msg + (byte) print2::i) != (byte) '@'
if((bool~) print2::$0) goto print2::@1
to:print2::@2
print2::@2: scope:[print2] from print2::@1
to:print2::@return
@ -122,11 +120,10 @@ print2::@1: scope:[print2] from print2 print2::@1
(byte) print2::i#2 ← phi( print2/(byte) print2::i#0 print2::@1/(byte) print2::i#1 )
(byte*) print2::msg#2 ← phi( print2/(byte*) print2::msg#3 print2::@1/(byte*) print2::msg#2 )
*((byte*) print2::at#2 + (byte) print2::j#2) ← *((byte*) print2::msg#2 + (byte) print2::i#2)
(byte/signed word/word/dword/signed dword~) print2::$0 ← (byte) print2::j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) print2::j#1 ← (byte/signed word/word/dword/signed dword~) print2::$0
(byte) print2::j#1 ← (byte) print2::j#2 + (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) print2::i#1 ← ++ (byte) print2::i#2
(bool~) print2::$1 ← *((byte*) print2::msg#2 + (byte) print2::i#1) != (byte) '@'
if((bool~) print2::$1) goto print2::@1
(bool~) print2::$0 ← *((byte*) print2::msg#2 + (byte) print2::i#1) != (byte) '@'
if((bool~) print2::$0) goto print2::@1
to:print2::@return
print2::@return: scope:[print2] from print2::@1
return
@ -154,8 +151,7 @@ SYMBOL TABLE SSA
(byte*) main::hello#0
(byte*) main::hello#1
(void()) print2((byte*) print2::at , (byte*) print2::msg)
(byte/signed word/word/dword/signed dword~) print2::$0
(bool~) print2::$1
(bool~) print2::$0
(label) print2::@1
(label) print2::@return
(byte*) print2::at
@ -195,7 +191,6 @@ Not aliassing across scopes: print2::at#3 print2::at#0
Alias (byte*) screen#1 = (byte*) screen#2
Alias (byte*) main::hello#0 = (byte*) main::hello#1
Alias (byte*) print2::at#1 = (byte*~) main::$1
Alias (byte) print2::j#1 = (byte/signed word/word/dword/signed dword~) print2::$0
Alias (byte*) screen#0 = (byte*) screen#3
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: screen#1 screen#0
@ -211,7 +206,7 @@ Redundant Phi (byte*) screen#1 (byte*) screen#0
Redundant Phi (byte*) print2::msg#2 (byte*) print2::msg#3
Redundant Phi (byte*) print2::at#2 (byte*) print2::at#3
Succesful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) print2::$1 if(*((byte*) print2::msg#3 + (byte) print2::i#1)!=(byte) '@') goto print2::@1
Simple Condition (bool~) print2::$0 if(*((byte*) print2::msg#3 + (byte) print2::i#1)!=(byte) '@') goto print2::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) screen#0 = ((byte*))1024
Constant (const string) main::hello#0 = main::$3

View File

@ -0,0 +1,30 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label RASTER = $d012
.label D018 = $d018
.label BGCOL = $d021
.label screen = $400
.label charset1 = $1000
.label charset2 = $1800
jsr main
main: {
sei
b4:
lda RASTER
cmp #$ff
bne b4
lda #screen/$40|charset1/$400
sta D018
lda #6
sta BGCOL
b7:
lda RASTER
cmp #$62
bne b7
lda #screen/$40|charset2/$400
sta D018
lda #$b
sta BGCOL
jmp b4
}

View File

@ -0,0 +1,26 @@
@begin: scope:[] from
[0] phi() [ ] ( )
to:@1
@1: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @1
[3] phi() [ ] ( )
main: scope:[main] from @1
asm { sei }
to:main::@4
main::@4: scope:[main] from main main::@4 main::@9
[5] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 [ ] ( main:2 [ ] )
to:main::@6
main::@6: scope:[main] from main::@4
[6] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] )
[7] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 6 [ ] ( main:2 [ ] )
to:main::@7
main::@7: scope:[main] from main::@6 main::@7
[8] if(*((const byte*) RASTER#0)!=(byte/signed byte/word/signed word/dword/signed dword) 98) goto main::@7 [ ] ( main:2 [ ] )
to:main::@9
main::@9: scope:[main] from main::@7
[9] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] )
[10] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 11 [ ] ( main:2 [ ] )
to:main::@4

View File

@ -0,0 +1,863 @@
PARSING src/test/java/dk/camelot64/kickc/test/kc/inline-function.kc
// Test inline function
// Splits screen so upper half is lower case and lower half lower case
byte* RASTER = $d012;
byte* D018 = $d018;
byte* BGCOL = $d021;
byte* screen = $0400;
byte* charset1 = $1000;
byte* charset2 = $1800;
void main() {
asm { sei }
while(true) {
while(*RASTER!=$ff) {}
//*D018 = toD018(screen, charset1);
*D018 = (byte)(((word)screen/$40)|((word)charset1/$400));
*BGCOL = $6;
while(*RASTER!=$62) {}
//*D018 = toD018(screen, charset1);
*D018 = (byte)(((word)screen/$40)|((word)charset2/$400));
*BGCOL = $b;
}
}
/*
inline byte toD018( byte* screen, byte* charset) {
return (byte)(((word)screen/$40)|((word)charset/$400));
}
*/
SYMBOLS
(label) @1
(label) @begin
(label) @end
(byte*) BGCOL
(byte*) D018
(byte*) RASTER
(byte*) charset1
(byte*) charset2
(void()) main()
(bool~) main::$0
(word~) main::$1
(word~) main::$10
(word/signed dword/dword~) main::$11
(word/dword~) main::$12
(byte~) main::$13
(word/signed dword/dword~) main::$2
(word~) main::$3
(word/signed dword/dword~) main::$4
(word/dword~) main::$5
(byte~) main::$6
(bool~) main::$7
(word~) main::$8
(word/signed dword/dword~) main::$9
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@12
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@17
(label) main::@18
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@9
(label) main::@return
(byte*) screen
Promoting word/dword/signed dword to byte* in RASTER ← ((byte*)) 53266
Promoting word/dword/signed dword to byte* in D018 ← ((byte*)) 53272
Promoting word/dword/signed dword to byte* in BGCOL ← ((byte*)) 53281
Promoting word/signed word/dword/signed dword to byte* in screen ← ((byte*)) 1024
Promoting word/signed word/dword/signed dword to byte* in charset1 ← ((byte*)) 4096
Promoting word/signed word/dword/signed dword to byte* in charset2 ← ((byte*)) 6144
INITIAL CONTROL FLOW GRAPH
@begin: scope:[] from
(byte*) RASTER ← ((byte*)) (word/dword/signed dword) 53266
(byte*) D018 ← ((byte*)) (word/dword/signed dword) 53272
(byte*) BGCOL ← ((byte*)) (word/dword/signed dword) 53281
(byte*) screen ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) charset1 ← ((byte*)) (word/signed word/dword/signed dword) 4096
(byte*) charset2 ← ((byte*)) (word/signed word/dword/signed dword) 6144
to:@1
main: scope:[main] from
asm { sei }
to:main::@1
main::@1: scope:[main] from main main::@9
if(true) goto main::@2
to:main::@10
main::@2: scope:[main] from main::@1 main::@11
to:main::@4
main::@10: scope:[main] from main::@1
to:main::@3
main::@3: scope:[main] from main::@10 main::@18
to:main::@return
main::@11: scope:[main] from
to:main::@2
main::@4: scope:[main] from main::@2 main::@5
(bool~) main::$0 ← *((byte*) RASTER) != (byte/word/signed word/dword/signed dword) 255
if((bool~) main::$0) goto main::@5
to:main::@12
main::@5: scope:[main] from main::@13 main::@4
to:main::@4
main::@12: scope:[main] from main::@4
to:main::@6
main::@6: scope:[main] from main::@12 main::@14
(word~) main::$1 ← ((word)) (byte*) screen
(word/signed dword/dword~) main::$2 ← (word~) main::$1 / (byte/signed byte/word/signed word/dword/signed dword) 64
(word~) main::$3 ← ((word)) (byte*) charset1
(word/signed dword/dword~) main::$4 ← (word~) main::$3 / (word/signed word/dword/signed dword) 1024
(word/dword~) main::$5 ← (word/signed dword/dword~) main::$2 | (word/signed dword/dword~) main::$4
(byte~) main::$6 ← ((byte)) (word/dword~) main::$5
*((byte*) D018) ← (byte~) main::$6
*((byte*) BGCOL) ← (byte/signed byte/word/signed word/dword/signed dword) 6
to:main::@7
main::@13: scope:[main] from
to:main::@5
main::@14: scope:[main] from
to:main::@6
main::@7: scope:[main] from main::@6 main::@8
(bool~) main::$7 ← *((byte*) RASTER) != (byte/signed byte/word/signed word/dword/signed dword) 98
if((bool~) main::$7) goto main::@8
to:main::@15
main::@8: scope:[main] from main::@16 main::@7
to:main::@7
main::@15: scope:[main] from main::@7
to:main::@9
main::@9: scope:[main] from main::@15 main::@17
(word~) main::$8 ← ((word)) (byte*) screen
(word/signed dword/dword~) main::$9 ← (word~) main::$8 / (byte/signed byte/word/signed word/dword/signed dword) 64
(word~) main::$10 ← ((word)) (byte*) charset2
(word/signed dword/dword~) main::$11 ← (word~) main::$10 / (word/signed word/dword/signed dword) 1024
(word/dword~) main::$12 ← (word/signed dword/dword~) main::$9 | (word/signed dword/dword~) main::$11
(byte~) main::$13 ← ((byte)) (word/dword~) main::$12
*((byte*) D018) ← (byte~) main::$13
*((byte*) BGCOL) ← (byte/signed byte/word/signed word/dword/signed dword) 11
to:main::@1
main::@16: scope:[main] from
to:main::@8
main::@17: scope:[main] from
to:main::@9
main::@18: scope:[main] from
to:main::@3
main::@return: scope:[main] from main::@3
return
to:@return
@1: scope:[] from @begin
call main
to:@end
@end: scope:[] from @1
Removing empty block main::@10
Removing empty block main::@3
Removing empty block main::@11
Removing empty block main::@12
Removing empty block main::@13
Removing empty block main::@14
Removing empty block main::@15
Removing empty block main::@16
Removing empty block main::@17
Removing empty block main::@18
PROCEDURE MODIFY VARIABLE ANALYSIS
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
Completing Phi functions...
CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN
@begin: scope:[] from
(byte*) RASTER#0 ← ((byte*)) (word/dword/signed dword) 53266
(byte*) D018#0 ← ((byte*)) (word/dword/signed dword) 53272
(byte*) BGCOL#0 ← ((byte*)) (word/dword/signed dword) 53281
(byte*) screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
(byte*) charset1#0 ← ((byte*)) (word/signed word/dword/signed dword) 4096
(byte*) charset2#0 ← ((byte*)) (word/signed word/dword/signed dword) 6144
to:@1
main: scope:[main] from @1
(byte*) charset2#9 ← phi( @1/(byte*) charset2#10 )
(byte*) BGCOL#9 ← phi( @1/(byte*) BGCOL#10 )
(byte*) D018#9 ← phi( @1/(byte*) D018#10 )
(byte*) charset1#6 ← phi( @1/(byte*) charset1#8 )
(byte*) screen#9 ← phi( @1/(byte*) screen#10 )
(byte*) RASTER#8 ← phi( @1/(byte*) RASTER#10 )
asm { sei }
to:main::@1
main::@1: scope:[main] from main main::@9
(byte*) charset2#8 ← phi( main/(byte*) charset2#9 main::@9/(byte*) charset2#1 )
(byte*) BGCOL#8 ← phi( main/(byte*) BGCOL#9 main::@9/(byte*) BGCOL#2 )
(byte*) D018#8 ← phi( main/(byte*) D018#9 main::@9/(byte*) D018#2 )
(byte*) charset1#5 ← phi( main/(byte*) charset1#6 main::@9/(byte*) charset1#7 )
(byte*) screen#8 ← phi( main/(byte*) screen#9 main::@9/(byte*) screen#2 )
(byte*) RASTER#7 ← phi( main/(byte*) RASTER#8 main::@9/(byte*) RASTER#9 )
if(true) goto main::@2
to:main::@return
main::@2: scope:[main] from main::@1
(byte*) charset2#6 ← phi( main::@1/(byte*) charset2#8 )
(byte*) BGCOL#5 ← phi( main::@1/(byte*) BGCOL#8 )
(byte*) D018#5 ← phi( main::@1/(byte*) D018#8 )
(byte*) charset1#3 ← phi( main::@1/(byte*) charset1#5 )
(byte*) screen#5 ← phi( main::@1/(byte*) screen#8 )
(byte*) RASTER#3 ← phi( main::@1/(byte*) RASTER#7 )
to:main::@4
main::@4: scope:[main] from main::@2 main::@5
(byte*) charset2#5 ← phi( main::@2/(byte*) charset2#6 main::@5/(byte*) charset2#7 )
(byte*) BGCOL#3 ← phi( main::@2/(byte*) BGCOL#5 main::@5/(byte*) BGCOL#6 )
(byte*) D018#3 ← phi( main::@2/(byte*) D018#5 main::@5/(byte*) D018#6 )
(byte*) charset1#2 ← phi( main::@2/(byte*) charset1#3 main::@5/(byte*) charset1#4 )
(byte*) screen#3 ← phi( main::@2/(byte*) screen#5 main::@5/(byte*) screen#6 )
(byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#3 main::@5/(byte*) RASTER#4 )
(bool~) main::$0 ← *((byte*) RASTER#1) != (byte/word/signed word/dword/signed dword) 255
if((bool~) main::$0) goto main::@5
to:main::@6
main::@5: scope:[main] from main::@4
(byte*) charset2#7 ← phi( main::@4/(byte*) charset2#5 )
(byte*) BGCOL#6 ← phi( main::@4/(byte*) BGCOL#3 )
(byte*) D018#6 ← phi( main::@4/(byte*) D018#3 )
(byte*) charset1#4 ← phi( main::@4/(byte*) charset1#2 )
(byte*) screen#6 ← phi( main::@4/(byte*) screen#3 )
(byte*) RASTER#4 ← phi( main::@4/(byte*) RASTER#1 )
to:main::@4
main::@6: scope:[main] from main::@4
(byte*) charset2#3 ← phi( main::@4/(byte*) charset2#5 )
(byte*) RASTER#5 ← phi( main::@4/(byte*) RASTER#1 )
(byte*) BGCOL#1 ← phi( main::@4/(byte*) BGCOL#3 )
(byte*) D018#1 ← phi( main::@4/(byte*) D018#3 )
(byte*) charset1#1 ← phi( main::@4/(byte*) charset1#2 )
(byte*) screen#1 ← phi( main::@4/(byte*) screen#3 )
(word~) main::$1 ← ((word)) (byte*) screen#1
(word/signed dword/dword~) main::$2 ← (word~) main::$1 / (byte/signed byte/word/signed word/dword/signed dword) 64
(word~) main::$3 ← ((word)) (byte*) charset1#1
(word/signed dword/dword~) main::$4 ← (word~) main::$3 / (word/signed word/dword/signed dword) 1024
(word/dword~) main::$5 ← (word/signed dword/dword~) main::$2 | (word/signed dword/dword~) main::$4
(byte~) main::$6 ← ((byte)) (word/dword~) main::$5
*((byte*) D018#1) ← (byte~) main::$6
*((byte*) BGCOL#1) ← (byte/signed byte/word/signed word/dword/signed dword) 6
to:main::@7
main::@7: scope:[main] from main::@6 main::@8
(byte*) charset1#9 ← phi( main::@6/(byte*) charset1#1 main::@8/(byte*) charset1#10 )
(byte*) BGCOL#4 ← phi( main::@6/(byte*) BGCOL#1 main::@8/(byte*) BGCOL#7 )
(byte*) D018#4 ← phi( main::@6/(byte*) D018#1 main::@8/(byte*) D018#7 )
(byte*) charset2#2 ← phi( main::@6/(byte*) charset2#3 main::@8/(byte*) charset2#4 )
(byte*) screen#4 ← phi( main::@6/(byte*) screen#1 main::@8/(byte*) screen#7 )
(byte*) RASTER#2 ← phi( main::@6/(byte*) RASTER#5 main::@8/(byte*) RASTER#6 )
(bool~) main::$7 ← *((byte*) RASTER#2) != (byte/signed byte/word/signed word/dword/signed dword) 98
if((bool~) main::$7) goto main::@8
to:main::@9
main::@8: scope:[main] from main::@7
(byte*) charset1#10 ← phi( main::@7/(byte*) charset1#9 )
(byte*) BGCOL#7 ← phi( main::@7/(byte*) BGCOL#4 )
(byte*) D018#7 ← phi( main::@7/(byte*) D018#4 )
(byte*) charset2#4 ← phi( main::@7/(byte*) charset2#2 )
(byte*) screen#7 ← phi( main::@7/(byte*) screen#4 )
(byte*) RASTER#6 ← phi( main::@7/(byte*) RASTER#2 )
to:main::@7
main::@9: scope:[main] from main::@7
(byte*) charset1#7 ← phi( main::@7/(byte*) charset1#9 )
(byte*) RASTER#9 ← phi( main::@7/(byte*) RASTER#2 )
(byte*) BGCOL#2 ← phi( main::@7/(byte*) BGCOL#4 )
(byte*) D018#2 ← phi( main::@7/(byte*) D018#4 )
(byte*) charset2#1 ← phi( main::@7/(byte*) charset2#2 )
(byte*) screen#2 ← phi( main::@7/(byte*) screen#4 )
(word~) main::$8 ← ((word)) (byte*) screen#2
(word/signed dword/dword~) main::$9 ← (word~) main::$8 / (byte/signed byte/word/signed word/dword/signed dword) 64
(word~) main::$10 ← ((word)) (byte*) charset2#1
(word/signed dword/dword~) main::$11 ← (word~) main::$10 / (word/signed word/dword/signed dword) 1024
(word/dword~) main::$12 ← (word/signed dword/dword~) main::$9 | (word/signed dword/dword~) main::$11
(byte~) main::$13 ← ((byte)) (word/dword~) main::$12
*((byte*) D018#2) ← (byte~) main::$13
*((byte*) BGCOL#2) ← (byte/signed byte/word/signed word/dword/signed dword) 11
to:main::@1
main::@return: scope:[main] from main::@1
return
to:@return
@1: scope:[] from @begin
(byte*) charset2#10 ← phi( @begin/(byte*) charset2#0 )
(byte*) BGCOL#10 ← phi( @begin/(byte*) BGCOL#0 )
(byte*) D018#10 ← phi( @begin/(byte*) D018#0 )
(byte*) charset1#8 ← phi( @begin/(byte*) charset1#0 )
(byte*) screen#10 ← phi( @begin/(byte*) screen#0 )
(byte*) RASTER#10 ← phi( @begin/(byte*) RASTER#0 )
call main param-assignment
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
SYMBOL TABLE SSA
(label) @1
(label) @2
(label) @begin
(label) @end
(byte*) BGCOL
(byte*) BGCOL#0
(byte*) BGCOL#1
(byte*) BGCOL#10
(byte*) BGCOL#2
(byte*) BGCOL#3
(byte*) BGCOL#4
(byte*) BGCOL#5
(byte*) BGCOL#6
(byte*) BGCOL#7
(byte*) BGCOL#8
(byte*) BGCOL#9
(byte*) D018
(byte*) D018#0
(byte*) D018#1
(byte*) D018#10
(byte*) D018#2
(byte*) D018#3
(byte*) D018#4
(byte*) D018#5
(byte*) D018#6
(byte*) D018#7
(byte*) D018#8
(byte*) D018#9
(byte*) RASTER
(byte*) RASTER#0
(byte*) RASTER#1
(byte*) RASTER#10
(byte*) RASTER#2
(byte*) RASTER#3
(byte*) RASTER#4
(byte*) RASTER#5
(byte*) RASTER#6
(byte*) RASTER#7
(byte*) RASTER#8
(byte*) RASTER#9
(byte*) charset1
(byte*) charset1#0
(byte*) charset1#1
(byte*) charset1#10
(byte*) charset1#2
(byte*) charset1#3
(byte*) charset1#4
(byte*) charset1#5
(byte*) charset1#6
(byte*) charset1#7
(byte*) charset1#8
(byte*) charset1#9
(byte*) charset2
(byte*) charset2#0
(byte*) charset2#1
(byte*) charset2#10
(byte*) charset2#2
(byte*) charset2#3
(byte*) charset2#4
(byte*) charset2#5
(byte*) charset2#6
(byte*) charset2#7
(byte*) charset2#8
(byte*) charset2#9
(void()) main()
(bool~) main::$0
(word~) main::$1
(word~) main::$10
(word/signed dword/dword~) main::$11
(word/dword~) main::$12
(byte~) main::$13
(word/signed dword/dword~) main::$2
(word~) main::$3
(word/signed dword/dword~) main::$4
(word/dword~) main::$5
(byte~) main::$6
(bool~) main::$7
(word~) main::$8
(word/signed dword/dword~) main::$9
(label) main::@1
(label) main::@2
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@9
(label) main::@return
(byte*) screen
(byte*) screen#0
(byte*) screen#1
(byte*) screen#10
(byte*) screen#2
(byte*) screen#3
(byte*) screen#4
(byte*) screen#5
(byte*) screen#6
(byte*) screen#7
(byte*) screen#8
(byte*) screen#9
OPTIMIZING CONTROL FLOW GRAPH
Culled Empty Block (label) @2
Succesful SSA optimization Pass2CullEmptyBlocks
Not aliassing across scopes: RASTER#8 RASTER#10
Not aliassing across scopes: screen#9 screen#10
Not aliassing across scopes: charset1#6 charset1#8
Not aliassing across scopes: D018#9 D018#10
Not aliassing across scopes: BGCOL#9 BGCOL#10
Not aliassing across scopes: charset2#9 charset2#10
Alias (byte*) RASTER#3 = (byte*) RASTER#7
Alias (byte*) screen#5 = (byte*) screen#8
Alias (byte*) charset1#3 = (byte*) charset1#5
Alias (byte*) D018#5 = (byte*) D018#8
Alias (byte*) BGCOL#5 = (byte*) BGCOL#8
Alias (byte*) charset2#6 = (byte*) charset2#8
Alias (byte*) RASTER#1 = (byte*) RASTER#4 (byte*) RASTER#5
Alias (byte*) screen#1 = (byte*) screen#6 (byte*) screen#3
Alias (byte*) charset1#1 = (byte*) charset1#4 (byte*) charset1#2
Alias (byte*) D018#1 = (byte*) D018#6 (byte*) D018#3
Alias (byte*) BGCOL#1 = (byte*) BGCOL#6 (byte*) BGCOL#3
Alias (byte*) charset2#3 = (byte*) charset2#7 (byte*) charset2#5
Alias (byte*) RASTER#2 = (byte*) RASTER#6 (byte*) RASTER#9
Alias (byte*) screen#2 = (byte*) screen#7 (byte*) screen#4
Alias (byte*) charset2#1 = (byte*) charset2#4 (byte*) charset2#2
Alias (byte*) D018#2 = (byte*) D018#7 (byte*) D018#4
Alias (byte*) BGCOL#2 = (byte*) BGCOL#7 (byte*) BGCOL#4
Alias (byte*) charset1#10 = (byte*) charset1#9 (byte*) charset1#7
Alias (byte*) RASTER#0 = (byte*) RASTER#10
Alias (byte*) screen#0 = (byte*) screen#10
Alias (byte*) charset1#0 = (byte*) charset1#8
Alias (byte*) D018#0 = (byte*) D018#10
Alias (byte*) BGCOL#0 = (byte*) BGCOL#10
Alias (byte*) charset2#0 = (byte*) charset2#10
Succesful SSA optimization Pass2AliasElimination
Not aliassing across scopes: RASTER#8 RASTER#0
Not aliassing across scopes: screen#9 screen#0
Not aliassing across scopes: charset1#6 charset1#0
Not aliassing across scopes: D018#9 D018#0
Not aliassing across scopes: BGCOL#9 BGCOL#0
Not aliassing across scopes: charset2#9 charset2#0
Self Phi Eliminated (byte*) RASTER#1
Self Phi Eliminated (byte*) screen#1
Self Phi Eliminated (byte*) charset1#1
Self Phi Eliminated (byte*) D018#1
Self Phi Eliminated (byte*) BGCOL#1
Self Phi Eliminated (byte*) charset2#3
Self Phi Eliminated (byte*) RASTER#2
Self Phi Eliminated (byte*) screen#2
Self Phi Eliminated (byte*) charset2#1
Self Phi Eliminated (byte*) D018#2
Self Phi Eliminated (byte*) BGCOL#2
Self Phi Eliminated (byte*) charset1#10
Succesful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte*) RASTER#8 (byte*) RASTER#0
Redundant Phi (byte*) screen#9 (byte*) screen#0
Redundant Phi (byte*) charset1#6 (byte*) charset1#0
Redundant Phi (byte*) D018#9 (byte*) D018#0
Redundant Phi (byte*) BGCOL#9 (byte*) BGCOL#0
Redundant Phi (byte*) charset2#9 (byte*) charset2#0
Redundant Phi (byte*) RASTER#1 (byte*) RASTER#3
Redundant Phi (byte*) screen#1 (byte*) screen#5
Redundant Phi (byte*) charset1#1 (byte*) charset1#3
Redundant Phi (byte*) D018#1 (byte*) D018#5
Redundant Phi (byte*) BGCOL#1 (byte*) BGCOL#5
Redundant Phi (byte*) charset2#3 (byte*) charset2#6
Redundant Phi (byte*) RASTER#2 (byte*) RASTER#1
Redundant Phi (byte*) screen#2 (byte*) screen#1
Redundant Phi (byte*) charset2#1 (byte*) charset2#3
Redundant Phi (byte*) D018#2 (byte*) D018#1
Redundant Phi (byte*) BGCOL#2 (byte*) BGCOL#1
Redundant Phi (byte*) charset1#10 (byte*) charset1#1
Succesful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) main::$0 if(*((byte*) RASTER#3)!=(byte/word/signed word/dword/signed dword) 255) goto main::@5
Simple Condition (bool~) main::$7 if(*((byte*) RASTER#3)!=(byte/signed byte/word/signed word/dword/signed dword) 98) goto main::@8
Succesful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) RASTER#0 = ((byte*))53266
Constant (const byte*) D018#0 = ((byte*))53272
Constant (const byte*) BGCOL#0 = ((byte*))53281
Constant (const byte*) screen#0 = ((byte*))1024
Constant (const byte*) charset1#0 = ((byte*))4096
Constant (const byte*) charset2#0 = ((byte*))6144
Succesful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination if(true) goto main::@2
Succesful SSA optimization Pass2ConstantIfs
Eliminating Noop Cast (word~) main::$1 ← ((word)) (byte*) screen#5
Eliminating Noop Cast (word~) main::$3 ← ((word)) (byte*) charset1#3
Eliminating Noop Cast (word~) main::$8 ← ((word)) (byte*) screen#5
Eliminating Noop Cast (word~) main::$10 ← ((word)) (byte*) charset2#6
Succesful SSA optimization Pass2NopCastElimination
Removing unused block main::@return
Succesful SSA optimization Pass2EliminateUnusedBlocks
Culled Empty Block (label) main::@2
Culled Empty Block (label) main::@5
Culled Empty Block (label) main::@8
Succesful SSA optimization Pass2CullEmptyBlocks
Self Phi Eliminated (byte*) RASTER#3
Self Phi Eliminated (byte*) screen#5
Self Phi Eliminated (byte*) charset1#3
Self Phi Eliminated (byte*) D018#5
Self Phi Eliminated (byte*) BGCOL#5
Self Phi Eliminated (byte*) charset2#6
Succesful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte*) RASTER#3 (const byte*) RASTER#0
Redundant Phi (byte*) screen#5 (const byte*) screen#0
Redundant Phi (byte*) charset1#3 (const byte*) charset1#0
Redundant Phi (byte*) D018#5 (const byte*) D018#0
Redundant Phi (byte*) BGCOL#5 (const byte*) BGCOL#0
Redundant Phi (byte*) charset2#6 (const byte*) charset2#0
Succesful SSA optimization Pass2RedundantPhiElimination
Constant (const word/signed dword/dword) main::$2 = (word)screen#0/64
Constant (const word/signed dword/dword) main::$4 = (word)charset1#0/1024
Constant (const word/signed dword/dword) main::$9 = (word)screen#0/64
Constant (const word/signed dword/dword) main::$11 = (word)charset2#0/1024
Succesful SSA optimization Pass2ConstantIdentification
Constant (const word/dword) main::$5 = main::$2|main::$4
Constant (const word/dword) main::$12 = main::$9|main::$11
Succesful SSA optimization Pass2ConstantIdentification
Constant (const byte) main::$6 = ((byte))main::$5
Constant (const byte) main::$13 = ((byte))main::$12
Succesful SSA optimization Pass2ConstantIdentification
Culled Empty Block (label) main::@1
Succesful SSA optimization Pass2CullEmptyBlocks
OPTIMIZING CONTROL FLOW GRAPH
Constant inlined main::$2 = (word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64
Constant inlined main::$5 = (word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024
Constant inlined main::$12 = (word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024
Constant inlined main::$6 = ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024
Constant inlined main::$13 = ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024
Constant inlined main::$4 = (word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024
Constant inlined main::$9 = (word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64
Constant inlined main::$11 = (word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024
Succesful SSA optimization Pass2ConstantInlining
Block Sequence Planned @begin @1 @end main main::@4 main::@6 main::@7 main::@9
Block Sequence Planned @begin @1 @end main main::@4 main::@6 main::@7 main::@9
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
CALL GRAPH
Calls in [] to main:2
Propagating live ranges...
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Block Sequence Planned @begin @1 @end main main::@4 main::@6 main::@7 main::@9
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Propagating live ranges...
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi() [ ] ( )
to:@1
@1: scope:[] from @begin
[1] phi() [ ] ( )
[2] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @1
[3] phi() [ ] ( )
main: scope:[main] from @1
asm { sei }
to:main::@4
main::@4: scope:[main] from main main::@4 main::@9
[5] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 [ ] ( main:2 [ ] )
to:main::@6
main::@6: scope:[main] from main::@4
[6] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] )
[7] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 6 [ ] ( main:2 [ ] )
to:main::@7
main::@7: scope:[main] from main::@6 main::@7
[8] if(*((const byte*) RASTER#0)!=(byte/signed byte/word/signed word/dword/signed dword) 98) goto main::@7 [ ] ( main:2 [ ] )
to:main::@9
main::@9: scope:[main] from main::@7
[9] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] )
[10] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 11 [ ] ( main:2 [ ] )
to:main::@4
DOMINATORS
@begin dominated by @begin
@1 dominated by @1 @begin
@end dominated by @1 @begin @end
main dominated by @1 @begin main
main::@4 dominated by @1 @begin main main::@4
main::@6 dominated by @1 @begin main main::@6 main::@4
main::@7 dominated by @1 main::@7 @begin main main::@6 main::@4
main::@9 dominated by main::@9 @1 main::@7 @begin main main::@6 main::@4
NATURAL LOOPS
Found back edge: Loop head: main::@4 tails: main::@4 blocks: null
Found back edge: Loop head: main::@7 tails: main::@7 blocks: null
Found back edge: Loop head: main::@4 tails: main::@9 blocks: null
Populated: Loop head: main::@4 tails: main::@4 blocks: main::@4
Populated: Loop head: main::@7 tails: main::@7 blocks: main::@7
Populated: Loop head: main::@4 tails: main::@9 blocks: main::@9 main::@7 main::@6 main::@4
Loop head: main::@4 tails: main::@4 blocks: main::@4
Loop head: main::@7 tails: main::@7 blocks: main::@7
Loop head: main::@4 tails: main::@9 blocks: main::@9 main::@7 main::@6 main::@4
NATURAL LOOPS WITH DEPTH
Found 0 loops in scope []
Found 3 loops in scope [main]
Loop head: main::@4 tails: main::@4 blocks: main::@4
Loop head: main::@7 tails: main::@7 blocks: main::@7
Loop head: main::@4 tails: main::@9 blocks: main::@9 main::@7 main::@6 main::@4
Loop head: main::@4 tails: main::@4 blocks: main::@4 depth: 2
Loop head: main::@7 tails: main::@7 blocks: main::@7 depth: 2
Loop head: main::@4 tails: main::@9 blocks: main::@9 main::@7 main::@6 main::@4 depth: 1
VARIABLE REGISTER WEIGHTS
(byte*) BGCOL
(byte*) D018
(byte*) RASTER
(byte*) charset1
(byte*) charset2
(void()) main()
(byte*) screen
Initial phi equivalence classes
Complete equivalence classes
INITIAL ASM
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label RASTER = $d012
.label D018 = $d018
.label BGCOL = $d021
.label screen = $400
.label charset1 = $1000
.label charset2 = $1800
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG4 @1
b1:
//SEG5 [2] call main param-assignment [ ] ( )
jsr main
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG7 @end
bend:
//SEG8 main
main: {
//SEG9 asm { sei }
sei
jmp b4
//SEG10 main::@4
b4:
//SEG11 [5] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 [ ] ( main:2 [ ] ) -- _deref_pbuc1_neq_vbuc2_then_la1
lda RASTER
cmp #$ff
bne b4
jmp b6
//SEG12 main::@6
b6:
//SEG13 [6] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #screen/$40|charset1/$400
sta D018
//SEG14 [7] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 6 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #6
sta BGCOL
jmp b7
//SEG15 main::@7
b7:
//SEG16 [8] if(*((const byte*) RASTER#0)!=(byte/signed byte/word/signed word/dword/signed dword) 98) goto main::@7 [ ] ( main:2 [ ] ) -- _deref_pbuc1_neq_vbuc2_then_la1
lda RASTER
cmp #$62
bne b7
jmp b9
//SEG17 main::@9
b9:
//SEG18 [9] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #screen/$40|charset2/$400
sta D018
//SEG19 [10] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 11 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$b
sta BGCOL
jmp b4
}
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [5] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [6] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [7] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 6 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [8] if(*((const byte*) RASTER#0)!=(byte/signed byte/word/signed word/dword/signed dword) 98) goto main::@7 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [9] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) always clobbers reg byte a
Statement [10] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 11 [ ] ( main:2 [ ] ) always clobbers reg byte a
REGISTER UPLIFT SCOPES
Uplift Scope [main]
Uplift Scope []
Uplifting [main] best 2617 combination
Uplifting [] best 2617 combination
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label RASTER = $d012
.label D018 = $d018
.label BGCOL = $d021
.label screen = $400
.label charset1 = $1000
.label charset2 = $1800
//SEG2 @begin
bbegin:
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG4 @1
b1:
//SEG5 [2] call main param-assignment [ ] ( )
jsr main
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG7 @end
bend:
//SEG8 main
main: {
//SEG9 asm { sei }
sei
jmp b4
//SEG10 main::@4
b4:
//SEG11 [5] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 [ ] ( main:2 [ ] ) -- _deref_pbuc1_neq_vbuc2_then_la1
lda RASTER
cmp #$ff
bne b4
jmp b6
//SEG12 main::@6
b6:
//SEG13 [6] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #screen/$40|charset1/$400
sta D018
//SEG14 [7] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 6 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #6
sta BGCOL
jmp b7
//SEG15 main::@7
b7:
//SEG16 [8] if(*((const byte*) RASTER#0)!=(byte/signed byte/word/signed word/dword/signed dword) 98) goto main::@7 [ ] ( main:2 [ ] ) -- _deref_pbuc1_neq_vbuc2_then_la1
lda RASTER
cmp #$62
bne b7
jmp b9
//SEG17 main::@9
b9:
//SEG18 [9] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #screen/$40|charset2/$400
sta D018
//SEG19 [10] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 11 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$b
sta BGCOL
jmp b4
}
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b4
Removing instruction jmp b6
Removing instruction jmp b7
Removing instruction jmp b9
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Removing instruction b1_from_bbegin:
Removing instruction bend_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction b1:
Removing instruction bend:
Removing instruction b6:
Removing instruction b9:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) BGCOL
(const byte*) BGCOL#0 BGCOL = ((byte*))(word/dword/signed dword) 53281
(byte*) D018
(const byte*) D018#0 D018 = ((byte*))(word/dword/signed dword) 53272
(byte*) RASTER
(const byte*) RASTER#0 RASTER = ((byte*))(word/dword/signed dword) 53266
(byte*) charset1
(const byte*) charset1#0 charset1 = ((byte*))(word/signed word/dword/signed dword) 4096
(byte*) charset2
(const byte*) charset2#0 charset2 = ((byte*))(word/signed word/dword/signed dword) 6144
(void()) main()
(label) main::@4
(label) main::@6
(label) main::@7
(label) main::@9
(byte*) screen
(const byte*) screen#0 screen = ((byte*))(word/signed word/dword/signed dword) 1024
FINAL ASSEMBLER
Score: 1978
//SEG0 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG1 Global Constants & labels
.label RASTER = $d012
.label D018 = $d018
.label BGCOL = $d021
.label screen = $400
.label charset1 = $1000
.label charset2 = $1800
//SEG2 @begin
//SEG3 [1] phi from @begin to @1 [phi:@begin->@1]
//SEG4 @1
//SEG5 [2] call main param-assignment [ ] ( )
jsr main
//SEG6 [3] phi from @1 to @end [phi:@1->@end]
//SEG7 @end
//SEG8 main
main: {
//SEG9 asm { sei }
sei
//SEG10 main::@4
b4:
//SEG11 [5] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 [ ] ( main:2 [ ] ) -- _deref_pbuc1_neq_vbuc2_then_la1
lda RASTER
cmp #$ff
bne b4
//SEG12 main::@6
//SEG13 [6] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset1#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #screen/$40|charset1/$400
sta D018
//SEG14 [7] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 6 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #6
sta BGCOL
//SEG15 main::@7
b7:
//SEG16 [8] if(*((const byte*) RASTER#0)!=(byte/signed byte/word/signed word/dword/signed dword) 98) goto main::@7 [ ] ( main:2 [ ] ) -- _deref_pbuc1_neq_vbuc2_then_la1
lda RASTER
cmp #$62
bne b7
//SEG17 main::@9
//SEG18 [9] *((const byte*) D018#0) ← ((byte))(word)(const byte*) screen#0/(byte/signed byte/word/signed word/dword/signed dword) 64|(word)(const byte*) charset2#0/(word/signed word/dword/signed dword) 1024 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #screen/$40|charset2/$400
sta D018
//SEG19 [10] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word/dword/signed dword) 11 [ ] ( main:2 [ ] ) -- _deref_pbuc1=vbuc2
lda #$b
sta BGCOL
jmp b4
}

View File

@ -0,0 +1,21 @@
(label) @1
(label) @begin
(label) @end
(byte*) BGCOL
(const byte*) BGCOL#0 BGCOL = ((byte*))(word/dword/signed dword) 53281
(byte*) D018
(const byte*) D018#0 D018 = ((byte*))(word/dword/signed dword) 53272
(byte*) RASTER
(const byte*) RASTER#0 RASTER = ((byte*))(word/dword/signed dword) 53266
(byte*) charset1
(const byte*) charset1#0 charset1 = ((byte*))(word/signed word/dword/signed dword) 4096
(byte*) charset2
(const byte*) charset2#0 charset2 = ((byte*))(word/signed word/dword/signed dword) 6144
(void()) main()
(label) main::@4
(label) main::@6
(label) main::@7
(label) main::@9
(byte*) screen
(const byte*) screen#0 screen = ((byte*))(word/signed word/dword/signed dword) 1024