diff --git a/src/main/java/dk/camelot64/kickc/model/operators/Operators.java b/src/main/java/dk/camelot64/kickc/model/operators/Operators.java index 60fedac47..1c2dbe441 100644 --- a/src/main/java/dk/camelot64/kickc/model/operators/Operators.java +++ b/src/main/java/dk/camelot64/kickc/model/operators/Operators.java @@ -98,6 +98,16 @@ public class Operators { } } + /** + * Get the binary operator to use for a sppecific compound assignment + * @param operator The compound operator as a string + * @return The binary operator to use + */ + public static Operator getBinaryCompound(String operator) { + return getBinary(operator.substring(0, operator.length()-1)); + } + + public static Operator getUnary(String op) { switch(op) { case "+": @@ -149,4 +159,5 @@ public class Operators { } } + } diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 index 907bc7592..72cd08e2d 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 @@ -94,6 +94,7 @@ expr | expr ( '&&' ) expr #exprBinary | expr ( '||' ) expr #exprBinary | expr '=' expr #exprAssignment + | expr ('+=' | '-=' | '*=' | '/=' | '%=' | '<<=' | '>>=' | '&=' | '|=' | '^=' ) expr #exprAssignmentCompound | '{' expr (',' expr )* '}' #initList | NAME #exprId | NUMBER #exprNumber diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens index 72c411bf8..c8b1e82cb 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens @@ -45,25 +45,35 @@ T__43=44 T__44=45 T__45=46 T__46=47 -MNEMONIC=48 -SIMPLETYPE=49 -STRING=50 -CHAR=51 -BOOLEAN=52 -NUMBER=53 -NUMFLOAT=54 -BINFLOAT=55 -DECFLOAT=56 -HEXFLOAT=57 -NUMINT=58 -BININTEGER=59 -DECINTEGER=60 -HEXINTEGER=61 -NAME=62 -ASMREL=63 -WS=64 -COMMENT_LINE=65 -COMMENT_BLOCK=66 +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 'import'=1 '('=2 ')'=3 @@ -109,5 +119,15 @@ COMMENT_BLOCK=66 '|'=43 '&&'=44 '||'=45 -'.byte'=46 -'#'=47 +'+='=46 +'-='=47 +'*='=48 +'/='=49 +'%='=50 +'<<='=51 +'>>='=52 +'&='=53 +'|='=54 +'^='=55 +'.byte'=56 +'#'=57 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java index 9f3a7ec0e..6ab5b6816 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java @@ -515,6 +515,18 @@ public class KickCBaseListener implements KickCListener { *

The default implementation does nothing.

*/ @Override public void exitExprString(KickCParser.ExprStringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExprAssignmentCompound(KickCParser.ExprAssignmentCompoundContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExprAssignmentCompound(KickCParser.ExprAssignmentCompoundContext ctx) { } /** * {@inheritDoc} * diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java index 9a3e4d920..47d32e255 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java @@ -305,6 +305,13 @@ public class KickCBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitExprString(KickCParser.ExprStringContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExprAssignmentCompound(KickCParser.ExprAssignmentCompoundContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java index a4d9742f5..9e9e2c3a4 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java @@ -23,10 +23,11 @@ public class KickCLexer extends Lexer { T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31, 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, MNEMONIC=48, SIMPLETYPE=49, STRING=50, CHAR=51, BOOLEAN=52, - NUMBER=53, NUMFLOAT=54, BINFLOAT=55, DECFLOAT=56, HEXFLOAT=57, NUMINT=58, - BININTEGER=59, DECINTEGER=60, HEXINTEGER=61, NAME=62, ASMREL=63, WS=64, - COMMENT_LINE=65, COMMENT_BLOCK=66; + 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; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -41,11 +42,12 @@ public class KickCLexer extends Lexer { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "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", "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__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" }; private static final String[] _LITERAL_NAMES = { @@ -54,16 +56,18 @@ public class KickCLexer extends Lexer { "'return'", "'asm'", "':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", - "'.byte'", "'#'" + "'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", + "'^='", "'.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, - "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", - "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", - "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" + 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" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -123,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\2D\u02db\b\1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2N\u030f\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"+ @@ -131,272 +135,283 @@ public class KickCLexer extends Lexer { "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ ",\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\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/\3/\3/\3"+ - "\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5"+ - "\61\u0208\n\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+ - "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u021f\n\62\3\63"+ - "\3\63\3\63\3\63\7\63\u0225\n\63\f\63\16\63\u0228\13\63\3\63\3\63\3\64"+ - "\3\64\3\64\3\64\5\64\u0230\n\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65"+ - "\3\65\3\65\3\65\5\65\u023d\n\65\3\66\3\66\5\66\u0241\n\66\3\67\3\67\3"+ - "\67\5\67\u0246\n\67\38\38\38\38\38\58\u024d\n8\38\78\u0250\n8\f8\168\u0253"+ - "\138\38\38\68\u0257\n8\r8\168\u0258\39\79\u025c\n9\f9\169\u025f\139\3"+ - "9\39\69\u0263\n9\r9\169\u0264\3:\3:\3:\3:\3:\5:\u026c\n:\3:\7:\u026f\n"+ - ":\f:\16:\u0272\13:\3:\3:\6:\u0276\n:\r:\16:\u0277\3;\3;\3;\5;\u027d\n"+ - ";\3<\3<\3<\6<\u0282\n<\r<\16<\u0283\3<\3<\6<\u0288\n<\r<\16<\u0289\5<"+ - "\u028c\n<\3=\6=\u028f\n=\r=\16=\u0290\3>\3>\3>\3>\3>\5>\u0298\n>\3>\6"+ - ">\u029b\n>\r>\16>\u029c\3?\3?\3@\3@\3A\3A\3B\3B\7B\u02a7\nB\fB\16B\u02aa"+ - "\13B\3C\3C\3D\3D\3E\3E\7E\u02b2\nE\fE\16E\u02b5\13E\3E\6E\u02b8\nE\rE"+ - "\16E\u02b9\3F\6F\u02bd\nF\rF\16F\u02be\3F\3F\3G\3G\3G\3G\7G\u02c7\nG\f"+ - "G\16G\u02ca\13G\3G\3G\3H\3H\3H\3H\7H\u02d2\nH\fH\16H\u02d5\13H\3H\3H\3"+ - "H\3H\3H\3\u02d3\2I\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r"+ + "\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{?}\2\177\2\u0081\2\u0083@\u0085\2\u0087"+ - "\2\u0089A\u008bB\u008dC\u008fD\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\u0342\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\2"+ - "Q\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\2"+ - "w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2\u0083\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\3\u0091\3\2\2\2\5\u0098\3\2\2"+ - "\2\7\u009a\3\2\2\2\t\u009c\3\2\2\2\13\u009e\3\2\2\2\r\u00a0\3\2\2\2\17"+ - "\u00a2\3\2\2\2\21\u00a4\3\2\2\2\23\u00a6\3\2\2\2\25\u00ac\3\2\2\2\27\u00b2"+ - "\3\2\2\2\31\u00bb\3\2\2\2\33\u00be\3\2\2\2\35\u00c3\3\2\2\2\37\u00c9\3"+ - "\2\2\2!\u00cc\3\2\2\2#\u00d0\3\2\2\2%\u00d7\3\2\2\2\'\u00db\3\2\2\2)\u00dd"+ - "\3\2\2\2+\u00e0\3\2\2\2-\u00e7\3\2\2\2/\u00e9\3\2\2\2\61\u00eb\3\2\2\2"+ - "\63\u00ed\3\2\2\2\65\u00f0\3\2\2\2\67\u00f3\3\2\2\29\u00f5\3\2\2\2;\u00f7"+ - "\3\2\2\2=\u00f9\3\2\2\2?\u00fb\3\2\2\2A\u00fd\3\2\2\2C\u0100\3\2\2\2E"+ - "\u0103\3\2\2\2G\u0105\3\2\2\2I\u0107\3\2\2\2K\u0109\3\2\2\2M\u010b\3\2"+ - "\2\2O\u010e\3\2\2\2Q\u0111\3\2\2\2S\u0114\3\2\2\2U\u0117\3\2\2\2W\u0119"+ - "\3\2\2\2Y\u011b\3\2\2\2[\u011e\3\2\2\2]\u0121\3\2\2\2_\u0127\3\2\2\2a"+ - "\u0207\3\2\2\2c\u021e\3\2\2\2e\u0220\3\2\2\2g\u022b\3\2\2\2i\u023c\3\2"+ - "\2\2k\u0240\3\2\2\2m\u0245\3\2\2\2o\u024c\3\2\2\2q\u025d\3\2\2\2s\u026b"+ - "\3\2\2\2u\u027c\3\2\2\2w\u028b\3\2\2\2y\u028e\3\2\2\2{\u0297\3\2\2\2}"+ - "\u029e\3\2\2\2\177\u02a0\3\2\2\2\u0081\u02a2\3\2\2\2\u0083\u02a4\3\2\2"+ - "\2\u0085\u02ab\3\2\2\2\u0087\u02ad\3\2\2\2\u0089\u02af\3\2\2\2\u008b\u02bc"+ - "\3\2\2\2\u008d\u02c2\3\2\2\2\u008f\u02cd\3\2\2\2\u0091\u0092\7k\2\2\u0092"+ - "\u0093\7o\2\2\u0093\u0094\7r\2\2\u0094\u0095\7q\2\2\u0095\u0096\7t\2\2"+ - "\u0096\u0097\7v\2\2\u0097\4\3\2\2\2\u0098\u0099\7*\2\2\u0099\6\3\2\2\2"+ - "\u009a\u009b\7+\2\2\u009b\b\3\2\2\2\u009c\u009d\7}\2\2\u009d\n\3\2\2\2"+ - "\u009e\u009f\7\177\2\2\u009f\f\3\2\2\2\u00a0\u00a1\7.\2\2\u00a1\16\3\2"+ - "\2\2\u00a2\u00a3\7?\2\2\u00a3\20\3\2\2\2\u00a4\u00a5\7=\2\2\u00a5\22\3"+ - "\2\2\2\u00a6\u00a7\7e\2\2\u00a7\u00a8\7q\2\2\u00a8\u00a9\7p\2\2\u00a9"+ - "\u00aa\7u\2\2\u00aa\u00ab\7v\2\2\u00ab\24\3\2\2\2\u00ac\u00ad\7c\2\2\u00ad"+ - "\u00ae\7n\2\2\u00ae\u00af\7k\2\2\u00af\u00b0\7i\2\2\u00b0\u00b1\7p\2\2"+ - "\u00b1\26\3\2\2\2\u00b2\u00b3\7t\2\2\u00b3\u00b4\7g\2\2\u00b4\u00b5\7"+ - "i\2\2\u00b5\u00b6\7k\2\2\u00b6\u00b7\7u\2\2\u00b7\u00b8\7v\2\2\u00b8\u00b9"+ - "\7g\2\2\u00b9\u00ba\7t\2\2\u00ba\30\3\2\2\2\u00bb\u00bc\7k\2\2\u00bc\u00bd"+ - "\7h\2\2\u00bd\32\3\2\2\2\u00be\u00bf\7g\2\2\u00bf\u00c0\7n\2\2\u00c0\u00c1"+ - "\7u\2\2\u00c1\u00c2\7g\2\2\u00c2\34\3\2\2\2\u00c3\u00c4\7y\2\2\u00c4\u00c5"+ - "\7j\2\2\u00c5\u00c6\7k\2\2\u00c6\u00c7\7n\2\2\u00c7\u00c8\7g\2\2\u00c8"+ - "\36\3\2\2\2\u00c9\u00ca\7f\2\2\u00ca\u00cb\7q\2\2\u00cb \3\2\2\2\u00cc"+ - "\u00cd\7h\2\2\u00cd\u00ce\7q\2\2\u00ce\u00cf\7t\2\2\u00cf\"\3\2\2\2\u00d0"+ - "\u00d1\7t\2\2\u00d1\u00d2\7g\2\2\u00d2\u00d3\7v\2\2\u00d3\u00d4\7w\2\2"+ - "\u00d4\u00d5\7t\2\2\u00d5\u00d6\7p\2\2\u00d6$\3\2\2\2\u00d7\u00d8\7c\2"+ - "\2\u00d8\u00d9\7u\2\2\u00d9\u00da\7o\2\2\u00da&\3\2\2\2\u00db\u00dc\7"+ - "<\2\2\u00dc(\3\2\2\2\u00dd\u00de\7\60\2\2\u00de\u00df\7\60\2\2\u00df*"+ - "\3\2\2\2\u00e0\u00e1\7u\2\2\u00e1\u00e2\7k\2\2\u00e2\u00e3\7i\2\2\u00e3"+ - "\u00e4\7p\2\2\u00e4\u00e5\7g\2\2\u00e5\u00e6\7f\2\2\u00e6,\3\2\2\2\u00e7"+ - "\u00e8\7,\2\2\u00e8.\3\2\2\2\u00e9\u00ea\7]\2\2\u00ea\60\3\2\2\2\u00eb"+ - "\u00ec\7_\2\2\u00ec\62\3\2\2\2\u00ed\u00ee\7/\2\2\u00ee\u00ef\7/\2\2\u00ef"+ - "\64\3\2\2\2\u00f0\u00f1\7-\2\2\u00f1\u00f2\7-\2\2\u00f2\66\3\2\2\2\u00f3"+ - "\u00f4\7-\2\2\u00f48\3\2\2\2\u00f5\u00f6\7/\2\2\u00f6:\3\2\2\2\u00f7\u00f8"+ - "\7#\2\2\u00f8<\3\2\2\2\u00f9\u00fa\7(\2\2\u00fa>\3\2\2\2\u00fb\u00fc\7"+ - "\u0080\2\2\u00fc@\3\2\2\2\u00fd\u00fe\7@\2\2\u00fe\u00ff\7@\2\2\u00ff"+ - "B\3\2\2\2\u0100\u0101\7>\2\2\u0101\u0102\7>\2\2\u0102D\3\2\2\2\u0103\u0104"+ - "\7\61\2\2\u0104F\3\2\2\2\u0105\u0106\7\'\2\2\u0106H\3\2\2\2\u0107\u0108"+ - "\7>\2\2\u0108J\3\2\2\2\u0109\u010a\7@\2\2\u010aL\3\2\2\2\u010b\u010c\7"+ - "?\2\2\u010c\u010d\7?\2\2\u010dN\3\2\2\2\u010e\u010f\7#\2\2\u010f\u0110"+ - "\7?\2\2\u0110P\3\2\2\2\u0111\u0112\7>\2\2\u0112\u0113\7?\2\2\u0113R\3"+ - "\2\2\2\u0114\u0115\7@\2\2\u0115\u0116\7?\2\2\u0116T\3\2\2\2\u0117\u0118"+ - "\7`\2\2\u0118V\3\2\2\2\u0119\u011a\7~\2\2\u011aX\3\2\2\2\u011b\u011c\7"+ - "(\2\2\u011c\u011d\7(\2\2\u011dZ\3\2\2\2\u011e\u011f\7~\2\2\u011f\u0120"+ - "\7~\2\2\u0120\\\3\2\2\2\u0121\u0122\7\60\2\2\u0122\u0123\7d\2\2\u0123"+ - "\u0124\7{\2\2\u0124\u0125\7v\2\2\u0125\u0126\7g\2\2\u0126^\3\2\2\2\u0127"+ - "\u0128\7%\2\2\u0128`\3\2\2\2\u0129\u012a\7d\2\2\u012a\u012b\7t\2\2\u012b"+ - "\u0208\7m\2\2\u012c\u012d\7q\2\2\u012d\u012e\7t\2\2\u012e\u0208\7c\2\2"+ - "\u012f\u0130\7m\2\2\u0130\u0131\7k\2\2\u0131\u0208\7n\2\2\u0132\u0133"+ - "\7u\2\2\u0133\u0134\7n\2\2\u0134\u0208\7q\2\2\u0135\u0136\7p\2\2\u0136"+ - "\u0137\7q\2\2\u0137\u0208\7r\2\2\u0138\u0139\7c\2\2\u0139\u013a\7u\2\2"+ - "\u013a\u0208\7n\2\2\u013b\u013c\7r\2\2\u013c\u013d\7j\2\2\u013d\u0208"+ - "\7r\2\2\u013e\u013f\7c\2\2\u013f\u0140\7p\2\2\u0140\u0208\7e\2\2\u0141"+ - "\u0142\7d\2\2\u0142\u0143\7r\2\2\u0143\u0208\7n\2\2\u0144\u0145\7e\2\2"+ - "\u0145\u0146\7n\2\2\u0146\u0208\7e\2\2\u0147\u0148\7l\2\2\u0148\u0149"+ - "\7u\2\2\u0149\u0208\7t\2\2\u014a\u014b\7c\2\2\u014b\u014c\7p\2\2\u014c"+ - "\u0208\7f\2\2\u014d\u014e\7t\2\2\u014e\u014f\7n\2\2\u014f\u0208\7c\2\2"+ - "\u0150\u0151\7d\2\2\u0151\u0152\7k\2\2\u0152\u0208\7v\2\2\u0153\u0154"+ - "\7t\2\2\u0154\u0155\7q\2\2\u0155\u0208\7n\2\2\u0156\u0157\7r\2\2\u0157"+ - "\u0158\7n\2\2\u0158\u0208\7c\2\2\u0159\u015a\7r\2\2\u015a\u015b\7n\2\2"+ - "\u015b\u0208\7r\2\2\u015c\u015d\7d\2\2\u015d\u015e\7o\2\2\u015e\u0208"+ - "\7k\2\2\u015f\u0160\7u\2\2\u0160\u0161\7g\2\2\u0161\u0208\7e\2\2\u0162"+ - "\u0163\7t\2\2\u0163\u0164\7v\2\2\u0164\u0208\7k\2\2\u0165\u0166\7g\2\2"+ - "\u0166\u0167\7q\2\2\u0167\u0208\7t\2\2\u0168\u0169\7u\2\2\u0169\u016a"+ - "\7t\2\2\u016a\u0208\7g\2\2\u016b\u016c\7n\2\2\u016c\u016d\7u\2\2\u016d"+ - "\u0208\7t\2\2\u016e\u016f\7r\2\2\u016f\u0170\7j\2\2\u0170\u0208\7c\2\2"+ - "\u0171\u0172\7c\2\2\u0172\u0173\7n\2\2\u0173\u0208\7t\2\2\u0174\u0175"+ - "\7l\2\2\u0175\u0176\7o\2\2\u0176\u0208\7r\2\2\u0177\u0178\7d\2\2\u0178"+ - "\u0179\7x\2\2\u0179\u0208\7e\2\2\u017a\u017b\7e\2\2\u017b\u017c\7n\2\2"+ - "\u017c\u0208\7k\2\2\u017d\u017e\7t\2\2\u017e\u017f\7v\2\2\u017f\u0208"+ - "\7u\2\2\u0180\u0181\7c\2\2\u0181\u0182\7f\2\2\u0182\u0208\7e\2\2\u0183"+ - "\u0184\7t\2\2\u0184\u0185\7t\2\2\u0185\u0208\7c\2\2\u0186\u0187\7d\2\2"+ - "\u0187\u0188\7x\2\2\u0188\u0208\7u\2\2\u0189\u018a\7u\2\2\u018a\u018b"+ - "\7g\2\2\u018b\u0208\7k\2\2\u018c\u018d\7u\2\2\u018d\u018e\7c\2\2\u018e"+ - "\u0208\7z\2\2\u018f\u0190\7u\2\2\u0190\u0191\7v\2\2\u0191\u0208\7{\2\2"+ - "\u0192\u0193\7u\2\2\u0193\u0194\7v\2\2\u0194\u0208\7c\2\2\u0195\u0196"+ - "\7u\2\2\u0196\u0197\7v\2\2\u0197\u0208\7z\2\2\u0198\u0199\7f\2\2\u0199"+ - "\u019a\7g\2\2\u019a\u0208\7{\2\2\u019b\u019c\7v\2\2\u019c\u019d\7z\2\2"+ - "\u019d\u0208\7c\2\2\u019e\u019f\7z\2\2\u019f\u01a0\7c\2\2\u01a0\u0208"+ - "\7c\2\2\u01a1\u01a2\7d\2\2\u01a2\u01a3\7e\2\2\u01a3\u0208\7e\2\2\u01a4"+ - "\u01a5\7c\2\2\u01a5\u01a6\7j\2\2\u01a6\u0208\7z\2\2\u01a7\u01a8\7v\2\2"+ - "\u01a8\u01a9\7{\2\2\u01a9\u0208\7c\2\2\u01aa\u01ab\7v\2\2\u01ab\u01ac"+ - "\7z\2\2\u01ac\u0208\7u\2\2\u01ad\u01ae\7v\2\2\u01ae\u01af\7c\2\2\u01af"+ - "\u0208\7u\2\2\u01b0\u01b1\7u\2\2\u01b1\u01b2\7j\2\2\u01b2\u0208\7{\2\2"+ - "\u01b3\u01b4\7u\2\2\u01b4\u01b5\7j\2\2\u01b5\u0208\7z\2\2\u01b6\u01b7"+ - "\7n\2\2\u01b7\u01b8\7f\2\2\u01b8\u0208\7{\2\2\u01b9\u01ba\7n\2\2\u01ba"+ - "\u01bb\7f\2\2\u01bb\u0208\7c\2\2\u01bc\u01bd\7n\2\2\u01bd\u01be\7f\2\2"+ - "\u01be\u0208\7z\2\2\u01bf\u01c0\7n\2\2\u01c0\u01c1\7c\2\2\u01c1\u0208"+ - "\7z\2\2\u01c2\u01c3\7v\2\2\u01c3\u01c4\7c\2\2\u01c4\u0208\7{\2\2\u01c5"+ - "\u01c6\7v\2\2\u01c6\u01c7\7c\2\2\u01c7\u0208\7z\2\2\u01c8\u01c9\7d\2\2"+ - "\u01c9\u01ca\7e\2\2\u01ca\u0208\7u\2\2\u01cb\u01cc\7e\2\2\u01cc\u01cd"+ - "\7n\2\2\u01cd\u0208\7x\2\2\u01ce\u01cf\7v\2\2\u01cf\u01d0\7u\2\2\u01d0"+ - "\u0208\7z\2\2\u01d1\u01d2\7n\2\2\u01d2\u01d3\7c\2\2\u01d3\u0208\7u\2\2"+ - "\u01d4\u01d5\7e\2\2\u01d5\u01d6\7r\2\2\u01d6\u0208\7{\2\2\u01d7\u01d8"+ - "\7e\2\2\u01d8\u01d9\7o\2\2\u01d9\u0208\7r\2\2\u01da\u01db\7e\2\2\u01db"+ - "\u01dc\7r\2\2\u01dc\u0208\7z\2\2\u01dd\u01de\7f\2\2\u01de\u01df\7e\2\2"+ - "\u01df\u0208\7r\2\2\u01e0\u01e1\7f\2\2\u01e1\u01e2\7g\2\2\u01e2\u0208"+ - "\7e\2\2\u01e3\u01e4\7k\2\2\u01e4\u01e5\7p\2\2\u01e5\u0208\7e\2\2\u01e6"+ - "\u01e7\7c\2\2\u01e7\u01e8\7z\2\2\u01e8\u0208\7u\2\2\u01e9\u01ea\7d\2\2"+ - "\u01ea\u01eb\7p\2\2\u01eb\u0208\7g\2\2\u01ec\u01ed\7e\2\2\u01ed\u01ee"+ - "\7n\2\2\u01ee\u0208\7f\2\2\u01ef\u01f0\7u\2\2\u01f0\u01f1\7d\2\2\u01f1"+ - "\u0208\7e\2\2\u01f2\u01f3\7k\2\2\u01f3\u01f4\7u\2\2\u01f4\u0208\7e\2\2"+ - "\u01f5\u01f6\7k\2\2\u01f6\u01f7\7p\2\2\u01f7\u0208\7z\2\2\u01f8\u01f9"+ - "\7d\2\2\u01f9\u01fa\7g\2\2\u01fa\u0208\7s\2\2\u01fb\u01fc\7u\2\2\u01fc"+ - "\u01fd\7g\2\2\u01fd\u0208\7f\2\2\u01fe\u01ff\7f\2\2\u01ff\u0200\7g\2\2"+ - "\u0200\u0208\7z\2\2\u0201\u0202\7k\2\2\u0202\u0203\7p\2\2\u0203\u0208"+ - "\7{\2\2\u0204\u0205\7t\2\2\u0205\u0206\7q\2\2\u0206\u0208\7t\2\2\u0207"+ - "\u0129\3\2\2\2\u0207\u012c\3\2\2\2\u0207\u012f\3\2\2\2\u0207\u0132\3\2"+ - "\2\2\u0207\u0135\3\2\2\2\u0207\u0138\3\2\2\2\u0207\u013b\3\2\2\2\u0207"+ - "\u013e\3\2\2\2\u0207\u0141\3\2\2\2\u0207\u0144\3\2\2\2\u0207\u0147\3\2"+ - "\2\2\u0207\u014a\3\2\2\2\u0207\u014d\3\2\2\2\u0207\u0150\3\2\2\2\u0207"+ - "\u0153\3\2\2\2\u0207\u0156\3\2\2\2\u0207\u0159\3\2\2\2\u0207\u015c\3\2"+ - "\2\2\u0207\u015f\3\2\2\2\u0207\u0162\3\2\2\2\u0207\u0165\3\2\2\2\u0207"+ - "\u0168\3\2\2\2\u0207\u016b\3\2\2\2\u0207\u016e\3\2\2\2\u0207\u0171\3\2"+ - "\2\2\u0207\u0174\3\2\2\2\u0207\u0177\3\2\2\2\u0207\u017a\3\2\2\2\u0207"+ - "\u017d\3\2\2\2\u0207\u0180\3\2\2\2\u0207\u0183\3\2\2\2\u0207\u0186\3\2"+ - "\2\2\u0207\u0189\3\2\2\2\u0207\u018c\3\2\2\2\u0207\u018f\3\2\2\2\u0207"+ - "\u0192\3\2\2\2\u0207\u0195\3\2\2\2\u0207\u0198\3\2\2\2\u0207\u019b\3\2"+ - "\2\2\u0207\u019e\3\2\2\2\u0207\u01a1\3\2\2\2\u0207\u01a4\3\2\2\2\u0207"+ - "\u01a7\3\2\2\2\u0207\u01aa\3\2\2\2\u0207\u01ad\3\2\2\2\u0207\u01b0\3\2"+ - "\2\2\u0207\u01b3\3\2\2\2\u0207\u01b6\3\2\2\2\u0207\u01b9\3\2\2\2\u0207"+ - "\u01bc\3\2\2\2\u0207\u01bf\3\2\2\2\u0207\u01c2\3\2\2\2\u0207\u01c5\3\2"+ - "\2\2\u0207\u01c8\3\2\2\2\u0207\u01cb\3\2\2\2\u0207\u01ce\3\2\2\2\u0207"+ - "\u01d1\3\2\2\2\u0207\u01d4\3\2\2\2\u0207\u01d7\3\2\2\2\u0207\u01da\3\2"+ - "\2\2\u0207\u01dd\3\2\2\2\u0207\u01e0\3\2\2\2\u0207\u01e3\3\2\2\2\u0207"+ - "\u01e6\3\2\2\2\u0207\u01e9\3\2\2\2\u0207\u01ec\3\2\2\2\u0207\u01ef\3\2"+ - "\2\2\u0207\u01f2\3\2\2\2\u0207\u01f5\3\2\2\2\u0207\u01f8\3\2\2\2\u0207"+ - "\u01fb\3\2\2\2\u0207\u01fe\3\2\2\2\u0207\u0201\3\2\2\2\u0207\u0204\3\2"+ - "\2\2\u0208b\3\2\2\2\u0209\u020a\7d\2\2\u020a\u020b\7{\2\2\u020b\u020c"+ - "\7v\2\2\u020c\u021f\7g\2\2\u020d\u020e\7y\2\2\u020e\u020f\7q\2\2\u020f"+ - "\u0210\7t\2\2\u0210\u021f\7f\2\2\u0211\u0212\7f\2\2\u0212\u0213\7y\2\2"+ - "\u0213\u0214\7q\2\2\u0214\u0215\7t\2\2\u0215\u021f\7f\2\2\u0216\u0217"+ - "\7d\2\2\u0217\u0218\7q\2\2\u0218\u0219\7q\2\2\u0219\u021f\7n\2\2\u021a"+ - "\u021b\7x\2\2\u021b\u021c\7q\2\2\u021c\u021d\7k\2\2\u021d\u021f\7f\2\2"+ - "\u021e\u0209\3\2\2\2\u021e\u020d\3\2\2\2\u021e\u0211\3\2\2\2\u021e\u0216"+ - "\3\2\2\2\u021e\u021a\3\2\2\2\u021fd\3\2\2\2\u0220\u0226\7$\2\2\u0221\u0222"+ - "\7^\2\2\u0222\u0225\7$\2\2\u0223\u0225\n\2\2\2\u0224\u0221\3\2\2\2\u0224"+ - "\u0223\3\2\2\2\u0225\u0228\3\2\2\2\u0226\u0224\3\2\2\2\u0226\u0227\3\2"+ - "\2\2\u0227\u0229\3\2\2\2\u0228\u0226\3\2\2\2\u0229\u022a\7$\2\2\u022a"+ - "f\3\2\2\2\u022b\u022f\7)\2\2\u022c\u022d\7^\2\2\u022d\u0230\7)\2\2\u022e"+ - "\u0230\n\3\2\2\u022f\u022c\3\2\2\2\u022f\u022e\3\2\2\2\u0230\u0231\3\2"+ - "\2\2\u0231\u0232\7)\2\2\u0232h\3\2\2\2\u0233\u0234\7v\2\2\u0234\u0235"+ - "\7t\2\2\u0235\u0236\7w\2\2\u0236\u023d\7g\2\2\u0237\u0238\7h\2\2\u0238"+ - "\u0239\7c\2\2\u0239\u023a\7n\2\2\u023a\u023b\7u\2\2\u023b\u023d\7g\2\2"+ - "\u023c\u0233\3\2\2\2\u023c\u0237\3\2\2\2\u023dj\3\2\2\2\u023e\u0241\5"+ - "m\67\2\u023f\u0241\5u;\2\u0240\u023e\3\2\2\2\u0240\u023f\3\2\2\2\u0241"+ - "l\3\2\2\2\u0242\u0246\5o8\2\u0243\u0246\5q9\2\u0244\u0246\5s:\2\u0245"+ - "\u0242\3\2\2\2\u0245\u0243\3\2\2\2\u0245\u0244\3\2\2\2\u0246n\3\2\2\2"+ - "\u0247\u024d\7\'\2\2\u0248\u0249\7\62\2\2\u0249\u024d\7d\2\2\u024a\u024b"+ - "\7\62\2\2\u024b\u024d\7D\2\2\u024c\u0247\3\2\2\2\u024c\u0248\3\2\2\2\u024c"+ - "\u024a\3\2\2\2\u024d\u0251\3\2\2\2\u024e\u0250\5}?\2\u024f\u024e\3\2\2"+ - "\2\u0250\u0253\3\2\2\2\u0251\u024f\3\2\2\2\u0251\u0252\3\2\2\2\u0252\u0254"+ - "\3\2\2\2\u0253\u0251\3\2\2\2\u0254\u0256\7\60\2\2\u0255\u0257\5}?\2\u0256"+ - "\u0255\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u0256\3\2\2\2\u0258\u0259\3\2"+ - "\2\2\u0259p\3\2\2\2\u025a\u025c\5\177@\2\u025b\u025a\3\2\2\2\u025c\u025f"+ - "\3\2\2\2\u025d\u025b\3\2\2\2\u025d\u025e\3\2\2\2\u025e\u0260\3\2\2\2\u025f"+ - "\u025d\3\2\2\2\u0260\u0262\7\60\2\2\u0261\u0263\5\177@\2\u0262\u0261\3"+ - "\2\2\2\u0263\u0264\3\2\2\2\u0264\u0262\3\2\2\2\u0264\u0265\3\2\2\2\u0265"+ - "r\3\2\2\2\u0266\u026c\7&\2\2\u0267\u0268\7\62\2\2\u0268\u026c\7z\2\2\u0269"+ - "\u026a\7\62\2\2\u026a\u026c\7Z\2\2\u026b\u0266\3\2\2\2\u026b\u0267\3\2"+ - "\2\2\u026b\u0269\3\2\2\2\u026c\u0270\3\2\2\2\u026d\u026f\5\u0081A\2\u026e"+ - "\u026d\3\2\2\2\u026f\u0272\3\2\2\2\u0270\u026e\3\2\2\2\u0270\u0271\3\2"+ - "\2\2\u0271\u0273\3\2\2\2\u0272\u0270\3\2\2\2\u0273\u0275\7\60\2\2\u0274"+ - "\u0276\5\u0081A\2\u0275\u0274\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u0275"+ - "\3\2\2\2\u0277\u0278\3\2\2\2\u0278t\3\2\2\2\u0279\u027d\5y=\2\u027a\u027d"+ - "\5{>\2\u027b\u027d\5w<\2\u027c\u0279\3\2\2\2\u027c\u027a\3\2\2\2\u027c"+ - "\u027b\3\2\2\2\u027dv\3\2\2\2\u027e\u027f\7\62\2\2\u027f\u0281\t\4\2\2"+ - "\u0280\u0282\5}?\2\u0281\u0280\3\2\2\2\u0282\u0283\3\2\2\2\u0283\u0281"+ - "\3\2\2\2\u0283\u0284\3\2\2\2\u0284\u028c\3\2\2\2\u0285\u0287\7\'\2\2\u0286"+ - "\u0288\5}?\2\u0287\u0286\3\2\2\2\u0288\u0289\3\2\2\2\u0289\u0287\3\2\2"+ - "\2\u0289\u028a\3\2\2\2\u028a\u028c\3\2\2\2\u028b\u027e\3\2\2\2\u028b\u0285"+ - "\3\2\2\2\u028cx\3\2\2\2\u028d\u028f\5\177@\2\u028e\u028d\3\2\2\2\u028f"+ - "\u0290\3\2\2\2\u0290\u028e\3\2\2\2\u0290\u0291\3\2\2\2\u0291z\3\2\2\2"+ - "\u0292\u0298\7&\2\2\u0293\u0294\7\62\2\2\u0294\u0298\7z\2\2\u0295\u0296"+ - "\7\62\2\2\u0296\u0298\7Z\2\2\u0297\u0292\3\2\2\2\u0297\u0293\3\2\2\2\u0297"+ - "\u0295\3\2\2\2\u0298\u029a\3\2\2\2\u0299\u029b\5\u0081A\2\u029a\u0299"+ - "\3\2\2\2\u029b\u029c\3\2\2\2\u029c\u029a\3\2\2\2\u029c\u029d\3\2\2\2\u029d"+ - "|\3\2\2\2\u029e\u029f\t\5\2\2\u029f~\3\2\2\2\u02a0\u02a1\t\6\2\2\u02a1"+ - "\u0080\3\2\2\2\u02a2\u02a3\t\7\2\2\u02a3\u0082\3\2\2\2\u02a4\u02a8\5\u0085"+ - "C\2\u02a5\u02a7\5\u0087D\2\u02a6\u02a5\3\2\2\2\u02a7\u02aa\3\2\2\2\u02a8"+ - "\u02a6\3\2\2\2\u02a8\u02a9\3\2\2\2\u02a9\u0084\3\2\2\2\u02aa\u02a8\3\2"+ - "\2\2\u02ab\u02ac\t\b\2\2\u02ac\u0086\3\2\2\2\u02ad\u02ae\t\t\2\2\u02ae"+ - "\u0088\3\2\2\2\u02af\u02b3\7#\2\2\u02b0\u02b2\5\u0087D\2\u02b1\u02b0\3"+ - "\2\2\2\u02b2\u02b5\3\2\2\2\u02b3\u02b1\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4"+ - "\u02b7\3\2\2\2\u02b5\u02b3\3\2\2\2\u02b6\u02b8\t\n\2\2\u02b7\u02b6\3\2"+ - "\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02b7\3\2\2\2\u02b9\u02ba\3\2\2\2\u02ba"+ - "\u008a\3\2\2\2\u02bb\u02bd\t\13\2\2\u02bc\u02bb\3\2\2\2\u02bd\u02be\3"+ - "\2\2\2\u02be\u02bc\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c0\3\2\2\2\u02c0"+ - "\u02c1\bF\2\2\u02c1\u008c\3\2\2\2\u02c2\u02c3\7\61\2\2\u02c3\u02c4\7\61"+ - "\2\2\u02c4\u02c8\3\2\2\2\u02c5\u02c7\n\f\2\2\u02c6\u02c5\3\2\2\2\u02c7"+ - "\u02ca\3\2\2\2\u02c8\u02c6\3\2\2\2\u02c8\u02c9\3\2\2\2\u02c9\u02cb\3\2"+ - "\2\2\u02ca\u02c8\3\2\2\2\u02cb\u02cc\bG\2\2\u02cc\u008e\3\2\2\2\u02cd"+ - "\u02ce\7\61\2\2\u02ce\u02cf\7,\2\2\u02cf\u02d3\3\2\2\2\u02d0\u02d2\13"+ - "\2\2\2\u02d1\u02d0\3\2\2\2\u02d2\u02d5\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d3"+ - "\u02d1\3\2\2\2\u02d4\u02d6\3\2\2\2\u02d5\u02d3\3\2\2\2\u02d6\u02d7\7,"+ - "\2\2\u02d7\u02d8\7\61\2\2\u02d8\u02d9\3\2\2\2\u02d9\u02da\bH\2\2\u02da"+ - "\u0090\3\2\2\2 \2\u0207\u021e\u0224\u0226\u022f\u023c\u0240\u0245\u024c"+ - "\u0251\u0258\u025d\u0264\u026b\u0270\u0277\u027c\u0283\u0289\u028b\u0290"+ - "\u0297\u029c\u02a8\u02b3\u02b9\u02be\u02c8\u02d3\3\b\2\2"; + "e\64g\65i\66k\67m8o9q:s;u{?}@\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"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens index 72c411bf8..c8b1e82cb 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens @@ -45,25 +45,35 @@ T__43=44 T__44=45 T__45=46 T__46=47 -MNEMONIC=48 -SIMPLETYPE=49 -STRING=50 -CHAR=51 -BOOLEAN=52 -NUMBER=53 -NUMFLOAT=54 -BINFLOAT=55 -DECFLOAT=56 -HEXFLOAT=57 -NUMINT=58 -BININTEGER=59 -DECINTEGER=60 -HEXINTEGER=61 -NAME=62 -ASMREL=63 -WS=64 -COMMENT_LINE=65 -COMMENT_BLOCK=66 +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 'import'=1 '('=2 ')'=3 @@ -109,5 +119,15 @@ COMMENT_BLOCK=66 '|'=43 '&&'=44 '||'=45 -'.byte'=46 -'#'=47 +'+='=46 +'-='=47 +'*='=48 +'/='=49 +'%='=50 +'<<='=51 +'>>='=52 +'&='=53 +'|='=54 +'^='=55 +'.byte'=56 +'#'=57 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java index 5580e707d..91f4ff70c 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java @@ -493,6 +493,18 @@ public interface KickCListener extends ParseTreeListener { * @param ctx the parse tree */ void exitExprString(KickCParser.ExprStringContext ctx); + /** + * Enter a parse tree produced by the {@code exprAssignmentCompound} + * labeled alternative in {@link KickCParser#expr}. + * @param ctx the parse tree + */ + void enterExprAssignmentCompound(KickCParser.ExprAssignmentCompoundContext ctx); + /** + * Exit a parse tree produced by the {@code exprAssignmentCompound} + * labeled alternative in {@link KickCParser#expr}. + * @param ctx the parse tree + */ + void exitExprAssignmentCompound(KickCParser.ExprAssignmentCompoundContext ctx); /** * Enter a parse tree produced by the {@code exprBool} * labeled alternative in {@link KickCParser#expr}. diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java index 7fb868abb..a94e38f38 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java @@ -23,10 +23,11 @@ public class KickCParser extends Parser { T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31, 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, MNEMONIC=48, SIMPLETYPE=49, STRING=50, CHAR=51, BOOLEAN=52, - NUMBER=53, NUMFLOAT=54, BINFLOAT=55, DECFLOAT=56, HEXFLOAT=57, NUMINT=58, - BININTEGER=59, DECINTEGER=60, HEXINTEGER=61, NAME=62, ASMREL=63, WS=64, - COMMENT_LINE=65, COMMENT_BLOCK=66; + 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; public static final int RULE_file = 0, RULE_asmFile = 1, RULE_importSeq = 2, RULE_importDecl = 3, RULE_declSeq = 4, RULE_decl = 5, RULE_parameterListDecl = 6, RULE_parameterDecl = 7, @@ -48,16 +49,18 @@ public class KickCParser extends Parser { "'return'", "'asm'", "':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", - "'.byte'", "'#'" + "'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", + "'^='", "'.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, - "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", - "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", - "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" + 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" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -463,7 +466,7 @@ public class KickCParser extends Parser { setState(78); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__20) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__20) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER))) != 0) || _la==NAME) { { setState(77); stmtSeq(); @@ -906,7 +909,7 @@ public class KickCParser extends Parser { setState(142); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__20) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__20) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER))) != 0) || _la==NAME ); } } catch (RecognitionException re) { @@ -1146,7 +1149,7 @@ public class KickCParser extends Parser { setState(147); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__20) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__20) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER))) != 0) || _la==NAME) { { setState(146); stmtSeq(); @@ -1242,7 +1245,7 @@ public class KickCParser extends Parser { setState(179); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__20) | (1L << SIMPLETYPE) | (1L << NAME))) != 0)) { + if (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (T__8 - 9)) | (1L << (T__9 - 9)) | (1L << (T__10 - 9)) | (1L << (T__20 - 9)) | (1L << (SIMPLETYPE - 9)) | (1L << (NAME - 9)))) != 0)) { { setState(178); forDeclaration(); @@ -1266,7 +1269,7 @@ public class KickCParser extends Parser { setState(187); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER))) != 0) || _la==NAME) { { setState(186); expr(0); @@ -1692,7 +1695,7 @@ public class KickCParser extends Parser { setState(240); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER))) != 0) || _la==NAME) { { setState(239); expr(0); @@ -1966,6 +1969,28 @@ public class KickCParser extends Parser { else return visitor.visitChildren(this); } } + public static class ExprAssignmentCompoundContext extends ExprContext { + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public ExprAssignmentCompoundContext(ExprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprAssignmentCompound(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprAssignmentCompound(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof KickCVisitor ) return ((KickCVisitor)visitor).visitExprAssignmentCompound(this); + else return visitor.visitChildren(this); + } + } public static class ExprBoolContext extends ExprContext { public TerminalNode BOOLEAN() { return getToken(KickCParser.BOOLEAN, 0); } public ExprBoolContext(ExprContext ctx) { copyFrom(ctx); } @@ -2090,7 +2115,7 @@ public class KickCParser extends Parser { setState(256); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__21) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__35) | (1L << T__36) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER))) != 0) || _la==NAME) { { setState(255); parameterList(); @@ -2113,7 +2138,7 @@ public class KickCParser extends Parser { setState(261); match(T__2); setState(262); - expr(22); + expr(23); } break; case 4: @@ -2132,7 +2157,7 @@ public class KickCParser extends Parser { consume(); } setState(265); - expr(21); + expr(22); } break; case 5: @@ -2143,7 +2168,7 @@ public class KickCParser extends Parser { setState(266); match(T__21); setState(267); - expr(19); + expr(20); } break; case 6: @@ -2162,7 +2187,7 @@ public class KickCParser extends Parser { consume(); } setState(269); - expr(18); + expr(19); } break; case 7: @@ -2181,7 +2206,7 @@ public class KickCParser extends Parser { consume(); } setState(271); - expr(14); + expr(15); } break; case 8: @@ -2260,7 +2285,7 @@ public class KickCParser extends Parser { break; } _ctx.stop = _input.LT(-1); - setState(329); + setState(332); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,31,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -2268,7 +2293,7 @@ public class KickCParser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(327); + setState(330); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: @@ -2276,7 +2301,7 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(290); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(291); _la = _input.LA(1); if ( !(_la==T__31 || _la==T__32) ) { @@ -2288,7 +2313,7 @@ public class KickCParser extends Parser { consume(); } setState(292); - expr(18); + expr(19); } break; case 2: @@ -2296,7 +2321,7 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(293); - if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); setState(294); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__21) | (1L << T__33) | (1L << T__34))) != 0)) ) { @@ -2308,7 +2333,7 @@ public class KickCParser extends Parser { consume(); } setState(295); - expr(17); + expr(18); } break; case 3: @@ -2316,7 +2341,7 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(296); - if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); setState(297); _la = _input.LA(1); if ( !(_la==T__26 || _la==T__27) ) { @@ -2328,7 +2353,7 @@ public class KickCParser extends Parser { consume(); } setState(298); - expr(16); + expr(17); } break; case 4: @@ -2336,7 +2361,7 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(299); - if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); + if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); setState(300); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40))) != 0)) ) { @@ -2348,7 +2373,7 @@ public class KickCParser extends Parser { consume(); } setState(301); - expr(14); + expr(15); } break; case 5: @@ -2356,13 +2381,13 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(302); - if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); + if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); { setState(303); match(T__29); } setState(304); - expr(13); + expr(14); } break; case 6: @@ -2370,13 +2395,13 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(305); - if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); + if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); { setState(306); match(T__41); } setState(307); - expr(12); + expr(13); } break; case 7: @@ -2384,13 +2409,13 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(308); - if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); { setState(309); match(T__42); } setState(310); - expr(11); + expr(12); } break; case 8: @@ -2398,13 +2423,13 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(311); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { setState(312); match(T__43); } setState(313); - expr(10); + expr(11); } break; case 9: @@ -2412,13 +2437,13 @@ public class KickCParser extends Parser { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(314); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); { setState(315); match(T__44); } setState(316); - expr(9); + expr(10); } break; case 10: @@ -2426,34 +2451,54 @@ public class KickCParser extends Parser { _localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(317); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(318); match(T__6); setState(319); - expr(7); + expr(8); } break; case 11: { - _localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState)); + _localctx = new ExprAssignmentCompoundContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(320); - if (!(precpred(_ctx, 23))) throw new FailedPredicateException(this, "precpred(_ctx, 23)"); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(321); - match(T__22); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } setState(322); - expr(0); - setState(323); - match(T__23); + expr(7); } break; case 12: + { + _localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(323); + if (!(precpred(_ctx, 24))) throw new FailedPredicateException(this, "precpred(_ctx, 24)"); + setState(324); + match(T__22); + setState(325); + expr(0); + setState(326); + match(T__23); + } + break; + case 13: { _localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(325); - if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); - setState(326); + setState(328); + if (!(precpred(_ctx, 21))) throw new FailedPredicateException(this, "precpred(_ctx, 21)"); + setState(329); _la = _input.LA(1); if ( !(_la==T__24 || _la==T__25) ) { _errHandler.recoverInline(this); @@ -2468,7 +2513,7 @@ public class KickCParser extends Parser { } } } - setState(331); + setState(334); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,31,_ctx); } @@ -2518,21 +2563,21 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(332); + setState(335); expr(0); - setState(337); + setState(340); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__5) { { { - setState(333); + setState(336); match(T__5); - setState(334); + setState(337); expr(0); } } - setState(339); + setState(342); _errHandler.sync(this); _la = _input.LA(1); } @@ -2582,17 +2627,17 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(343); + setState(346); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__28) | (1L << T__45) | (1L << MNEMONIC) | (1L << NAME))) != 0)) { + while (((((_la - 29)) & ~0x3f) == 0 && ((1L << (_la - 29)) & ((1L << (T__28 - 29)) | (1L << (T__55 - 29)) | (1L << (MNEMONIC - 29)) | (1L << (NAME - 29)))) != 0)) { { { - setState(340); + setState(343); asmLine(); } } - setState(345); + setState(348); _errHandler.sync(this); _la = _input.LA(1); } @@ -2642,28 +2687,28 @@ public class KickCParser extends Parser { AsmLineContext _localctx = new AsmLineContext(_ctx, getState()); enterRule(_localctx, 36, RULE_asmLine); try { - setState(349); + setState(352); _errHandler.sync(this); switch (_input.LA(1)) { case T__28: case NAME: enterOuterAlt(_localctx, 1); { - setState(346); + setState(349); asmLabel(); } break; case MNEMONIC: enterOuterAlt(_localctx, 2); { - setState(347); + setState(350); asmInstruction(); } break; - case T__45: + case T__55: enterOuterAlt(_localctx, 3); { - setState(348); + setState(351); asmBytes(); } break; @@ -2733,16 +2778,16 @@ public class KickCParser extends Parser { enterRule(_localctx, 38, RULE_asmLabel); int _la; try { - setState(358); + setState(361); _errHandler.sync(this); switch (_input.LA(1)) { case NAME: _localctx = new AsmLabelNameContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(351); + setState(354); match(NAME); - setState(352); + setState(355); match(T__18); } break; @@ -2750,19 +2795,19 @@ public class KickCParser extends Parser { _localctx = new AsmLabelMultiContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(353); + setState(356); match(T__28); - setState(355); + setState(358); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAME) { { - setState(354); + setState(357); match(NAME); } } - setState(357); + setState(360); match(T__18); } break; @@ -2811,14 +2856,14 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(360); + setState(363); match(MNEMONIC); - setState(362); + setState(365); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(361); + setState(364); asmParamMode(); } break; @@ -2869,23 +2914,23 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(364); - match(T__45); - setState(365); + setState(367); + match(T__55); + setState(368); asmExpr(0); - setState(370); + setState(373); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__5) { { { - setState(366); + setState(369); match(T__5); - setState(367); + setState(370); asmExpr(0); } } - setState(372); + setState(375); _errHandler.sync(this); _la = _input.LA(1); } @@ -3035,14 +3080,14 @@ public class KickCParser extends Parser { AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState()); enterRule(_localctx, 44, RULE_asmParamMode); try { - setState(396); + setState(399); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: _localctx = new AsmModeAbsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(373); + setState(376); asmExpr(0); } break; @@ -3050,9 +3095,9 @@ public class KickCParser extends Parser { _localctx = new AsmModeImmContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(374); - match(T__46); - setState(375); + setState(377); + match(T__56); + setState(378); asmExpr(0); } break; @@ -3060,11 +3105,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeAbsXYContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(376); + setState(379); asmExpr(0); - setState(377); + setState(380); match(T__5); - setState(378); + setState(381); match(NAME); } break; @@ -3072,15 +3117,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndIdxXYContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(380); - match(T__1); - setState(381); - asmExpr(0); - setState(382); - match(T__2); setState(383); - match(T__5); + match(T__1); setState(384); + asmExpr(0); + setState(385); + match(T__2); + setState(386); + match(T__5); + setState(387); match(NAME); } break; @@ -3088,15 +3133,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIdxIndXYContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(386); - match(T__1); - setState(387); - asmExpr(0); - setState(388); - match(T__5); setState(389); - match(NAME); + match(T__1); setState(390); + asmExpr(0); + setState(391); + match(T__5); + setState(392); + match(NAME); + setState(393); match(T__2); } break; @@ -3104,11 +3149,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(392); + setState(395); match(T__1); - setState(393); + setState(396); asmExpr(0); - setState(394); + setState(397); match(T__2); } break; @@ -3298,7 +3343,7 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(412); + setState(415); _errHandler.sync(this); switch (_input.LA(1)) { case T__22: @@ -3307,11 +3352,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(399); + setState(402); match(T__22); - setState(400); + setState(403); asmExpr(0); - setState(401); + setState(404); match(T__23); } break; @@ -3323,7 +3368,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(403); + setState(406); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__27) | (1L << T__35) | (1L << T__36))) != 0)) ) { _errHandler.recoverInline(this); @@ -3333,7 +3378,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(404); + setState(407); asmExpr(8); } break; @@ -3342,7 +3387,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(405); + setState(408); match(NAME); } break; @@ -3351,7 +3396,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelRelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(406); + setState(409); match(ASMREL); } break; @@ -3360,11 +3405,11 @@ public class KickCParser extends Parser { _localctx = new AsmExprReplaceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(407); + setState(410); match(T__3); - setState(408); + setState(411); match(NAME); - setState(409); + setState(412); match(T__4); } break; @@ -3373,7 +3418,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprIntContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(410); + setState(413); match(NUMBER); } break; @@ -3382,7 +3427,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(411); + setState(414); match(CHAR); } break; @@ -3390,7 +3435,7 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(425); + setState(428); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,42,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -3398,16 +3443,16 @@ public class KickCParser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(423); + setState(426); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(414); + setState(417); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(415); + setState(418); _la = _input.LA(1); if ( !(_la==T__31 || _la==T__32) ) { _errHandler.recoverInline(this); @@ -3417,7 +3462,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(416); + setState(419); asmExpr(10); } break; @@ -3425,9 +3470,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(417); + setState(420); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(418); + setState(421); _la = _input.LA(1); if ( !(_la==T__21 || _la==T__33) ) { _errHandler.recoverInline(this); @@ -3437,7 +3482,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(419); + setState(422); asmExpr(8); } break; @@ -3445,9 +3490,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(420); + setState(423); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(421); + setState(424); _la = _input.LA(1); if ( !(_la==T__26 || _la==T__27) ) { _errHandler.recoverInline(this); @@ -3457,14 +3502,14 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(422); + setState(425); asmExpr(7); } break; } } } - setState(427); + setState(430); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,42,_ctx); } @@ -3504,46 +3549,48 @@ public class KickCParser extends Parser { private boolean expr_sempred(ExprContext _localctx, int predIndex) { switch (predIndex) { case 2: - return precpred(_ctx, 17); + return precpred(_ctx, 18); case 3: - return precpred(_ctx, 16); + return precpred(_ctx, 17); case 4: - return precpred(_ctx, 15); + return precpred(_ctx, 16); case 5: - return precpred(_ctx, 13); + return precpred(_ctx, 14); case 6: - return precpred(_ctx, 12); + return precpred(_ctx, 13); case 7: - return precpred(_ctx, 11); + return precpred(_ctx, 12); case 8: - return precpred(_ctx, 10); + return precpred(_ctx, 11); case 9: - return precpred(_ctx, 9); + return precpred(_ctx, 10); case 10: - return precpred(_ctx, 8); + return precpred(_ctx, 9); case 11: - return precpred(_ctx, 7); + return precpred(_ctx, 8); case 12: - return precpred(_ctx, 23); + return precpred(_ctx, 7); case 13: - return precpred(_ctx, 20); + return precpred(_ctx, 24); + case 14: + return precpred(_ctx, 21); } return true; } private boolean asmExpr_sempred(AsmExprContext _localctx, int predIndex) { switch (predIndex) { - case 14: - return precpred(_ctx, 9); case 15: - return precpred(_ctx, 7); + return precpred(_ctx, 9); case 16: + return precpred(_ctx, 7); + case 17: return precpred(_ctx, 6); } return true; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3D\u01af\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3N\u01b2\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"+ @@ -3567,146 +3614,147 @@ public class KickCParser extends Parser { "\16\21\u011a\13\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u0123\n\21"+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ - "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u014a\n\21\f\21\16"+ - "\21\u014d\13\21\3\22\3\22\3\22\7\22\u0152\n\22\f\22\16\22\u0155\13\22"+ - "\3\23\7\23\u0158\n\23\f\23\16\23\u015b\13\23\3\24\3\24\3\24\5\24\u0160"+ - "\n\24\3\25\3\25\3\25\3\25\5\25\u0166\n\25\3\25\5\25\u0169\n\25\3\26\3"+ - "\26\5\26\u016d\n\26\3\27\3\27\3\27\3\27\7\27\u0173\n\27\f\27\16\27\u0176"+ - "\13\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ - "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u018f\n\30\3\31"+ - "\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\5\31"+ - "\u019f\n\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\7\31\u01aa\n"+ - "\31\f\31\16\31\u01ad\13\31\3\31\2\5\36 \60\32\2\4\6\b\n\f\16\20\22\24"+ - "\26\30\32\34\36 \"$&(*,.\60\2\13\3\2\33\34\3\2\35!\3\2&\'\3\2\"#\4\2\30"+ - "\30$%\3\2\35\36\3\2&+\4\2\35\36&\'\4\2\30\30$$\2\u01e9\2\62\3\2\2\2\4"+ - "\66\3\2\2\2\6<\3\2\2\2\b?\3\2\2\2\nC\3\2\2\2\fU\3\2\2\2\16W\3\2\2\2\20"+ - "b\3\2\2\2\22q\3\2\2\2\24\u008b\3\2\2\2\26\u008e\3\2\2\2\30\u00c5\3\2\2"+ - "\2\32\u00ca\3\2\2\2\34\u00e5\3\2\2\2\36\u00eb\3\2\2\2 \u0122\3\2\2\2\""+ - "\u014e\3\2\2\2$\u0159\3\2\2\2&\u015f\3\2\2\2(\u0168\3\2\2\2*\u016a\3\2"+ - "\2\2,\u016e\3\2\2\2.\u018e\3\2\2\2\60\u019e\3\2\2\2\62\63\5\6\4\2\63\64"+ - "\5\n\6\2\64\65\7\2\2\3\65\3\3\2\2\2\66\67\5$\23\2\678\7\2\2\38\5\3\2\2"+ - "\29;\5\b\5\2:9\3\2\2\2;>\3\2\2\2<:\3\2\2\2<=\3\2\2\2=\7\3\2\2\2><\3\2"+ - "\2\2?@\7\3\2\2@A\7\64\2\2A\t\3\2\2\2BD\5\f\7\2CB\3\2\2\2DE\3\2\2\2EC\3"+ - "\2\2\2EF\3\2\2\2F\13\3\2\2\2GH\5\36\20\2HI\7@\2\2IK\7\4\2\2JL\5\16\b\2"+ - "KJ\3\2\2\2KL\3\2\2\2LM\3\2\2\2MN\7\5\2\2NP\7\6\2\2OQ\5\26\f\2PO\3\2\2"+ - "\2PQ\3\2\2\2QR\3\2\2\2RS\7\7\2\2SV\3\2\2\2TV\5\22\n\2UG\3\2\2\2UT\3\2"+ - "\2\2V\r\3\2\2\2W\\\5\20\t\2XY\7\b\2\2Y[\5\20\t\2ZX\3\2\2\2[^\3\2\2\2\\"+ - "Z\3\2\2\2\\]\3\2\2\2]\17\3\2\2\2^\\\3\2\2\2_a\5\24\13\2`_\3\2\2\2ad\3"+ - "\2\2\2b`\3\2\2\2bc\3\2\2\2ce\3\2\2\2db\3\2\2\2ei\5\36\20\2fh\5\24\13\2"+ - "gf\3\2\2\2hk\3\2\2\2ig\3\2\2\2ij\3\2\2\2jl\3\2\2\2ki\3\2\2\2lm\7@\2\2"+ - "m\21\3\2\2\2np\5\24\13\2on\3\2\2\2ps\3\2\2\2qo\3\2\2\2qr\3\2\2\2rt\3\2"+ - "\2\2sq\3\2\2\2tx\5\36\20\2uw\5\24\13\2vu\3\2\2\2wz\3\2\2\2xv\3\2\2\2x"+ - "y\3\2\2\2y{\3\2\2\2zx\3\2\2\2{~\7@\2\2|}\7\t\2\2}\177\5 \21\2~|\3\2\2"+ - "\2~\177\3\2\2\2\177\u0080\3\2\2\2\u0080\u0081\7\n\2\2\u0081\23\3\2\2\2"+ - "\u0082\u008c\7\13\2\2\u0083\u0084\7\f\2\2\u0084\u0085\7\4\2\2\u0085\u0086"+ - "\7\67\2\2\u0086\u008c\7\5\2\2\u0087\u0088\7\r\2\2\u0088\u0089\7\4\2\2"+ - "\u0089\u008a\7@\2\2\u008a\u008c\7\5\2\2\u008b\u0082\3\2\2\2\u008b\u0083"+ - "\3\2\2\2\u008b\u0087\3\2\2\2\u008c\25\3\2\2\2\u008d\u008f\5\30\r\2\u008e"+ - "\u008d\3\2\2\2\u008f\u0090\3\2\2\2\u0090\u008e\3\2\2\2\u0090\u0091\3\2"+ - "\2\2\u0091\27\3\2\2\2\u0092\u00c6\5\22\n\2\u0093\u0095\7\6\2\2\u0094\u0096"+ - "\5\26\f\2\u0095\u0094\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0097\3\2\2\2"+ - "\u0097\u00c6\7\7\2\2\u0098\u0099\5 \21\2\u0099\u009a\7\n\2\2\u009a\u00c6"+ - "\3\2\2\2\u009b\u009c\7\16\2\2\u009c\u009d\7\4\2\2\u009d\u009e\5 \21\2"+ - "\u009e\u009f\7\5\2\2\u009f\u00a2\5\30\r\2\u00a0\u00a1\7\17\2\2\u00a1\u00a3"+ - "\5\30\r\2\u00a2\u00a0\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00c6\3\2\2\2"+ - "\u00a4\u00a5\7\20\2\2\u00a5\u00a6\7\4\2\2\u00a6\u00a7\5 \21\2\u00a7\u00a8"+ - "\7\5\2\2\u00a8\u00a9\5\30\r\2\u00a9\u00c6\3\2\2\2\u00aa\u00ab\7\21\2\2"+ - "\u00ab\u00ac\5\30\r\2\u00ac\u00ad\7\20\2\2\u00ad\u00ae\7\4\2\2\u00ae\u00af"+ - "\5 \21\2\u00af\u00b0\7\5\2\2\u00b0\u00b1\7\n\2\2\u00b1\u00c6\3\2\2\2\u00b2"+ - "\u00b3\7\22\2\2\u00b3\u00b5\7\4\2\2\u00b4\u00b6\5\32\16\2\u00b5\u00b4"+ - "\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\u00b8\5\34\17\2"+ - "\u00b8\u00b9\7\5\2\2\u00b9\u00ba\5\30\r\2\u00ba\u00c6\3\2\2\2\u00bb\u00bd"+ - "\7\23\2\2\u00bc\u00be\5 \21\2\u00bd\u00bc\3\2\2\2\u00bd\u00be\3\2\2\2"+ - "\u00be\u00bf\3\2\2\2\u00bf\u00c6\7\n\2\2\u00c0\u00c1\7\24\2\2\u00c1\u00c2"+ - "\7\6\2\2\u00c2\u00c3\5$\23\2\u00c3\u00c4\7\7\2\2\u00c4\u00c6\3\2\2\2\u00c5"+ - "\u0092\3\2\2\2\u00c5\u0093\3\2\2\2\u00c5\u0098\3\2\2\2\u00c5\u009b\3\2"+ - "\2\2\u00c5\u00a4\3\2\2\2\u00c5\u00aa\3\2\2\2\u00c5\u00b2\3\2\2\2\u00c5"+ - "\u00bb\3\2\2\2\u00c5\u00c0\3\2\2\2\u00c6\31\3\2\2\2\u00c7\u00c9\5\24\13"+ - "\2\u00c8\u00c7\3\2\2\2\u00c9\u00cc\3\2\2\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb"+ - "\3\2\2\2\u00cb\u00ce\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cd\u00cf\5\36\20\2"+ - "\u00ce\u00cd\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf\u00d3\3\2\2\2\u00d0\u00d2"+ - "\5\24\13\2\u00d1\u00d0\3\2\2\2\u00d2\u00d5\3\2\2\2\u00d3\u00d1\3\2\2\2"+ - "\u00d3\u00d4\3\2\2\2\u00d4\u00d6\3\2\2\2\u00d5\u00d3\3\2\2\2\u00d6\u00d9"+ - "\7@\2\2\u00d7\u00d8\7\t\2\2\u00d8\u00da\5 \21\2\u00d9\u00d7\3\2\2\2\u00d9"+ - "\u00da\3\2\2\2\u00da\33\3\2\2\2\u00db\u00dc\7\n\2\2\u00dc\u00dd\5 \21"+ - "\2\u00dd\u00de\7\n\2\2\u00de\u00df\5 \21\2\u00df\u00e6\3\2\2\2\u00e0\u00e1"+ - "\7\25\2\2\u00e1\u00e2\5 \21\2\u00e2\u00e3\7\26\2\2\u00e3\u00e4\5 \21\2"+ - "\u00e4\u00e6\3\2\2\2\u00e5\u00db\3\2\2\2\u00e5\u00e0\3\2\2\2\u00e6\35"+ - "\3\2\2\2\u00e7\u00e8\b\20\1\2\u00e8\u00ec\7\63\2\2\u00e9\u00ea\7\27\2"+ - "\2\u00ea\u00ec\7\63\2\2\u00eb\u00e7\3\2\2\2\u00eb\u00e9\3\2\2\2\u00ec"+ - "\u00f7\3\2\2\2\u00ed\u00ee\f\4\2\2\u00ee\u00f6\7\30\2\2\u00ef\u00f0\f"+ - "\3\2\2\u00f0\u00f2\7\31\2\2\u00f1\u00f3\5 \21\2\u00f2\u00f1\3\2\2\2\u00f2"+ - "\u00f3\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4\u00f6\7\32\2\2\u00f5\u00ed\3"+ - "\2\2\2\u00f5\u00ef\3\2\2\2\u00f6\u00f9\3\2\2\2\u00f7\u00f5\3\2\2\2\u00f7"+ - "\u00f8\3\2\2\2\u00f8\37\3\2\2\2\u00f9\u00f7\3\2\2\2\u00fa\u00fb\b\21\1"+ - "\2\u00fb\u00fc\7\4\2\2\u00fc\u00fd\5 \21\2\u00fd\u00fe\7\5\2\2\u00fe\u0123"+ - "\3\2\2\2\u00ff\u0100\7@\2\2\u0100\u0102\7\4\2\2\u0101\u0103\5\"\22\2\u0102"+ - "\u0101\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0123\7\5"+ - "\2\2\u0105\u0106\7\4\2\2\u0106\u0107\5\36\20\2\u0107\u0108\7\5\2\2\u0108"+ - "\u0109\5 \21\30\u0109\u0123\3\2\2\2\u010a\u010b\t\2\2\2\u010b\u0123\5"+ - " \21\27\u010c\u010d\7\30\2\2\u010d\u0123\5 \21\25\u010e\u010f\t\3\2\2"+ - "\u010f\u0123\5 \21\24\u0110\u0111\t\4\2\2\u0111\u0123\5 \21\20\u0112\u0113"+ - "\7\6\2\2\u0113\u0118\5 \21\2\u0114\u0115\7\b\2\2\u0115\u0117\5 \21\2\u0116"+ - "\u0114\3\2\2\2\u0117\u011a\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2"+ - "\2\2\u0119\u011b\3\2\2\2\u011a\u0118\3\2\2\2\u011b\u011c\7\7\2\2\u011c"+ - "\u0123\3\2\2\2\u011d\u0123\7@\2\2\u011e\u0123\7\67\2\2\u011f\u0123\7\64"+ - "\2\2\u0120\u0123\7\65\2\2\u0121\u0123\7\66\2\2\u0122\u00fa\3\2\2\2\u0122"+ - "\u00ff\3\2\2\2\u0122\u0105\3\2\2\2\u0122\u010a\3\2\2\2\u0122\u010c\3\2"+ - "\2\2\u0122\u010e\3\2\2\2\u0122\u0110\3\2\2\2\u0122\u0112\3\2\2\2\u0122"+ - "\u011d\3\2\2\2\u0122\u011e\3\2\2\2\u0122\u011f\3\2\2\2\u0122\u0120\3\2"+ - "\2\2\u0122\u0121\3\2\2\2\u0123\u014b\3\2\2\2\u0124\u0125\f\23\2\2\u0125"+ - "\u0126\t\5\2\2\u0126\u014a\5 \21\24\u0127\u0128\f\22\2\2\u0128\u0129\t"+ - "\6\2\2\u0129\u014a\5 \21\23\u012a\u012b\f\21\2\2\u012b\u012c\t\7\2\2\u012c"+ - "\u014a\5 \21\22\u012d\u012e\f\17\2\2\u012e\u012f\t\b\2\2\u012f\u014a\5"+ - " \21\20\u0130\u0131\f\16\2\2\u0131\u0132\7 \2\2\u0132\u014a\5 \21\17\u0133"+ - "\u0134\f\r\2\2\u0134\u0135\7,\2\2\u0135\u014a\5 \21\16\u0136\u0137\f\f"+ - "\2\2\u0137\u0138\7-\2\2\u0138\u014a\5 \21\r\u0139\u013a\f\13\2\2\u013a"+ - "\u013b\7.\2\2\u013b\u014a\5 \21\f\u013c\u013d\f\n\2\2\u013d\u013e\7/\2"+ - "\2\u013e\u014a\5 \21\13\u013f\u0140\f\t\2\2\u0140\u0141\7\t\2\2\u0141"+ - "\u014a\5 \21\t\u0142\u0143\f\31\2\2\u0143\u0144\7\31\2\2\u0144\u0145\5"+ - " \21\2\u0145\u0146\7\32\2\2\u0146\u014a\3\2\2\2\u0147\u0148\f\26\2\2\u0148"+ - "\u014a\t\2\2\2\u0149\u0124\3\2\2\2\u0149\u0127\3\2\2\2\u0149\u012a\3\2"+ - "\2\2\u0149\u012d\3\2\2\2\u0149\u0130\3\2\2\2\u0149\u0133\3\2\2\2\u0149"+ - "\u0136\3\2\2\2\u0149\u0139\3\2\2\2\u0149\u013c\3\2\2\2\u0149\u013f\3\2"+ - "\2\2\u0149\u0142\3\2\2\2\u0149\u0147\3\2\2\2\u014a\u014d\3\2\2\2\u014b"+ - "\u0149\3\2\2\2\u014b\u014c\3\2\2\2\u014c!\3\2\2\2\u014d\u014b\3\2\2\2"+ - "\u014e\u0153\5 \21\2\u014f\u0150\7\b\2\2\u0150\u0152\5 \21\2\u0151\u014f"+ - "\3\2\2\2\u0152\u0155\3\2\2\2\u0153\u0151\3\2\2\2\u0153\u0154\3\2\2\2\u0154"+ - "#\3\2\2\2\u0155\u0153\3\2\2\2\u0156\u0158\5&\24\2\u0157\u0156\3\2\2\2"+ - "\u0158\u015b\3\2\2\2\u0159\u0157\3\2\2\2\u0159\u015a\3\2\2\2\u015a%\3"+ - "\2\2\2\u015b\u0159\3\2\2\2\u015c\u0160\5(\25\2\u015d\u0160\5*\26\2\u015e"+ - "\u0160\5,\27\2\u015f\u015c\3\2\2\2\u015f\u015d\3\2\2\2\u015f\u015e\3\2"+ - "\2\2\u0160\'\3\2\2\2\u0161\u0162\7@\2\2\u0162\u0169\7\25\2\2\u0163\u0165"+ - "\7\37\2\2\u0164\u0166\7@\2\2\u0165\u0164\3\2\2\2\u0165\u0166\3\2\2\2\u0166"+ - "\u0167\3\2\2\2\u0167\u0169\7\25\2\2\u0168\u0161\3\2\2\2\u0168\u0163\3"+ - "\2\2\2\u0169)\3\2\2\2\u016a\u016c\7\62\2\2\u016b\u016d\5.\30\2\u016c\u016b"+ - "\3\2\2\2\u016c\u016d\3\2\2\2\u016d+\3\2\2\2\u016e\u016f\7\60\2\2\u016f"+ - "\u0174\5\60\31\2\u0170\u0171\7\b\2\2\u0171\u0173\5\60\31\2\u0172\u0170"+ - "\3\2\2\2\u0173\u0176\3\2\2\2\u0174\u0172\3\2\2\2\u0174\u0175\3\2\2\2\u0175"+ - "-\3\2\2\2\u0176\u0174\3\2\2\2\u0177\u018f\5\60\31\2\u0178\u0179\7\61\2"+ - "\2\u0179\u018f\5\60\31\2\u017a\u017b\5\60\31\2\u017b\u017c\7\b\2\2\u017c"+ - "\u017d\7@\2\2\u017d\u018f\3\2\2\2\u017e\u017f\7\4\2\2\u017f\u0180\5\60"+ - "\31\2\u0180\u0181\7\5\2\2\u0181\u0182\7\b\2\2\u0182\u0183\7@\2\2\u0183"+ - "\u018f\3\2\2\2\u0184\u0185\7\4\2\2\u0185\u0186\5\60\31\2\u0186\u0187\7"+ - "\b\2\2\u0187\u0188\7@\2\2\u0188\u0189\7\5\2\2\u0189\u018f\3\2\2\2\u018a"+ - "\u018b\7\4\2\2\u018b\u018c\5\60\31\2\u018c\u018d\7\5\2\2\u018d\u018f\3"+ - "\2\2\2\u018e\u0177\3\2\2\2\u018e\u0178\3\2\2\2\u018e\u017a\3\2\2\2\u018e"+ - "\u017e\3\2\2\2\u018e\u0184\3\2\2\2\u018e\u018a\3\2\2\2\u018f/\3\2\2\2"+ - "\u0190\u0191\b\31\1\2\u0191\u0192\7\31\2\2\u0192\u0193\5\60\31\2\u0193"+ - "\u0194\7\32\2\2\u0194\u019f\3\2\2\2\u0195\u0196\t\t\2\2\u0196\u019f\5"+ - "\60\31\n\u0197\u019f\7@\2\2\u0198\u019f\7A\2\2\u0199\u019a\7\6\2\2\u019a"+ - "\u019b\7@\2\2\u019b\u019f\7\7\2\2\u019c\u019f\7\67\2\2\u019d\u019f\7\65"+ - "\2\2\u019e\u0190\3\2\2\2\u019e\u0195\3\2\2\2\u019e\u0197\3\2\2\2\u019e"+ - "\u0198\3\2\2\2\u019e\u0199\3\2\2\2\u019e\u019c\3\2\2\2\u019e\u019d\3\2"+ - "\2\2\u019f\u01ab\3\2\2\2\u01a0\u01a1\f\13\2\2\u01a1\u01a2\t\5\2\2\u01a2"+ - "\u01aa\5\60\31\f\u01a3\u01a4\f\t\2\2\u01a4\u01a5\t\n\2\2\u01a5\u01aa\5"+ - "\60\31\n\u01a6\u01a7\f\b\2\2\u01a7\u01a8\t\7\2\2\u01a8\u01aa\5\60\31\t"+ - "\u01a9\u01a0\3\2\2\2\u01a9\u01a3\3\2\2\2\u01a9\u01a6\3\2\2\2\u01aa\u01ad"+ - "\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\61\3\2\2\2\u01ad"+ - "\u01ab\3\2\2\2-\3\2\2\2<:\3\2\2\2<=\3\2\2\2"+ + "=\7\3\2\2\2><\3\2\2\2?@\7\3\2\2@A\7>\2\2A\t\3\2\2\2BD\5\f\7\2CB\3\2\2"+ + "\2DE\3\2\2\2EC\3\2\2\2EF\3\2\2\2F\13\3\2\2\2GH\5\36\20\2HI\7J\2\2IK\7"+ + "\4\2\2JL\5\16\b\2KJ\3\2\2\2KL\3\2\2\2LM\3\2\2\2MN\7\5\2\2NP\7\6\2\2OQ"+ + "\5\26\f\2PO\3\2\2\2PQ\3\2\2\2QR\3\2\2\2RS\7\7\2\2SV\3\2\2\2TV\5\22\n\2"+ + "UG\3\2\2\2UT\3\2\2\2V\r\3\2\2\2W\\\5\20\t\2XY\7\b\2\2Y[\5\20\t\2ZX\3\2"+ + "\2\2[^\3\2\2\2\\Z\3\2\2\2\\]\3\2\2\2]\17\3\2\2\2^\\\3\2\2\2_a\5\24\13"+ + "\2`_\3\2\2\2ad\3\2\2\2b`\3\2\2\2bc\3\2\2\2ce\3\2\2\2db\3\2\2\2ei\5\36"+ + "\20\2fh\5\24\13\2gf\3\2\2\2hk\3\2\2\2ig\3\2\2\2ij\3\2\2\2jl\3\2\2\2ki"+ + "\3\2\2\2lm\7J\2\2m\21\3\2\2\2np\5\24\13\2on\3\2\2\2ps\3\2\2\2qo\3\2\2"+ + "\2qr\3\2\2\2rt\3\2\2\2sq\3\2\2\2tx\5\36\20\2uw\5\24\13\2vu\3\2\2\2wz\3"+ + "\2\2\2xv\3\2\2\2xy\3\2\2\2y{\3\2\2\2zx\3\2\2\2{~\7J\2\2|}\7\t\2\2}\177"+ + "\5 \21\2~|\3\2\2\2~\177\3\2\2\2\177\u0080\3\2\2\2\u0080\u0081\7\n\2\2"+ + "\u0081\23\3\2\2\2\u0082\u008c\7\13\2\2\u0083\u0084\7\f\2\2\u0084\u0085"+ + "\7\4\2\2\u0085\u0086\7A\2\2\u0086\u008c\7\5\2\2\u0087\u0088\7\r\2\2\u0088"+ + "\u0089\7\4\2\2\u0089\u008a\7J\2\2\u008a\u008c\7\5\2\2\u008b\u0082\3\2"+ + "\2\2\u008b\u0083\3\2\2\2\u008b\u0087\3\2\2\2\u008c\25\3\2\2\2\u008d\u008f"+ + "\5\30\r\2\u008e\u008d\3\2\2\2\u008f\u0090\3\2\2\2\u0090\u008e\3\2\2\2"+ + "\u0090\u0091\3\2\2\2\u0091\27\3\2\2\2\u0092\u00c6\5\22\n\2\u0093\u0095"+ + "\7\6\2\2\u0094\u0096\5\26\f\2\u0095\u0094\3\2\2\2\u0095\u0096\3\2\2\2"+ + "\u0096\u0097\3\2\2\2\u0097\u00c6\7\7\2\2\u0098\u0099\5 \21\2\u0099\u009a"+ + "\7\n\2\2\u009a\u00c6\3\2\2\2\u009b\u009c\7\16\2\2\u009c\u009d\7\4\2\2"+ + "\u009d\u009e\5 \21\2\u009e\u009f\7\5\2\2\u009f\u00a2\5\30\r\2\u00a0\u00a1"+ + "\7\17\2\2\u00a1\u00a3\5\30\r\2\u00a2\u00a0\3\2\2\2\u00a2\u00a3\3\2\2\2"+ + "\u00a3\u00c6\3\2\2\2\u00a4\u00a5\7\20\2\2\u00a5\u00a6\7\4\2\2\u00a6\u00a7"+ + "\5 \21\2\u00a7\u00a8\7\5\2\2\u00a8\u00a9\5\30\r\2\u00a9\u00c6\3\2\2\2"+ + "\u00aa\u00ab\7\21\2\2\u00ab\u00ac\5\30\r\2\u00ac\u00ad\7\20\2\2\u00ad"+ + "\u00ae\7\4\2\2\u00ae\u00af\5 \21\2\u00af\u00b0\7\5\2\2\u00b0\u00b1\7\n"+ + "\2\2\u00b1\u00c6\3\2\2\2\u00b2\u00b3\7\22\2\2\u00b3\u00b5\7\4\2\2\u00b4"+ + "\u00b6\5\32\16\2\u00b5\u00b4\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b7\3"+ + "\2\2\2\u00b7\u00b8\5\34\17\2\u00b8\u00b9\7\5\2\2\u00b9\u00ba\5\30\r\2"+ + "\u00ba\u00c6\3\2\2\2\u00bb\u00bd\7\23\2\2\u00bc\u00be\5 \21\2\u00bd\u00bc"+ + "\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c6\7\n\2\2\u00c0"+ + "\u00c1\7\24\2\2\u00c1\u00c2\7\6\2\2\u00c2\u00c3\5$\23\2\u00c3\u00c4\7"+ + "\7\2\2\u00c4\u00c6\3\2\2\2\u00c5\u0092\3\2\2\2\u00c5\u0093\3\2\2\2\u00c5"+ + "\u0098\3\2\2\2\u00c5\u009b\3\2\2\2\u00c5\u00a4\3\2\2\2\u00c5\u00aa\3\2"+ + "\2\2\u00c5\u00b2\3\2\2\2\u00c5\u00bb\3\2\2\2\u00c5\u00c0\3\2\2\2\u00c6"+ + "\31\3\2\2\2\u00c7\u00c9\5\24\13\2\u00c8\u00c7\3\2\2\2\u00c9\u00cc\3\2"+ + "\2\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb\3\2\2\2\u00cb\u00ce\3\2\2\2\u00cc"+ + "\u00ca\3\2\2\2\u00cd\u00cf\5\36\20\2\u00ce\u00cd\3\2\2\2\u00ce\u00cf\3"+ + "\2\2\2\u00cf\u00d3\3\2\2\2\u00d0\u00d2\5\24\13\2\u00d1\u00d0\3\2\2\2\u00d2"+ + "\u00d5\3\2\2\2\u00d3\u00d1\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d6\3\2"+ + "\2\2\u00d5\u00d3\3\2\2\2\u00d6\u00d9\7J\2\2\u00d7\u00d8\7\t\2\2\u00d8"+ + "\u00da\5 \21\2\u00d9\u00d7\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\33\3\2\2"+ + "\2\u00db\u00dc\7\n\2\2\u00dc\u00dd\5 \21\2\u00dd\u00de\7\n\2\2\u00de\u00df"+ + "\5 \21\2\u00df\u00e6\3\2\2\2\u00e0\u00e1\7\25\2\2\u00e1\u00e2\5 \21\2"+ + "\u00e2\u00e3\7\26\2\2\u00e3\u00e4\5 \21\2\u00e4\u00e6\3\2\2\2\u00e5\u00db"+ + "\3\2\2\2\u00e5\u00e0\3\2\2\2\u00e6\35\3\2\2\2\u00e7\u00e8\b\20\1\2\u00e8"+ + "\u00ec\7=\2\2\u00e9\u00ea\7\27\2\2\u00ea\u00ec\7=\2\2\u00eb\u00e7\3\2"+ + "\2\2\u00eb\u00e9\3\2\2\2\u00ec\u00f7\3\2\2\2\u00ed\u00ee\f\4\2\2\u00ee"+ + "\u00f6\7\30\2\2\u00ef\u00f0\f\3\2\2\u00f0\u00f2\7\31\2\2\u00f1\u00f3\5"+ + " \21\2\u00f2\u00f1\3\2\2\2\u00f2\u00f3\3\2\2\2\u00f3\u00f4\3\2\2\2\u00f4"+ + "\u00f6\7\32\2\2\u00f5\u00ed\3\2\2\2\u00f5\u00ef\3\2\2\2\u00f6\u00f9\3"+ + "\2\2\2\u00f7\u00f5\3\2\2\2\u00f7\u00f8\3\2\2\2\u00f8\37\3\2\2\2\u00f9"+ + "\u00f7\3\2\2\2\u00fa\u00fb\b\21\1\2\u00fb\u00fc\7\4\2\2\u00fc\u00fd\5"+ + " \21\2\u00fd\u00fe\7\5\2\2\u00fe\u0123\3\2\2\2\u00ff\u0100\7J\2\2\u0100"+ + "\u0102\7\4\2\2\u0101\u0103\5\"\22\2\u0102\u0101\3\2\2\2\u0102\u0103\3"+ + "\2\2\2\u0103\u0104\3\2\2\2\u0104\u0123\7\5\2\2\u0105\u0106\7\4\2\2\u0106"+ + "\u0107\5\36\20\2\u0107\u0108\7\5\2\2\u0108\u0109\5 \21\31\u0109\u0123"+ + "\3\2\2\2\u010a\u010b\t\2\2\2\u010b\u0123\5 \21\30\u010c\u010d\7\30\2\2"+ + "\u010d\u0123\5 \21\26\u010e\u010f\t\3\2\2\u010f\u0123\5 \21\25\u0110\u0111"+ + "\t\4\2\2\u0111\u0123\5 \21\21\u0112\u0113\7\6\2\2\u0113\u0118\5 \21\2"+ + "\u0114\u0115\7\b\2\2\u0115\u0117\5 \21\2\u0116\u0114\3\2\2\2\u0117\u011a"+ + "\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\u011b\3\2\2\2\u011a"+ + "\u0118\3\2\2\2\u011b\u011c\7\7\2\2\u011c\u0123\3\2\2\2\u011d\u0123\7J"+ + "\2\2\u011e\u0123\7A\2\2\u011f\u0123\7>\2\2\u0120\u0123\7?\2\2\u0121\u0123"+ + "\7@\2\2\u0122\u00fa\3\2\2\2\u0122\u00ff\3\2\2\2\u0122\u0105\3\2\2\2\u0122"+ + "\u010a\3\2\2\2\u0122\u010c\3\2\2\2\u0122\u010e\3\2\2\2\u0122\u0110\3\2"+ + "\2\2\u0122\u0112\3\2\2\2\u0122\u011d\3\2\2\2\u0122\u011e\3\2\2\2\u0122"+ + "\u011f\3\2\2\2\u0122\u0120\3\2\2\2\u0122\u0121\3\2\2\2\u0123\u014e\3\2"+ + "\2\2\u0124\u0125\f\24\2\2\u0125\u0126\t\5\2\2\u0126\u014d\5 \21\25\u0127"+ + "\u0128\f\23\2\2\u0128\u0129\t\6\2\2\u0129\u014d\5 \21\24\u012a\u012b\f"+ + "\22\2\2\u012b\u012c\t\7\2\2\u012c\u014d\5 \21\23\u012d\u012e\f\20\2\2"+ + "\u012e\u012f\t\b\2\2\u012f\u014d\5 \21\21\u0130\u0131\f\17\2\2\u0131\u0132"+ + "\7 \2\2\u0132\u014d\5 \21\20\u0133\u0134\f\16\2\2\u0134\u0135\7,\2\2\u0135"+ + "\u014d\5 \21\17\u0136\u0137\f\r\2\2\u0137\u0138\7-\2\2\u0138\u014d\5 "+ + "\21\16\u0139\u013a\f\f\2\2\u013a\u013b\7.\2\2\u013b\u014d\5 \21\r\u013c"+ + "\u013d\f\13\2\2\u013d\u013e\7/\2\2\u013e\u014d\5 \21\f\u013f\u0140\f\n"+ + "\2\2\u0140\u0141\7\t\2\2\u0141\u014d\5 \21\n\u0142\u0143\f\t\2\2\u0143"+ + "\u0144\t\t\2\2\u0144\u014d\5 \21\t\u0145\u0146\f\32\2\2\u0146\u0147\7"+ + "\31\2\2\u0147\u0148\5 \21\2\u0148\u0149\7\32\2\2\u0149\u014d\3\2\2\2\u014a"+ + "\u014b\f\27\2\2\u014b\u014d\t\2\2\2\u014c\u0124\3\2\2\2\u014c\u0127\3"+ + "\2\2\2\u014c\u012a\3\2\2\2\u014c\u012d\3\2\2\2\u014c\u0130\3\2\2\2\u014c"+ + "\u0133\3\2\2\2\u014c\u0136\3\2\2\2\u014c\u0139\3\2\2\2\u014c\u013c\3\2"+ + "\2\2\u014c\u013f\3\2\2\2\u014c\u0142\3\2\2\2\u014c\u0145\3\2\2\2\u014c"+ + "\u014a\3\2\2\2\u014d\u0150\3\2\2\2\u014e\u014c\3\2\2\2\u014e\u014f\3\2"+ + "\2\2\u014f!\3\2\2\2\u0150\u014e\3\2\2\2\u0151\u0156\5 \21\2\u0152\u0153"+ + "\7\b\2\2\u0153\u0155\5 \21\2\u0154\u0152\3\2\2\2\u0155\u0158\3\2\2\2\u0156"+ + "\u0154\3\2\2\2\u0156\u0157\3\2\2\2\u0157#\3\2\2\2\u0158\u0156\3\2\2\2"+ + "\u0159\u015b\5&\24\2\u015a\u0159\3\2\2\2\u015b\u015e\3\2\2\2\u015c\u015a"+ + "\3\2\2\2\u015c\u015d\3\2\2\2\u015d%\3\2\2\2\u015e\u015c\3\2\2\2\u015f"+ + "\u0163\5(\25\2\u0160\u0163\5*\26\2\u0161\u0163\5,\27\2\u0162\u015f\3\2"+ + "\2\2\u0162\u0160\3\2\2\2\u0162\u0161\3\2\2\2\u0163\'\3\2\2\2\u0164\u0165"+ + "\7J\2\2\u0165\u016c\7\25\2\2\u0166\u0168\7\37\2\2\u0167\u0169\7J\2\2\u0168"+ + "\u0167\3\2\2\2\u0168\u0169\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016c\7\25"+ + "\2\2\u016b\u0164\3\2\2\2\u016b\u0166\3\2\2\2\u016c)\3\2\2\2\u016d\u016f"+ + "\7<\2\2\u016e\u0170\5.\30\2\u016f\u016e\3\2\2\2\u016f\u0170\3\2\2\2\u0170"+ + "+\3\2\2\2\u0171\u0172\7:\2\2\u0172\u0177\5\60\31\2\u0173\u0174\7\b\2\2"+ + "\u0174\u0176\5\60\31\2\u0175\u0173\3\2\2\2\u0176\u0179\3\2\2\2\u0177\u0175"+ + "\3\2\2\2\u0177\u0178\3\2\2\2\u0178-\3\2\2\2\u0179\u0177\3\2\2\2\u017a"+ + "\u0192\5\60\31\2\u017b\u017c\7;\2\2\u017c\u0192\5\60\31\2\u017d\u017e"+ + "\5\60\31\2\u017e\u017f\7\b\2\2\u017f\u0180\7J\2\2\u0180\u0192\3\2\2\2"+ + "\u0181\u0182\7\4\2\2\u0182\u0183\5\60\31\2\u0183\u0184\7\5\2\2\u0184\u0185"+ + "\7\b\2\2\u0185\u0186\7J\2\2\u0186\u0192\3\2\2\2\u0187\u0188\7\4\2\2\u0188"+ + "\u0189\5\60\31\2\u0189\u018a\7\b\2\2\u018a\u018b\7J\2\2\u018b\u018c\7"+ + "\5\2\2\u018c\u0192\3\2\2\2\u018d\u018e\7\4\2\2\u018e\u018f\5\60\31\2\u018f"+ + "\u0190\7\5\2\2\u0190\u0192\3\2\2\2\u0191\u017a\3\2\2\2\u0191\u017b\3\2"+ + "\2\2\u0191\u017d\3\2\2\2\u0191\u0181\3\2\2\2\u0191\u0187\3\2\2\2\u0191"+ + "\u018d\3\2\2\2\u0192/\3\2\2\2\u0193\u0194\b\31\1\2\u0194\u0195\7\31\2"+ + "\2\u0195\u0196\5\60\31\2\u0196\u0197\7\32\2\2\u0197\u01a2\3\2\2\2\u0198"+ + "\u0199\t\n\2\2\u0199\u01a2\5\60\31\n\u019a\u01a2\7J\2\2\u019b\u01a2\7"+ + "K\2\2\u019c\u019d\7\6\2\2\u019d\u019e\7J\2\2\u019e\u01a2\7\7\2\2\u019f"+ + "\u01a2\7A\2\2\u01a0\u01a2\7?\2\2\u01a1\u0193\3\2\2\2\u01a1\u0198\3\2\2"+ + "\2\u01a1\u019a\3\2\2\2\u01a1\u019b\3\2\2\2\u01a1\u019c\3\2\2\2\u01a1\u019f"+ + "\3\2\2\2\u01a1\u01a0\3\2\2\2\u01a2\u01ae\3\2\2\2\u01a3\u01a4\f\13\2\2"+ + "\u01a4\u01a5\t\5\2\2\u01a5\u01ad\5\60\31\f\u01a6\u01a7\f\t\2\2\u01a7\u01a8"+ + "\t\13\2\2\u01a8\u01ad\5\60\31\n\u01a9\u01aa\f\b\2\2\u01aa\u01ab\t\7\2"+ + "\2\u01ab\u01ad\5\60\31\t\u01ac\u01a3\3\2\2\2\u01ac\u01a6\3\2\2\2\u01ac"+ + "\u01a9\3\2\2\2\u01ad\u01b0\3\2\2\2\u01ae\u01ac\3\2\2\2\u01ae\u01af\3\2"+ + "\2\2\u01af\61\3\2\2\2\u01b0\u01ae\3\2\2\2- extends ParseTreeVisitor { * @return the visitor result */ T visitExprString(KickCParser.ExprStringContext ctx); + /** + * Visit a parse tree produced by the {@code exprAssignmentCompound} + * labeled alternative in {@link KickCParser#expr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExprAssignmentCompound(KickCParser.ExprAssignmentCompoundContext ctx); /** * Visit a parse tree produced by the {@code exprBool} * labeled alternative in {@link KickCParser#expr}. diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index a0f806685..7d990551d 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -535,6 +535,24 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { return lValue; } + @Override + public Object visitExprAssignmentCompound(KickCParser.ExprAssignmentCompoundContext ctx) { + // Assignment (rValue/lValue) + LValue lValue = (LValue) visit(ctx.expr(0)); + if(lValue instanceof VariableRef && ((VariableRef) lValue).isIntermediate()) { + // Encountered an intermediate variable. This must be turned into a proper LValue later. Put it into a marker to signify that + lValue = new LvalueIntermediate((VariableRef) lValue); + } + RValue rValue = (RValue) this.visit(ctx.expr(1)); + // Binary Operator + String op = ((TerminalNode) ctx.getChild(1)).getSymbol().getText(); + Operator operator = Operators.getBinaryCompound(op); + // Assignment with operator + Statement stmt = new StatementAssignment(lValue, lValue, operator, rValue); + sequence.addStatement(stmt); + return lValue; + } + @Override public RValue visitExprCast(KickCParser.ExprCastContext ctx) { RValue child = (RValue) this.visit(ctx.expr()); diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index e8313ace9..a3c6ed55c 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -44,6 +44,11 @@ public class TestPrograms { AsmFragmentTemplateUsages.logUsages(log, false, false, false, false, false, false); } + @Test + public void testCompoundAssignment() throws IOException, URISyntaxException { + compileAndCompare("compound-assignment"); + } + @Test public void testChainedAssignment() throws IOException, URISyntaxException { compileAndCompare("chained-assignment"); diff --git a/src/test/java/dk/camelot64/kickc/test/kc/compound-assignment.kc b/src/test/java/dk/camelot64/kickc/test/kc/compound-assignment.kc new file mode 100644 index 000000000..31d66ca89 --- /dev/null +++ b/src/test/java/dk/camelot64/kickc/test/kc/compound-assignment.kc @@ -0,0 +1,45 @@ +// Test compound assignment operators +byte[] ref = { 3, 4, 3, 18, 9, 1, 4, 2, 4, 5, 1 , 0}; +byte* screen1 = $400; +byte* screen2 = screen1+40; +byte* cols = $d800; +byte GREEN = 5; +byte RED = 2; + +void main() { + + byte i =0; + byte a = 3; //3 + test(i++, a); + a += 1; //4 + test(i++, a); + a -= 1; //3 + test(i++, a); + a *= 6; //18 + test(i++, a); + a /= 2; //9 + test(i++, a); + a %= 2; //1 + test(i++, a); + a <<= 2; //4 + test(i++, a); + a >>= 1; //2 + test(i++, a); + a ^= %110; //4 + test(i++, a); + a |= %1; //5 + test(i++, a); + a &= %1; //1 + test(i++, a); + +} + +void test(byte i, byte a) { + screen1[i] = a; + screen2[i] = ref[i]; + if(ref[i]==a) { + cols[i] = GREEN; + } else { + cols[i] = RED; + } +} \ No newline at end of file diff --git a/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.asm b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.asm new file mode 100644 index 000000000..ab863048e --- /dev/null +++ b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.asm @@ -0,0 +1,75 @@ +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + .label screen1 = $400 + .label cols = $d800 + .const GREEN = 5 + .const RED = 2 + .label screen2 = screen1+$28 + jsr main +main: { + ldx #0 + lda #3 + sta test.a + jsr test + ldx #0+1 + lda #3+1 + sta test.a + jsr test + ldx #0+1+1 + lda #3+1-1 + sta test.a + jsr test + ldx #0+1+1+1 + lda #(3+1-1)*6 + sta test.a + jsr test + ldx #0+1+1+1+1 + lda #(3+1-1)*6/2 + sta test.a + jsr test + ldx #0+1+1+1+1+1 + lda #mod((3+1-1)*6/2,2) + sta test.a + jsr test + ldx #0+1+1+1+1+1+1 + lda #mod((3+1-1)*6/2,2)<<2 + sta test.a + jsr test + ldx #0+1+1+1+1+1+1+1 + lda #mod((3+1-1)*6/2,2)<<2>>1 + sta test.a + jsr test + ldx #0+1+1+1+1+1+1+1+1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6 + sta test.a + jsr test + ldx #0+1+1+1+1+1+1+1+1+1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6|1 + sta test.a + jsr test + ldx #0+1+1+1+1+1+1+1+1+1+1 + lda #(mod((3+1-1)*6/2,2)<<2>>1^6|1)&1 + sta test.a + jsr test + rts +} +test: { + .label a = 2 + lda a + sta screen1,x + lda ref,x + sta screen2,x + lda ref,x + cmp a + beq b1 + lda #RED + sta cols,x + breturn: + rts + b1: + lda #GREEN + sta cols,x + jmp breturn +} + ref: .byte 3, 4, 3, $12, 9, 1, 4, 2, 4, 5, 1, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.cfg b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.cfg new file mode 100644 index 000000000..3c11796be --- /dev/null +++ b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.cfg @@ -0,0 +1,72 @@ +@begin: scope:[] from + [0] phi() [ ] ( ) + to:@2 +@2: scope:[] from @begin + [1] phi() [ ] ( ) + [2] call main param-assignment [ ] ( ) + to:@end +@end: scope:[] from @2 + [3] phi() [ ] ( ) +main: scope:[main] from @2 + [4] phi() [ ] ( main:2 [ ] ) + [5] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@1 +main::@1: scope:[main] from main + [6] phi() [ ] ( main:2 [ ] ) + [7] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@2 +main::@2: scope:[main] from main::@1 + [8] phi() [ ] ( main:2 [ ] ) + [9] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@3 +main::@3: scope:[main] from main::@2 + [10] phi() [ ] ( main:2 [ ] ) + [11] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@4 +main::@4: scope:[main] from main::@3 + [12] phi() [ ] ( main:2 [ ] ) + [13] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@5 +main::@5: scope:[main] from main::@4 + [14] phi() [ ] ( main:2 [ ] ) + [15] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@6 +main::@6: scope:[main] from main::@5 + [16] phi() [ ] ( main:2 [ ] ) + [17] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@7 +main::@7: scope:[main] from main::@6 + [18] phi() [ ] ( main:2 [ ] ) + [19] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@8 +main::@8: scope:[main] from main::@7 + [20] phi() [ ] ( main:2 [ ] ) + [21] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@9 +main::@9: scope:[main] from main::@8 + [22] phi() [ ] ( main:2 [ ] ) + [23] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@10 +main::@10: scope:[main] from main::@9 + [24] phi() [ ] ( main:2 [ ] ) + [25] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@return +main::@return: scope:[main] from main::@10 + [26] return [ ] ( main:2 [ ] ) + to:@return +test: scope:[test] from main main::@1 main::@10 main::@2 main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@9 + [27] (byte) test::i#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@10/++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@5/++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@6/++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@8/++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@9/++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [27] (byte) test::a#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 3 main::@1/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1 main::@10/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1&(byte/signed byte/word/signed word/dword/signed dword) 1 main::@2/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1 main::@3/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6 main::@4/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2 main::@5/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2 main::@6/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2 main::@7/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1 main::@8/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6 main::@9/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1 ) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [28] *((const byte*) screen1#0 + (byte) test::i#11) ← (byte) test::a#11 [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [29] *((const byte*) screen2#0 + (byte) test::i#11) ← *((const byte[]) ref#0 + (byte) test::i#11) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [30] if(*((const byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 [ test::i#11 ] ( main:2::test:5 [ test::i#11 ] main:2::test:7 [ test::i#11 ] main:2::test:9 [ test::i#11 ] main:2::test:11 [ test::i#11 ] main:2::test:13 [ test::i#11 ] main:2::test:15 [ test::i#11 ] main:2::test:17 [ test::i#11 ] main:2::test:19 [ test::i#11 ] main:2::test:21 [ test::i#11 ] main:2::test:23 [ test::i#11 ] main:2::test:25 [ test::i#11 ] ) + to:test::@3 +test::@3: scope:[test] from test + [31] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) RED#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + to:test::@return +test::@return: scope:[test] from test::@1 test::@3 + [32] return [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + to:@return +test::@1: scope:[test] from test + [33] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) GREEN#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + to:test::@return diff --git a/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.log b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.log new file mode 100644 index 000000000..b22db20a2 --- /dev/null +++ b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.log @@ -0,0 +1,1972 @@ +PARSING src/test/java/dk/camelot64/kickc/test/kc/compound-assignment.kc +// Test compound assignment operators +byte[] ref = { 3, 4, 3, 18, 9, 1, 4, 2, 4, 5, 1 , 0}; +byte* screen1 = $400; +byte* screen2 = screen1+40; +byte* cols = $d800; +byte GREEN = 5; +byte RED = 2; + +void main() { + + byte i =0; + byte a = 3; //3 + test(i++, a); + a += 1; //4 + test(i++, a); + a -= 1; //3 + test(i++, a); + a *= 6; //18 + test(i++, a); + a /= 2; //9 + test(i++, a); + a %= 2; //1 + test(i++, a); + a <<= 2; //4 + test(i++, a); + a >>= 1; //2 + test(i++, a); + a ^= %110; //4 + test(i++, a); + a |= %1; //5 + test(i++, a); + a &= %1; //1 + test(i++, a); + +} + +void test(byte i, byte a) { + screen1[i] = a; + screen2[i] = ref[i]; + if(ref[i]==a) { + cols[i] = GREEN; + } else { + cols[i] = RED; + } +} +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +Adding pre/post-modifier (byte) main::i ← ++ (byte) main::i +SYMBOLS +(byte*~) $0 +(label) @1 +(label) @2 +(label) @begin +(label) @end +(byte) GREEN +(byte) RED +(byte*) cols +(void()) main() +(void~) main::$0 +(void~) main::$1 +(void~) main::$10 +(void~) main::$2 +(void~) main::$3 +(void~) main::$4 +(void~) main::$5 +(void~) main::$6 +(void~) main::$7 +(void~) main::$8 +(void~) main::$9 +(label) main::@return +(byte) main::a +(byte) main::i +(byte[]) ref +(byte*) screen1 +(byte*) screen2 +(void()) test((byte) test::i , (byte) test::a) +(bool~) test::$0 +(label) test::@1 +(label) test::@2 +(label) test::@3 +(label) test::@4 +(label) test::@return +(byte) test::a +(byte) test::i + +Promoting word/signed word/dword/signed dword to byte* in screen1 ← ((byte*)) 1024 +Promoting word/dword/signed dword to byte* in cols ← ((byte*)) 55296 +INITIAL CONTROL FLOW GRAPH +@begin: scope:[] from + (byte[]) ref ← { (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 18, (byte/signed byte/word/signed word/dword/signed dword) 9, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 2, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 5, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 0 } + (byte*) screen1 ← ((byte*)) (word/signed word/dword/signed dword) 1024 + (byte*~) $0 ← (byte*) screen1 + (byte/signed byte/word/signed word/dword/signed dword) 40 + (byte*) screen2 ← (byte*~) $0 + (byte*) cols ← ((byte*)) (word/dword/signed dword) 55296 + (byte) GREEN ← (byte/signed byte/word/signed word/dword/signed dword) 5 + (byte) RED ← (byte/signed byte/word/signed word/dword/signed dword) 2 + to:@1 +main: scope:[main] from + (byte) main::i ← (byte/signed byte/word/signed word/dword/signed dword) 0 + (byte) main::a ← (byte/signed byte/word/signed word/dword/signed dword) 3 + (void~) main::$0 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a + (byte/signed byte/word/signed word/dword/signed dword) 1 + (void~) main::$1 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a - (byte/signed byte/word/signed word/dword/signed dword) 1 + (void~) main::$2 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a * (byte/signed byte/word/signed word/dword/signed dword) 6 + (void~) main::$3 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a / (byte/signed byte/word/signed word/dword/signed dword) 2 + (void~) main::$4 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a % (byte/signed byte/word/signed word/dword/signed dword) 2 + (void~) main::$5 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a << (byte/signed byte/word/signed word/dword/signed dword) 2 + (void~) main::$6 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a >> (byte/signed byte/word/signed word/dword/signed dword) 1 + (void~) main::$7 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a ^ (byte/signed byte/word/signed word/dword/signed dword) 6 + (void~) main::$8 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a | (byte/signed byte/word/signed word/dword/signed dword) 1 + (void~) main::$9 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + (byte) main::a ← (byte) main::a & (byte/signed byte/word/signed word/dword/signed dword) 1 + (void~) main::$10 ← call test (byte) main::i (byte) main::a + (byte) main::i ← ++ (byte) main::i + to:main::@return +main::@return: scope:[main] from main + return + to:@return +@1: scope:[] from @begin + to:@2 +test: scope:[test] from + *((byte*) screen1 + (byte) test::i) ← (byte) test::a + *((byte*) screen2 + (byte) test::i) ← *((byte[]) ref + (byte) test::i) + (bool~) test::$0 ← *((byte[]) ref + (byte) test::i) == (byte) test::a + if((bool~) test::$0) goto test::@1 + to:test::@3 +test::@1: scope:[test] from test test::@4 + *((byte*) cols + (byte) test::i) ← (byte) GREEN + to:test::@2 +test::@3: scope:[test] from test + *((byte*) cols + (byte) test::i) ← (byte) RED + to:test::@2 +test::@2: scope:[test] from test::@1 test::@3 + to:test::@return +test::@4: scope:[test] from + to:test::@1 +test::@return: scope:[test] from test::@2 + return + to:@return +@2: scope:[] from @1 + call main + to:@end +@end: scope:[] from @2 + +Eliminating unused variable - keeping the call (void~) main::$0 +Eliminating unused variable - keeping the call (void~) main::$1 +Eliminating unused variable - keeping the call (void~) main::$2 +Eliminating unused variable - keeping the call (void~) main::$3 +Eliminating unused variable - keeping the call (void~) main::$4 +Eliminating unused variable - keeping the call (void~) main::$5 +Eliminating unused variable - keeping the call (void~) main::$6 +Eliminating unused variable - keeping the call (void~) main::$7 +Eliminating unused variable - keeping the call (void~) main::$8 +Eliminating unused variable - keeping the call (void~) main::$9 +Eliminating unused variable - keeping the call (void~) main::$10 +Removing empty block @1 +Removing empty block test::@2 +Removing empty block test::@4 +PROCEDURE MODIFY VARIABLE ANALYSIS + +Completing Phi functions... +Completing Phi functions... +Completing Phi functions... +Completing Phi functions... + +CONTROL FLOW GRAPH SSA WITH ASSIGNMENT CALL & RETURN +@begin: scope:[] from + (byte[]) ref#0 ← { (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 18, (byte/signed byte/word/signed word/dword/signed dword) 9, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 2, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 5, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 0 } + (byte*) screen1#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024 + (byte*~) $0 ← (byte*) screen1#0 + (byte/signed byte/word/signed word/dword/signed dword) 40 + (byte*) screen2#0 ← (byte*~) $0 + (byte*) cols#0 ← ((byte*)) (word/dword/signed dword) 55296 + (byte) GREEN#0 ← (byte/signed byte/word/signed word/dword/signed dword) 5 + (byte) RED#0 ← (byte/signed byte/word/signed word/dword/signed dword) 2 + to:@2 +main: scope:[main] from @2 + (byte) RED#3 ← phi( @2/(byte) RED#14 ) + (byte*) cols#4 ← phi( @2/(byte*) cols#15 ) + (byte) GREEN#3 ← phi( @2/(byte) GREEN#14 ) + (byte*) screen2#2 ← phi( @2/(byte*) screen2#13 ) + (byte*) screen1#2 ← phi( @2/(byte*) screen1#13 ) + (byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0 + (byte) main::a#0 ← (byte/signed byte/word/signed word/dword/signed dword) 3 + (byte) test::i#0 ← (byte) main::i#0 + (byte) test::a#0 ← (byte) main::a#0 + call test param-assignment + to:main::@1 +main::@1: scope:[main] from main + (byte) RED#4 ← phi( main/(byte) RED#3 ) + (byte*) cols#5 ← phi( main/(byte*) cols#4 ) + (byte) GREEN#4 ← phi( main/(byte) GREEN#3 ) + (byte*) screen2#3 ← phi( main/(byte*) screen2#2 ) + (byte*) screen1#3 ← phi( main/(byte*) screen1#2 ) + (byte) main::a#11 ← phi( main/(byte) main::a#0 ) + (byte) main::i#12 ← phi( main/(byte) main::i#0 ) + (byte) main::i#1 ← ++ (byte) main::i#12 + (byte) main::a#1 ← (byte) main::a#11 + (byte/signed byte/word/signed word/dword/signed dword) 1 + (byte) test::i#1 ← (byte) main::i#1 + (byte) test::a#1 ← (byte) main::a#1 + call test param-assignment + to:main::@2 +main::@2: scope:[main] from main::@1 + (byte) RED#6 ← phi( main::@1/(byte) RED#4 ) + (byte*) cols#7 ← phi( main::@1/(byte*) cols#5 ) + (byte) GREEN#6 ← phi( main::@1/(byte) GREEN#4 ) + (byte*) screen2#5 ← phi( main::@1/(byte*) screen2#3 ) + (byte*) screen1#5 ← phi( main::@1/(byte*) screen1#3 ) + (byte) main::a#12 ← phi( main::@1/(byte) main::a#1 ) + (byte) main::i#13 ← phi( main::@1/(byte) main::i#1 ) + (byte) main::i#2 ← ++ (byte) main::i#13 + (byte) main::a#2 ← (byte) main::a#12 - (byte/signed byte/word/signed word/dword/signed dword) 1 + (byte) test::i#2 ← (byte) main::i#2 + (byte) test::a#2 ← (byte) main::a#2 + call test param-assignment + to:main::@3 +main::@3: scope:[main] from main::@2 + (byte) RED#7 ← phi( main::@2/(byte) RED#6 ) + (byte*) cols#8 ← phi( main::@2/(byte*) cols#7 ) + (byte) GREEN#7 ← phi( main::@2/(byte) GREEN#6 ) + (byte*) screen2#6 ← phi( main::@2/(byte*) screen2#5 ) + (byte*) screen1#6 ← phi( main::@2/(byte*) screen1#5 ) + (byte) main::a#13 ← phi( main::@2/(byte) main::a#2 ) + (byte) main::i#14 ← phi( main::@2/(byte) main::i#2 ) + (byte) main::i#3 ← ++ (byte) main::i#14 + (byte) main::a#3 ← (byte) main::a#13 * (byte/signed byte/word/signed word/dword/signed dword) 6 + (byte) test::i#3 ← (byte) main::i#3 + (byte) test::a#3 ← (byte) main::a#3 + call test param-assignment + to:main::@4 +main::@4: scope:[main] from main::@3 + (byte) RED#8 ← phi( main::@3/(byte) RED#7 ) + (byte*) cols#9 ← phi( main::@3/(byte*) cols#8 ) + (byte) GREEN#8 ← phi( main::@3/(byte) GREEN#7 ) + (byte*) screen2#7 ← phi( main::@3/(byte*) screen2#6 ) + (byte*) screen1#7 ← phi( main::@3/(byte*) screen1#6 ) + (byte) main::a#14 ← phi( main::@3/(byte) main::a#3 ) + (byte) main::i#15 ← phi( main::@3/(byte) main::i#3 ) + (byte) main::i#4 ← ++ (byte) main::i#15 + (byte) main::a#4 ← (byte) main::a#14 / (byte/signed byte/word/signed word/dword/signed dword) 2 + (byte) test::i#4 ← (byte) main::i#4 + (byte) test::a#4 ← (byte) main::a#4 + call test param-assignment + to:main::@5 +main::@5: scope:[main] from main::@4 + (byte) RED#9 ← phi( main::@4/(byte) RED#8 ) + (byte*) cols#10 ← phi( main::@4/(byte*) cols#9 ) + (byte) GREEN#9 ← phi( main::@4/(byte) GREEN#8 ) + (byte*) screen2#8 ← phi( main::@4/(byte*) screen2#7 ) + (byte*) screen1#8 ← phi( main::@4/(byte*) screen1#7 ) + (byte) main::a#15 ← phi( main::@4/(byte) main::a#4 ) + (byte) main::i#16 ← phi( main::@4/(byte) main::i#4 ) + (byte) main::i#5 ← ++ (byte) main::i#16 + (byte) main::a#5 ← (byte) main::a#15 % (byte/signed byte/word/signed word/dword/signed dword) 2 + (byte) test::i#5 ← (byte) main::i#5 + (byte) test::a#5 ← (byte) main::a#5 + call test param-assignment + to:main::@6 +main::@6: scope:[main] from main::@5 + (byte) RED#10 ← phi( main::@5/(byte) RED#9 ) + (byte*) cols#11 ← phi( main::@5/(byte*) cols#10 ) + (byte) GREEN#10 ← phi( main::@5/(byte) GREEN#9 ) + (byte*) screen2#9 ← phi( main::@5/(byte*) screen2#8 ) + (byte*) screen1#9 ← phi( main::@5/(byte*) screen1#8 ) + (byte) main::a#16 ← phi( main::@5/(byte) main::a#5 ) + (byte) main::i#17 ← phi( main::@5/(byte) main::i#5 ) + (byte) main::i#6 ← ++ (byte) main::i#17 + (byte) main::a#6 ← (byte) main::a#16 << (byte/signed byte/word/signed word/dword/signed dword) 2 + (byte) test::i#6 ← (byte) main::i#6 + (byte) test::a#6 ← (byte) main::a#6 + call test param-assignment + to:main::@7 +main::@7: scope:[main] from main::@6 + (byte) RED#11 ← phi( main::@6/(byte) RED#10 ) + (byte*) cols#12 ← phi( main::@6/(byte*) cols#11 ) + (byte) GREEN#11 ← phi( main::@6/(byte) GREEN#10 ) + (byte*) screen2#10 ← phi( main::@6/(byte*) screen2#9 ) + (byte*) screen1#10 ← phi( main::@6/(byte*) screen1#9 ) + (byte) main::a#17 ← phi( main::@6/(byte) main::a#6 ) + (byte) main::i#18 ← phi( main::@6/(byte) main::i#6 ) + (byte) main::i#7 ← ++ (byte) main::i#18 + (byte) main::a#7 ← (byte) main::a#17 >> (byte/signed byte/word/signed word/dword/signed dword) 1 + (byte) test::i#7 ← (byte) main::i#7 + (byte) test::a#7 ← (byte) main::a#7 + call test param-assignment + to:main::@8 +main::@8: scope:[main] from main::@7 + (byte) RED#12 ← phi( main::@7/(byte) RED#11 ) + (byte*) cols#13 ← phi( main::@7/(byte*) cols#12 ) + (byte) GREEN#12 ← phi( main::@7/(byte) GREEN#11 ) + (byte*) screen2#11 ← phi( main::@7/(byte*) screen2#10 ) + (byte*) screen1#11 ← phi( main::@7/(byte*) screen1#10 ) + (byte) main::a#18 ← phi( main::@7/(byte) main::a#7 ) + (byte) main::i#19 ← phi( main::@7/(byte) main::i#7 ) + (byte) main::i#8 ← ++ (byte) main::i#19 + (byte) main::a#8 ← (byte) main::a#18 ^ (byte/signed byte/word/signed word/dword/signed dword) 6 + (byte) test::i#8 ← (byte) main::i#8 + (byte) test::a#8 ← (byte) main::a#8 + call test param-assignment + to:main::@9 +main::@9: scope:[main] from main::@8 + (byte) RED#13 ← phi( main::@8/(byte) RED#12 ) + (byte*) cols#14 ← phi( main::@8/(byte*) cols#13 ) + (byte) GREEN#13 ← phi( main::@8/(byte) GREEN#12 ) + (byte*) screen2#12 ← phi( main::@8/(byte*) screen2#11 ) + (byte*) screen1#12 ← phi( main::@8/(byte*) screen1#11 ) + (byte) main::a#19 ← phi( main::@8/(byte) main::a#8 ) + (byte) main::i#20 ← phi( main::@8/(byte) main::i#8 ) + (byte) main::i#9 ← ++ (byte) main::i#20 + (byte) main::a#9 ← (byte) main::a#19 | (byte/signed byte/word/signed word/dword/signed dword) 1 + (byte) test::i#9 ← (byte) main::i#9 + (byte) test::a#9 ← (byte) main::a#9 + call test param-assignment + to:main::@10 +main::@10: scope:[main] from main::@9 + (byte) RED#5 ← phi( main::@9/(byte) RED#13 ) + (byte*) cols#6 ← phi( main::@9/(byte*) cols#14 ) + (byte) GREEN#5 ← phi( main::@9/(byte) GREEN#13 ) + (byte*) screen2#4 ← phi( main::@9/(byte*) screen2#12 ) + (byte*) screen1#4 ← phi( main::@9/(byte*) screen1#12 ) + (byte) main::a#20 ← phi( main::@9/(byte) main::a#9 ) + (byte) main::i#21 ← phi( main::@9/(byte) main::i#9 ) + (byte) main::i#10 ← ++ (byte) main::i#21 + (byte) main::a#10 ← (byte) main::a#20 & (byte/signed byte/word/signed word/dword/signed dword) 1 + (byte) test::i#10 ← (byte) main::i#10 + (byte) test::a#10 ← (byte) main::a#10 + call test param-assignment + to:main::@11 +main::@11: scope:[main] from main::@10 + (byte) main::i#22 ← phi( main::@10/(byte) main::i#10 ) + (byte) main::i#11 ← ++ (byte) main::i#22 + to:main::@return +main::@return: scope:[main] from main::@11 + return + to:@return +test: scope:[test] from main main::@1 main::@10 main::@2 main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@9 + (byte) RED#2 ← phi( main/(byte) RED#3 main::@1/(byte) RED#4 main::@10/(byte) RED#5 main::@2/(byte) RED#6 main::@3/(byte) RED#7 main::@4/(byte) RED#8 main::@5/(byte) RED#9 main::@6/(byte) RED#10 main::@7/(byte) RED#11 main::@8/(byte) RED#12 main::@9/(byte) RED#13 ) + (byte*) cols#3 ← phi( main/(byte*) cols#4 main::@1/(byte*) cols#5 main::@10/(byte*) cols#6 main::@2/(byte*) cols#7 main::@3/(byte*) cols#8 main::@4/(byte*) cols#9 main::@5/(byte*) cols#10 main::@6/(byte*) cols#11 main::@7/(byte*) cols#12 main::@8/(byte*) cols#13 main::@9/(byte*) cols#14 ) + (byte) GREEN#2 ← phi( main/(byte) GREEN#3 main::@1/(byte) GREEN#4 main::@10/(byte) GREEN#5 main::@2/(byte) GREEN#6 main::@3/(byte) GREEN#7 main::@4/(byte) GREEN#8 main::@5/(byte) GREEN#9 main::@6/(byte) GREEN#10 main::@7/(byte) GREEN#11 main::@8/(byte) GREEN#12 main::@9/(byte) GREEN#13 ) + (byte*) screen2#1 ← phi( main/(byte*) screen2#2 main::@1/(byte*) screen2#3 main::@10/(byte*) screen2#4 main::@2/(byte*) screen2#5 main::@3/(byte*) screen2#6 main::@4/(byte*) screen2#7 main::@5/(byte*) screen2#8 main::@6/(byte*) screen2#9 main::@7/(byte*) screen2#10 main::@8/(byte*) screen2#11 main::@9/(byte*) screen2#12 ) + (byte) test::i#11 ← phi( main/(byte) test::i#0 main::@1/(byte) test::i#1 main::@10/(byte) test::i#10 main::@2/(byte) test::i#2 main::@3/(byte) test::i#3 main::@4/(byte) test::i#4 main::@5/(byte) test::i#5 main::@6/(byte) test::i#6 main::@7/(byte) test::i#7 main::@8/(byte) test::i#8 main::@9/(byte) test::i#9 ) + (byte*) screen1#1 ← phi( main/(byte*) screen1#2 main::@1/(byte*) screen1#3 main::@10/(byte*) screen1#4 main::@2/(byte*) screen1#5 main::@3/(byte*) screen1#6 main::@4/(byte*) screen1#7 main::@5/(byte*) screen1#8 main::@6/(byte*) screen1#9 main::@7/(byte*) screen1#10 main::@8/(byte*) screen1#11 main::@9/(byte*) screen1#12 ) + (byte) test::a#11 ← phi( main/(byte) test::a#0 main::@1/(byte) test::a#1 main::@10/(byte) test::a#10 main::@2/(byte) test::a#2 main::@3/(byte) test::a#3 main::@4/(byte) test::a#4 main::@5/(byte) test::a#5 main::@6/(byte) test::a#6 main::@7/(byte) test::a#7 main::@8/(byte) test::a#8 main::@9/(byte) test::a#9 ) + *((byte*) screen1#1 + (byte) test::i#11) ← (byte) test::a#11 + *((byte*) screen2#1 + (byte) test::i#11) ← *((byte[]) ref#0 + (byte) test::i#11) + (bool~) test::$0 ← *((byte[]) ref#0 + (byte) test::i#11) == (byte) test::a#11 + if((bool~) test::$0) goto test::@1 + to:test::@3 +test::@1: scope:[test] from test + (byte) test::i#12 ← phi( test/(byte) test::i#11 ) + (byte*) cols#1 ← phi( test/(byte*) cols#3 ) + (byte) GREEN#1 ← phi( test/(byte) GREEN#2 ) + *((byte*) cols#1 + (byte) test::i#12) ← (byte) GREEN#1 + to:test::@return +test::@3: scope:[test] from test + (byte) test::i#13 ← phi( test/(byte) test::i#11 ) + (byte*) cols#2 ← phi( test/(byte*) cols#3 ) + (byte) RED#1 ← phi( test/(byte) RED#2 ) + *((byte*) cols#2 + (byte) test::i#13) ← (byte) RED#1 + to:test::@return +test::@return: scope:[test] from test::@1 test::@3 + return + to:@return +@2: scope:[] from @begin + (byte) RED#14 ← phi( @begin/(byte) RED#0 ) + (byte*) cols#15 ← phi( @begin/(byte*) cols#0 ) + (byte) GREEN#14 ← phi( @begin/(byte) GREEN#0 ) + (byte*) screen2#13 ← phi( @begin/(byte*) screen2#0 ) + (byte*) screen1#13 ← phi( @begin/(byte*) screen1#0 ) + call main param-assignment + to:@3 +@3: scope:[] from @2 + to:@end +@end: scope:[] from @3 + +SYMBOL TABLE SSA +(byte*~) $0 +(label) @2 +(label) @3 +(label) @begin +(label) @end +(byte) GREEN +(byte) GREEN#0 +(byte) GREEN#1 +(byte) GREEN#10 +(byte) GREEN#11 +(byte) GREEN#12 +(byte) GREEN#13 +(byte) GREEN#14 +(byte) GREEN#2 +(byte) GREEN#3 +(byte) GREEN#4 +(byte) GREEN#5 +(byte) GREEN#6 +(byte) GREEN#7 +(byte) GREEN#8 +(byte) GREEN#9 +(byte) RED +(byte) RED#0 +(byte) RED#1 +(byte) RED#10 +(byte) RED#11 +(byte) RED#12 +(byte) RED#13 +(byte) RED#14 +(byte) RED#2 +(byte) RED#3 +(byte) RED#4 +(byte) RED#5 +(byte) RED#6 +(byte) RED#7 +(byte) RED#8 +(byte) RED#9 +(byte*) cols +(byte*) cols#0 +(byte*) cols#1 +(byte*) cols#10 +(byte*) cols#11 +(byte*) cols#12 +(byte*) cols#13 +(byte*) cols#14 +(byte*) cols#15 +(byte*) cols#2 +(byte*) cols#3 +(byte*) cols#4 +(byte*) cols#5 +(byte*) cols#6 +(byte*) cols#7 +(byte*) cols#8 +(byte*) cols#9 +(void()) main() +(label) main::@1 +(label) main::@10 +(label) main::@11 +(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) main::a +(byte) main::a#0 +(byte) main::a#1 +(byte) main::a#10 +(byte) main::a#11 +(byte) main::a#12 +(byte) main::a#13 +(byte) main::a#14 +(byte) main::a#15 +(byte) main::a#16 +(byte) main::a#17 +(byte) main::a#18 +(byte) main::a#19 +(byte) main::a#2 +(byte) main::a#20 +(byte) main::a#3 +(byte) main::a#4 +(byte) main::a#5 +(byte) main::a#6 +(byte) main::a#7 +(byte) main::a#8 +(byte) main::a#9 +(byte) main::i +(byte) main::i#0 +(byte) main::i#1 +(byte) main::i#10 +(byte) main::i#11 +(byte) main::i#12 +(byte) main::i#13 +(byte) main::i#14 +(byte) main::i#15 +(byte) main::i#16 +(byte) main::i#17 +(byte) main::i#18 +(byte) main::i#19 +(byte) main::i#2 +(byte) main::i#20 +(byte) main::i#21 +(byte) main::i#22 +(byte) main::i#3 +(byte) main::i#4 +(byte) main::i#5 +(byte) main::i#6 +(byte) main::i#7 +(byte) main::i#8 +(byte) main::i#9 +(byte[]) ref +(byte[]) ref#0 +(byte*) screen1 +(byte*) screen1#0 +(byte*) screen1#1 +(byte*) screen1#10 +(byte*) screen1#11 +(byte*) screen1#12 +(byte*) screen1#13 +(byte*) screen1#2 +(byte*) screen1#3 +(byte*) screen1#4 +(byte*) screen1#5 +(byte*) screen1#6 +(byte*) screen1#7 +(byte*) screen1#8 +(byte*) screen1#9 +(byte*) screen2 +(byte*) screen2#0 +(byte*) screen2#1 +(byte*) screen2#10 +(byte*) screen2#11 +(byte*) screen2#12 +(byte*) screen2#13 +(byte*) screen2#2 +(byte*) screen2#3 +(byte*) screen2#4 +(byte*) screen2#5 +(byte*) screen2#6 +(byte*) screen2#7 +(byte*) screen2#8 +(byte*) screen2#9 +(void()) test((byte) test::i , (byte) test::a) +(bool~) test::$0 +(label) test::@1 +(label) test::@3 +(label) test::@return +(byte) test::a +(byte) test::a#0 +(byte) test::a#1 +(byte) test::a#10 +(byte) test::a#11 +(byte) test::a#2 +(byte) test::a#3 +(byte) test::a#4 +(byte) test::a#5 +(byte) test::a#6 +(byte) test::a#7 +(byte) test::a#8 +(byte) test::a#9 +(byte) test::i +(byte) test::i#0 +(byte) test::i#1 +(byte) test::i#10 +(byte) test::i#11 +(byte) test::i#12 +(byte) test::i#13 +(byte) test::i#2 +(byte) test::i#3 +(byte) test::i#4 +(byte) test::i#5 +(byte) test::i#6 +(byte) test::i#7 +(byte) test::i#8 +(byte) test::i#9 + +OPTIMIZING CONTROL FLOW GRAPH +Culled Empty Block (label) @3 +Succesful SSA optimization Pass2CullEmptyBlocks +Not aliassing across scopes: screen1#2 screen1#13 +Not aliassing across scopes: screen2#2 screen2#13 +Not aliassing across scopes: GREEN#3 GREEN#14 +Not aliassing across scopes: cols#4 cols#15 +Not aliassing across scopes: RED#3 RED#14 +Not aliassing across scopes: test::i#0 main::i#0 +Not aliassing across scopes: test::a#0 main::a#0 +Not aliassing across scopes: test::i#1 main::i#1 +Not aliassing across scopes: test::a#1 main::a#1 +Not aliassing across scopes: test::i#2 main::i#2 +Not aliassing across scopes: test::a#2 main::a#2 +Not aliassing across scopes: test::i#3 main::i#3 +Not aliassing across scopes: test::a#3 main::a#3 +Not aliassing across scopes: test::i#4 main::i#4 +Not aliassing across scopes: test::a#4 main::a#4 +Not aliassing across scopes: test::i#5 main::i#5 +Not aliassing across scopes: test::a#5 main::a#5 +Not aliassing across scopes: test::i#6 main::i#6 +Not aliassing across scopes: test::a#6 main::a#6 +Not aliassing across scopes: test::i#7 main::i#7 +Not aliassing across scopes: test::a#7 main::a#7 +Not aliassing across scopes: test::i#8 main::i#8 +Not aliassing across scopes: test::a#8 main::a#8 +Not aliassing across scopes: test::i#9 main::i#9 +Not aliassing across scopes: test::a#9 main::a#9 +Not aliassing across scopes: test::i#10 main::i#10 +Not aliassing across scopes: test::a#10 main::a#10 +Not aliassing across scopes: test::a#11 test::a#0 +Not aliassing across scopes: screen1#1 screen1#2 +Not aliassing across scopes: test::i#11 test::i#0 +Not aliassing across scopes: screen2#1 screen2#2 +Not aliassing across scopes: GREEN#2 GREEN#3 +Not aliassing across scopes: cols#3 cols#4 +Not aliassing across scopes: RED#2 RED#3 +Alias (byte*) screen2#0 = (byte*~) $0 (byte*) screen2#13 +Alias (byte) main::i#0 = (byte) main::i#12 +Alias (byte) main::a#0 = (byte) main::a#11 +Alias (byte*) screen1#10 = (byte*) screen1#3 (byte*) screen1#2 (byte*) screen1#5 (byte*) screen1#6 (byte*) screen1#7 (byte*) screen1#8 (byte*) screen1#9 (byte*) screen1#11 (byte*) screen1#12 (byte*) screen1#4 +Alias (byte*) screen2#10 = (byte*) screen2#3 (byte*) screen2#2 (byte*) screen2#5 (byte*) screen2#6 (byte*) screen2#7 (byte*) screen2#8 (byte*) screen2#9 (byte*) screen2#11 (byte*) screen2#12 (byte*) screen2#4 +Alias (byte) GREEN#10 = (byte) GREEN#4 (byte) GREEN#3 (byte) GREEN#6 (byte) GREEN#7 (byte) GREEN#8 (byte) GREEN#9 (byte) GREEN#11 (byte) GREEN#12 (byte) GREEN#13 (byte) GREEN#5 +Alias (byte*) cols#10 = (byte*) cols#5 (byte*) cols#4 (byte*) cols#7 (byte*) cols#8 (byte*) cols#9 (byte*) cols#11 (byte*) cols#12 (byte*) cols#13 (byte*) cols#14 (byte*) cols#6 +Alias (byte) RED#10 = (byte) RED#4 (byte) RED#3 (byte) RED#6 (byte) RED#7 (byte) RED#8 (byte) RED#9 (byte) RED#11 (byte) RED#12 (byte) RED#13 (byte) RED#5 +Alias (byte) main::i#1 = (byte) main::i#13 +Alias (byte) main::a#1 = (byte) main::a#12 +Alias (byte) main::i#14 = (byte) main::i#2 +Alias (byte) main::a#13 = (byte) main::a#2 +Alias (byte) main::i#15 = (byte) main::i#3 +Alias (byte) main::a#14 = (byte) main::a#3 +Alias (byte) main::i#16 = (byte) main::i#4 +Alias (byte) main::a#15 = (byte) main::a#4 +Alias (byte) main::i#17 = (byte) main::i#5 +Alias (byte) main::a#16 = (byte) main::a#5 +Alias (byte) main::i#18 = (byte) main::i#6 +Alias (byte) main::a#17 = (byte) main::a#6 +Alias (byte) main::i#19 = (byte) main::i#7 +Alias (byte) main::a#18 = (byte) main::a#7 +Alias (byte) main::i#20 = (byte) main::i#8 +Alias (byte) main::a#19 = (byte) main::a#8 +Alias (byte) main::i#21 = (byte) main::i#9 +Alias (byte) main::a#20 = (byte) main::a#9 +Alias (byte) main::i#10 = (byte) main::i#22 +Alias (byte) GREEN#1 = (byte) GREEN#2 +Alias (byte*) cols#1 = (byte*) cols#3 (byte*) cols#2 +Alias (byte) test::i#11 = (byte) test::i#12 (byte) test::i#13 +Alias (byte) RED#1 = (byte) RED#2 +Alias (byte*) screen1#0 = (byte*) screen1#13 +Alias (byte) GREEN#0 = (byte) GREEN#14 +Alias (byte*) cols#0 = (byte*) cols#15 +Alias (byte) RED#0 = (byte) RED#14 +Succesful SSA optimization Pass2AliasElimination +Not aliassing across scopes: screen1#10 screen1#0 +Not aliassing across scopes: screen2#10 screen2#0 +Not aliassing across scopes: GREEN#10 GREEN#0 +Not aliassing across scopes: cols#10 cols#0 +Not aliassing across scopes: RED#10 RED#0 +Not aliassing across scopes: test::i#0 main::i#0 +Not aliassing across scopes: test::a#0 main::a#0 +Not aliassing across scopes: test::i#1 main::i#1 +Not aliassing across scopes: test::a#1 main::a#1 +Not aliassing across scopes: test::i#2 main::i#14 +Not aliassing across scopes: test::a#2 main::a#13 +Not aliassing across scopes: test::i#3 main::i#15 +Not aliassing across scopes: test::a#3 main::a#14 +Not aliassing across scopes: test::i#4 main::i#16 +Not aliassing across scopes: test::a#4 main::a#15 +Not aliassing across scopes: test::i#5 main::i#17 +Not aliassing across scopes: test::a#5 main::a#16 +Not aliassing across scopes: test::i#6 main::i#18 +Not aliassing across scopes: test::a#6 main::a#17 +Not aliassing across scopes: test::i#7 main::i#19 +Not aliassing across scopes: test::a#7 main::a#18 +Not aliassing across scopes: test::i#8 main::i#20 +Not aliassing across scopes: test::a#8 main::a#19 +Not aliassing across scopes: test::i#9 main::i#21 +Not aliassing across scopes: test::a#9 main::a#20 +Not aliassing across scopes: test::i#10 main::i#10 +Not aliassing across scopes: test::a#10 main::a#10 +Not aliassing across scopes: test::a#11 test::a#0 +Not aliassing across scopes: screen1#1 screen1#10 +Not aliassing across scopes: test::i#11 test::i#0 +Not aliassing across scopes: screen2#1 screen2#10 +Not aliassing across scopes: GREEN#1 GREEN#10 +Not aliassing across scopes: cols#1 cols#10 +Not aliassing across scopes: RED#1 RED#10 +Redundant Phi (byte*) screen1#10 (byte*) screen1#0 +Redundant Phi (byte*) screen2#10 (byte*) screen2#0 +Redundant Phi (byte) GREEN#10 (byte) GREEN#0 +Redundant Phi (byte*) cols#10 (byte*) cols#0 +Redundant Phi (byte) RED#10 (byte) RED#0 +Redundant Phi (byte*) screen1#1 (byte*) screen1#10 +Redundant Phi (byte*) screen2#1 (byte*) screen2#10 +Redundant Phi (byte) GREEN#1 (byte) GREEN#10 +Redundant Phi (byte*) cols#1 (byte*) cols#10 +Redundant Phi (byte) RED#1 (byte) RED#10 +Succesful SSA optimization Pass2RedundantPhiElimination +Simple Condition (bool~) test::$0 if(*((byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 +Succesful SSA optimization Pass2ConditionalJumpSimplification +Constant (const byte[]) ref#0 = { 3, 4, 3, 18, 9, 1, 4, 2, 4, 5, 1, 0 } +Constant (const byte*) screen1#0 = ((byte*))1024 +Constant (const byte*) cols#0 = ((byte*))55296 +Constant (const byte) GREEN#0 = 5 +Constant (const byte) RED#0 = 2 +Constant (const byte) main::i#0 = 0 +Constant (const byte) main::a#0 = 3 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte*) screen2#0 = screen1#0+40 +Constant (const byte) test::i#0 = main::i#0 +Constant (const byte) test::a#0 = main::a#0 +Constant (const byte) main::i#1 = ++main::i#0 +Constant (const byte) main::a#1 = main::a#0+1 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#1 = main::i#1 +Constant (const byte) test::a#1 = main::a#1 +Constant (const byte) main::i#14 = ++main::i#1 +Constant (const byte) main::a#13 = main::a#1-1 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#2 = main::i#14 +Constant (const byte) test::a#2 = main::a#13 +Constant (const byte) main::i#15 = ++main::i#14 +Constant (const byte) main::a#14 = main::a#13*6 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#3 = main::i#15 +Constant (const byte) test::a#3 = main::a#14 +Constant (const byte) main::i#16 = ++main::i#15 +Constant (const byte) main::a#15 = main::a#14/2 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#4 = main::i#16 +Constant (const byte) test::a#4 = main::a#15 +Constant (const byte) main::i#17 = ++main::i#16 +Constant (const byte) main::a#16 = main::a#15%2 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#5 = main::i#17 +Constant (const byte) test::a#5 = main::a#16 +Constant (const byte) main::i#18 = ++main::i#17 +Constant (const byte) main::a#17 = main::a#16<<2 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#6 = main::i#18 +Constant (const byte) test::a#6 = main::a#17 +Constant (const byte) main::i#19 = ++main::i#18 +Constant (const byte) main::a#18 = main::a#17>>1 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#7 = main::i#19 +Constant (const byte) test::a#7 = main::a#18 +Constant (const byte) main::i#20 = ++main::i#19 +Constant (const byte) main::a#19 = main::a#18^6 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#8 = main::i#20 +Constant (const byte) test::a#8 = main::a#19 +Constant (const byte) main::i#21 = ++main::i#20 +Constant (const byte) main::a#20 = main::a#19|1 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#9 = main::i#21 +Constant (const byte) test::a#9 = main::a#20 +Constant (const byte) main::i#10 = ++main::i#21 +Constant (const byte) main::a#10 = main::a#20&1 +Succesful SSA optimization Pass2ConstantIdentification +Constant (const byte) test::i#10 = main::i#10 +Constant (const byte) test::a#10 = main::a#10 +Constant (const byte) main::i#11 = ++main::i#10 +Succesful SSA optimization Pass2ConstantIdentification +Eliminating unused constant (const byte) main::i#11 +Succesful SSA optimization PassNEliminateUnusedVars +Culled Empty Block (label) main::@11 +Succesful SSA optimization Pass2CullEmptyBlocks +OPTIMIZING CONTROL FLOW GRAPH +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::i#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::a#0 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::i#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::a#1 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::i#14 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::a#13 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::i#15 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::a#14 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::i#16 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::a#15 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::i#17 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::a#16 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::i#18 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::a#17 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::i#19 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::a#18 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::i#20 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::a#19 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::i#21 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::a#20 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::i#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with different constant siblings (const byte) main::a#10 +Inlining constant with var siblings (const byte) test::i#0 +Inlining constant with var siblings (const byte) test::a#0 +Inlining constant with var siblings (const byte) test::i#1 +Inlining constant with var siblings (const byte) test::a#1 +Inlining constant with var siblings (const byte) test::i#2 +Inlining constant with var siblings (const byte) test::a#2 +Inlining constant with var siblings (const byte) test::i#3 +Inlining constant with var siblings (const byte) test::a#3 +Inlining constant with var siblings (const byte) test::i#4 +Inlining constant with var siblings (const byte) test::a#4 +Inlining constant with var siblings (const byte) test::i#5 +Inlining constant with var siblings (const byte) test::a#5 +Inlining constant with var siblings (const byte) test::i#6 +Inlining constant with var siblings (const byte) test::a#6 +Inlining constant with var siblings (const byte) test::i#7 +Inlining constant with var siblings (const byte) test::a#7 +Inlining constant with var siblings (const byte) test::i#8 +Inlining constant with var siblings (const byte) test::a#8 +Inlining constant with var siblings (const byte) test::i#9 +Inlining constant with var siblings (const byte) test::a#9 +Inlining constant with var siblings (const byte) test::i#10 +Inlining constant with var siblings (const byte) test::a#10 +Constant inlined test::i#1 = ++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::a#8 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6 +Constant inlined test::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::a#9 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined test::i#3 = ++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::i#2 = ++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::a#4 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2 +Constant inlined main::i#21 = ++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::a#5 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2 +Constant inlined test::a#6 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2 +Constant inlined test::a#7 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined main::i#20 = ++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::i#9 = ++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::i#8 = ++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::a#20 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined test::a#10 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1&(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined test::i#5 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::i#4 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::i#7 = ++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::i#6 = ++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::i#10 = ++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::a#0 = (byte/signed byte/word/signed word/dword/signed dword) 3 +Constant inlined main::a#19 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6 +Constant inlined main::a#18 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined main::a#17 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2 +Constant inlined main::a#1 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined main::a#16 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2 +Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::i#1 = ++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::i#14 = ++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::i#15 = ++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::i#10 = ++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::a#10 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1&(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined main::a#15 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2 +Constant inlined main::i#18 = ++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::a#14 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6 +Constant inlined main::i#19 = ++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::a#13 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined main::i#16 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined main::i#17 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 +Constant inlined test::a#0 = (byte/signed byte/word/signed word/dword/signed dword) 3 +Constant inlined test::a#1 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined test::a#2 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1 +Constant inlined test::a#3 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6 +Succesful SSA optimization Pass2ConstantInlining +Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@9 main::@10 main::@return test test::@3 test::@return test::@1 +Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@9 main::@10 main::@return test test::@3 test::@return test::@1 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @2 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@1 +Adding NOP phi() at start of main::@2 +Adding NOP phi() at start of main::@3 +Adding NOP phi() at start of main::@4 +Adding NOP phi() at start of main::@5 +Adding NOP phi() at start of main::@6 +Adding NOP phi() at start of main::@7 +Adding NOP phi() at start of main::@8 +Adding NOP phi() at start of main::@9 +Adding NOP phi() at start of main::@10 +CALL GRAPH +Calls in [] to main:2 +Calls in [main] to test:5 test:7 test:9 test:11 test:13 test:15 test:17 test:19 test:21 test:23 test:25 + +Propagating live ranges... +Propagating live ranges... +Propagating live ranges... +Created 2 initial phi equivalence classes +Coalesced down to 2 phi equivalence classes +Block Sequence Planned @begin @2 @end main main::@1 main::@2 main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@9 main::@10 main::@return test test::@3 test::@return test::@1 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @2 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main +Adding NOP phi() at start of main::@1 +Adding NOP phi() at start of main::@2 +Adding NOP phi() at start of main::@3 +Adding NOP phi() at start of main::@4 +Adding NOP phi() at start of main::@5 +Adding NOP phi() at start of main::@6 +Adding NOP phi() at start of main::@7 +Adding NOP phi() at start of main::@8 +Adding NOP phi() at start of main::@9 +Adding NOP phi() at start of main::@10 +Propagating live ranges... +Propagating live ranges... +Propagating live ranges... + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() [ ] ( ) + to:@2 +@2: scope:[] from @begin + [1] phi() [ ] ( ) + [2] call main param-assignment [ ] ( ) + to:@end +@end: scope:[] from @2 + [3] phi() [ ] ( ) +main: scope:[main] from @2 + [4] phi() [ ] ( main:2 [ ] ) + [5] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@1 +main::@1: scope:[main] from main + [6] phi() [ ] ( main:2 [ ] ) + [7] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@2 +main::@2: scope:[main] from main::@1 + [8] phi() [ ] ( main:2 [ ] ) + [9] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@3 +main::@3: scope:[main] from main::@2 + [10] phi() [ ] ( main:2 [ ] ) + [11] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@4 +main::@4: scope:[main] from main::@3 + [12] phi() [ ] ( main:2 [ ] ) + [13] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@5 +main::@5: scope:[main] from main::@4 + [14] phi() [ ] ( main:2 [ ] ) + [15] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@6 +main::@6: scope:[main] from main::@5 + [16] phi() [ ] ( main:2 [ ] ) + [17] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@7 +main::@7: scope:[main] from main::@6 + [18] phi() [ ] ( main:2 [ ] ) + [19] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@8 +main::@8: scope:[main] from main::@7 + [20] phi() [ ] ( main:2 [ ] ) + [21] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@9 +main::@9: scope:[main] from main::@8 + [22] phi() [ ] ( main:2 [ ] ) + [23] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@10 +main::@10: scope:[main] from main::@9 + [24] phi() [ ] ( main:2 [ ] ) + [25] call test param-assignment [ ] ( main:2 [ ] ) + to:main::@return +main::@return: scope:[main] from main::@10 + [26] return [ ] ( main:2 [ ] ) + to:@return +test: scope:[test] from main main::@1 main::@10 main::@2 main::@3 main::@4 main::@5 main::@6 main::@7 main::@8 main::@9 + [27] (byte) test::i#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@1/++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@10/++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@2/++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@3/++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@4/++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@5/++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@6/++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@7/++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@8/++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 main::@9/++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 ) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [27] (byte) test::a#11 ← phi( main/(byte/signed byte/word/signed word/dword/signed dword) 3 main::@1/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1 main::@10/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1&(byte/signed byte/word/signed word/dword/signed dword) 1 main::@2/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1 main::@3/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6 main::@4/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2 main::@5/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2 main::@6/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2 main::@7/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1 main::@8/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6 main::@9/(byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1 ) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [28] *((const byte*) screen1#0 + (byte) test::i#11) ← (byte) test::a#11 [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [29] *((const byte*) screen2#0 + (byte) test::i#11) ← *((const byte[]) ref#0 + (byte) test::i#11) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) + [30] if(*((const byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 [ test::i#11 ] ( main:2::test:5 [ test::i#11 ] main:2::test:7 [ test::i#11 ] main:2::test:9 [ test::i#11 ] main:2::test:11 [ test::i#11 ] main:2::test:13 [ test::i#11 ] main:2::test:15 [ test::i#11 ] main:2::test:17 [ test::i#11 ] main:2::test:19 [ test::i#11 ] main:2::test:21 [ test::i#11 ] main:2::test:23 [ test::i#11 ] main:2::test:25 [ test::i#11 ] ) + to:test::@3 +test::@3: scope:[test] from test + [31] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) RED#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + to:test::@return +test::@return: scope:[test] from test::@1 test::@3 + [32] return [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + to:@return +test::@1: scope:[test] from test + [33] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) GREEN#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + to:test::@return + +DOMINATORS +@begin dominated by @begin +@2 dominated by @begin @2 +@end dominated by @begin @end @2 +main dominated by @begin main @2 +main::@1 dominated by @begin main @2 main::@1 +main::@2 dominated by @begin main @2 main::@1 main::@2 +main::@3 dominated by @begin main @2 main::@1 main::@2 main::@3 +main::@4 dominated by @begin main @2 main::@1 main::@2 main::@3 main::@4 +main::@5 dominated by @begin main @2 main::@1 main::@2 main::@5 main::@3 main::@4 +main::@6 dominated by @begin main @2 main::@1 main::@2 main::@5 main::@6 main::@3 main::@4 +main::@7 dominated by main::@7 @begin main @2 main::@1 main::@2 main::@5 main::@6 main::@3 main::@4 +main::@8 dominated by main::@7 @begin main::@8 main @2 main::@1 main::@2 main::@5 main::@6 main::@3 main::@4 +main::@9 dominated by main::@9 main::@7 @begin main::@8 main @2 main::@1 main::@2 main::@5 main::@6 main::@3 main::@4 +main::@10 dominated by main::@9 main::@7 @begin main::@8 main::@10 main @2 main::@1 main::@2 main::@5 main::@6 main::@3 main::@4 +main::@return dominated by main::@9 main::@return main::@7 @begin main::@8 main::@10 main @2 main::@1 main::@2 main::@5 main::@6 main::@3 main::@4 +test dominated by @begin test main @2 +test::@3 dominated by @begin test main @2 test::@3 +test::@return dominated by @begin test test::@return main @2 +test::@1 dominated by @begin test main @2 test::@1 + +NATURAL LOOPS + +NATURAL LOOPS WITH DEPTH +Found 0 loops in scope [] +Found 0 loops in scope [main] +Found 0 loops in scope [test] + + +VARIABLE REGISTER WEIGHTS +(byte) GREEN +(byte) RED +(byte*) cols +(void()) main() +(byte) main::a +(byte) main::i +(byte[]) ref +(byte*) screen1 +(byte*) screen2 +(void()) test((byte) test::i , (byte) test::a) +(byte) test::a +(byte) test::a#11 1.3333333333333333 +(byte) test::i +(byte) test::i#11 3.0 + +Initial phi equivalence classes +[ test::a#11 ] +[ test::i#11 ] +Complete equivalence classes +[ test::a#11 ] +[ test::i#11 ] +Allocated zp ZP_BYTE:2 [ test::a#11 ] +Allocated zp ZP_BYTE:3 [ test::i#11 ] + +INITIAL ASM +//SEG0 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG1 Global Constants & labels + .label screen1 = $400 + .label cols = $d800 + .const GREEN = 5 + .const RED = 2 + .label screen2 = screen1+$28 +//SEG2 @begin +bbegin: +//SEG3 [1] phi from @begin to @2 [phi:@begin->@2] +b2_from_bbegin: + jmp b2 +//SEG4 @2 +b2: +//SEG5 [2] call main param-assignment [ ] ( ) +//SEG6 [4] phi from @2 to main [phi:@2->main] +main_from_b2: + jsr main +//SEG7 [3] phi from @2 to @end [phi:@2->@end] +bend_from_b2: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + //SEG10 [5] call test param-assignment [ ] ( main:2 [ ] ) + //SEG11 [27] phi from main to test [phi:main->test] + test_from_main: + //SEG12 [27] phi (byte) test::i#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->test#0] -- vbuz1=vbuc1 + lda #0 + sta test.i + //SEG13 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3 [phi:main->test#1] -- vbuz1=vbuc1 + lda #3 + sta test.a + jsr test + //SEG14 [6] phi from main to main::@1 [phi:main->main::@1] + b1_from_main: + jmp b1 + //SEG15 main::@1 + b1: + //SEG16 [7] call test param-assignment [ ] ( main:2 [ ] ) + //SEG17 [27] phi from main::@1 to test [phi:main::@1->test] + test_from_b1: + //SEG18 [27] phi (byte) test::i#11 = ++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->test#0] -- vbuz1=vbuc1 + lda #0+1 + sta test.i + //SEG19 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@1->test#1] -- vbuz1=vbuc1 + lda #3+1 + sta test.a + jsr test + //SEG20 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + b2_from_b1: + jmp b2 + //SEG21 main::@2 + b2: + //SEG22 [9] call test param-assignment [ ] ( main:2 [ ] ) + //SEG23 [27] phi from main::@2 to test [phi:main::@2->test] + test_from_b2: + //SEG24 [27] phi (byte) test::i#11 = ++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@2->test#0] -- vbuz1=vbuc1 + lda #0+1+1 + sta test.i + //SEG25 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@2->test#1] -- vbuz1=vbuc1 + lda #3+1-1 + sta test.a + jsr test + //SEG26 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + b3_from_b2: + jmp b3 + //SEG27 main::@3 + b3: + //SEG28 [11] call test param-assignment [ ] ( main:2 [ ] ) + //SEG29 [27] phi from main::@3 to test [phi:main::@3->test] + test_from_b3: + //SEG30 [27] phi (byte) test::i#11 = ++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@3->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1 + sta test.i + //SEG31 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6 [phi:main::@3->test#1] -- vbuz1=vbuc1 + lda #(3+1-1)*6 + sta test.a + jsr test + //SEG32 [12] phi from main::@3 to main::@4 [phi:main::@3->main::@4] + b4_from_b3: + jmp b4 + //SEG33 main::@4 + b4: + //SEG34 [13] call test param-assignment [ ] ( main:2 [ ] ) + //SEG35 [27] phi from main::@4 to test [phi:main::@4->test] + test_from_b4: + //SEG36 [27] phi (byte) test::i#11 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@4->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1+1 + sta test.i + //SEG37 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@4->test#1] -- vbuz1=vbuc1 + lda #(3+1-1)*6/2 + sta test.a + jsr test + //SEG38 [14] phi from main::@4 to main::@5 [phi:main::@4->main::@5] + b5_from_b4: + jmp b5 + //SEG39 main::@5 + b5: + //SEG40 [15] call test param-assignment [ ] ( main:2 [ ] ) + //SEG41 [27] phi from main::@5 to test [phi:main::@5->test] + test_from_b5: + //SEG42 [27] phi (byte) test::i#11 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@5->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1+1+1 + sta test.i + //SEG43 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@5->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2) + sta test.a + jsr test + //SEG44 [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + b6_from_b5: + jmp b6 + //SEG45 main::@6 + b6: + //SEG46 [17] call test param-assignment [ ] ( main:2 [ ] ) + //SEG47 [27] phi from main::@6 to test [phi:main::@6->test] + test_from_b6: + //SEG48 [27] phi (byte) test::i#11 = ++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@6->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1+1+1+1 + sta test.i + //SEG49 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@6->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2 + sta test.a + jsr test + //SEG50 [18] phi from main::@6 to main::@7 [phi:main::@6->main::@7] + b7_from_b6: + jmp b7 + //SEG51 main::@7 + b7: + //SEG52 [19] call test param-assignment [ ] ( main:2 [ ] ) + //SEG53 [27] phi from main::@7 to test [phi:main::@7->test] + test_from_b7: + //SEG54 [27] phi (byte) test::i#11 = ++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@7->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1+1+1+1+1 + sta test.i + //SEG55 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@7->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1 + sta test.a + jsr test + //SEG56 [20] phi from main::@7 to main::@8 [phi:main::@7->main::@8] + b8_from_b7: + jmp b8 + //SEG57 main::@8 + b8: + //SEG58 [21] call test param-assignment [ ] ( main:2 [ ] ) + //SEG59 [27] phi from main::@8 to test [phi:main::@8->test] + test_from_b8: + //SEG60 [27] phi (byte) test::i#11 = ++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@8->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1+1+1+1+1+1 + sta test.i + //SEG61 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6 [phi:main::@8->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6 + sta test.a + jsr test + //SEG62 [22] phi from main::@8 to main::@9 [phi:main::@8->main::@9] + b9_from_b8: + jmp b9 + //SEG63 main::@9 + b9: + //SEG64 [23] call test param-assignment [ ] ( main:2 [ ] ) + //SEG65 [27] phi from main::@9 to test [phi:main::@9->test] + test_from_b9: + //SEG66 [27] phi (byte) test::i#11 = ++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@9->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1+1+1+1+1+1+1 + sta test.i + //SEG67 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@9->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6|1 + sta test.a + jsr test + //SEG68 [24] phi from main::@9 to main::@10 [phi:main::@9->main::@10] + b10_from_b9: + jmp b10 + //SEG69 main::@10 + b10: + //SEG70 [25] call test param-assignment [ ] ( main:2 [ ] ) + //SEG71 [27] phi from main::@10 to test [phi:main::@10->test] + test_from_b10: + //SEG72 [27] phi (byte) test::i#11 = ++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@10->test#0] -- vbuz1=vbuc1 + lda #0+1+1+1+1+1+1+1+1+1+1 + sta test.i + //SEG73 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1&(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@10->test#1] -- vbuz1=vbuc1 + lda #(mod((3+1-1)*6/2,2)<<2>>1^6|1)&1 + sta test.a + jsr test + jmp breturn + //SEG74 main::@return + breturn: + //SEG75 [26] return [ ] ( main:2 [ ] ) + rts +} +//SEG76 test +test: { + .label a = 2 + .label i = 3 + //SEG77 [28] *((const byte*) screen1#0 + (byte) test::i#11) ← (byte) test::a#11 [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) -- pbuc1_derefidx_vbuz1=vbuz2 + lda a + ldy i + sta screen1,y + //SEG78 [29] *((const byte*) screen2#0 + (byte) test::i#11) ← *((const byte[]) ref#0 + (byte) test::i#11) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz1 + ldy i + lda ref,y + sta screen2,y + //SEG79 [30] if(*((const byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 [ test::i#11 ] ( main:2::test:5 [ test::i#11 ] main:2::test:7 [ test::i#11 ] main:2::test:9 [ test::i#11 ] main:2::test:11 [ test::i#11 ] main:2::test:13 [ test::i#11 ] main:2::test:15 [ test::i#11 ] main:2::test:17 [ test::i#11 ] main:2::test:19 [ test::i#11 ] main:2::test:21 [ test::i#11 ] main:2::test:23 [ test::i#11 ] main:2::test:25 [ test::i#11 ] ) -- pbuc1_derefidx_vbuz1_eq_vbuz2_then_la1 + ldy i + lda ref,y + cmp a + beq b1 + jmp b3 + //SEG80 test::@3 + b3: + //SEG81 [31] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) RED#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) -- pbuc1_derefidx_vbuz1=vbuc2 + ldy i + lda #RED + sta cols,y + jmp breturn + //SEG82 test::@return + breturn: + //SEG83 [32] return [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + rts + //SEG84 test::@1 + b1: + //SEG85 [33] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) GREEN#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) -- pbuc1_derefidx_vbuz1=vbuc2 + ldy i + lda #GREEN + sta cols,y + jmp breturn +} + ref: .byte 3, 4, 3, $12, 9, 1, 4, 2, 4, 5, 1, 0 + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [29] *((const byte*) screen2#0 + (byte) test::i#11) ← *((const byte[]) ref#0 + (byte) test::i#11) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ test::a#11 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:3 [ test::i#11 ] +Statement [30] if(*((const byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 [ test::i#11 ] ( main:2::test:5 [ test::i#11 ] main:2::test:7 [ test::i#11 ] main:2::test:9 [ test::i#11 ] main:2::test:11 [ test::i#11 ] main:2::test:13 [ test::i#11 ] main:2::test:15 [ test::i#11 ] main:2::test:17 [ test::i#11 ] main:2::test:19 [ test::i#11 ] main:2::test:21 [ test::i#11 ] main:2::test:23 [ test::i#11 ] main:2::test:25 [ test::i#11 ] ) always clobbers reg byte a +Statement [31] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) RED#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) always clobbers reg byte a +Statement [33] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) GREEN#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) always clobbers reg byte a +Statement [28] *((const byte*) screen1#0 + (byte) test::i#11) ← (byte) test::a#11 [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) always clobbers reg byte a +Statement [29] *((const byte*) screen2#0 + (byte) test::i#11) ← *((const byte[]) ref#0 + (byte) test::i#11) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) always clobbers reg byte a +Statement [30] if(*((const byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 [ test::i#11 ] ( main:2::test:5 [ test::i#11 ] main:2::test:7 [ test::i#11 ] main:2::test:9 [ test::i#11 ] main:2::test:11 [ test::i#11 ] main:2::test:13 [ test::i#11 ] main:2::test:15 [ test::i#11 ] main:2::test:17 [ test::i#11 ] main:2::test:19 [ test::i#11 ] main:2::test:21 [ test::i#11 ] main:2::test:23 [ test::i#11 ] main:2::test:25 [ test::i#11 ] ) always clobbers reg byte a +Statement [31] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) RED#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) always clobbers reg byte a +Statement [33] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) GREEN#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) always clobbers reg byte a +Potential registers zp ZP_BYTE:2 [ test::a#11 ] : zp ZP_BYTE:2 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:3 [ test::i#11 ] : zp ZP_BYTE:3 , reg byte x , reg byte y , + +REGISTER UPLIFT SCOPES +Uplift Scope [test] 3: zp ZP_BYTE:3 [ test::i#11 ] 1.33: zp ZP_BYTE:2 [ test::a#11 ] +Uplift Scope [main] +Uplift Scope [] + +Uplifting [test] best 250 combination reg byte x [ test::i#11 ] zp ZP_BYTE:2 [ test::a#11 ] +Uplifting [main] best 250 combination +Uplifting [] best 250 combination +Attempting to uplift remaining variables inzp ZP_BYTE:2 [ test::a#11 ] +Uplifting [test] best 250 combination zp ZP_BYTE:2 [ test::a#11 ] + +ASSEMBLER BEFORE OPTIMIZATION +//SEG0 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG1 Global Constants & labels + .label screen1 = $400 + .label cols = $d800 + .const GREEN = 5 + .const RED = 2 + .label screen2 = screen1+$28 +//SEG2 @begin +bbegin: +//SEG3 [1] phi from @begin to @2 [phi:@begin->@2] +b2_from_bbegin: + jmp b2 +//SEG4 @2 +b2: +//SEG5 [2] call main param-assignment [ ] ( ) +//SEG6 [4] phi from @2 to main [phi:@2->main] +main_from_b2: + jsr main +//SEG7 [3] phi from @2 to @end [phi:@2->@end] +bend_from_b2: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + //SEG10 [5] call test param-assignment [ ] ( main:2 [ ] ) + //SEG11 [27] phi from main to test [phi:main->test] + test_from_main: + //SEG12 [27] phi (byte) test::i#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->test#0] -- vbuxx=vbuc1 + ldx #0 + //SEG13 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3 [phi:main->test#1] -- vbuz1=vbuc1 + lda #3 + sta test.a + jsr test + //SEG14 [6] phi from main to main::@1 [phi:main->main::@1] + b1_from_main: + jmp b1 + //SEG15 main::@1 + b1: + //SEG16 [7] call test param-assignment [ ] ( main:2 [ ] ) + //SEG17 [27] phi from main::@1 to test [phi:main::@1->test] + test_from_b1: + //SEG18 [27] phi (byte) test::i#11 = ++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->test#0] -- vbuxx=vbuc1 + ldx #0+1 + //SEG19 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@1->test#1] -- vbuz1=vbuc1 + lda #3+1 + sta test.a + jsr test + //SEG20 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + b2_from_b1: + jmp b2 + //SEG21 main::@2 + b2: + //SEG22 [9] call test param-assignment [ ] ( main:2 [ ] ) + //SEG23 [27] phi from main::@2 to test [phi:main::@2->test] + test_from_b2: + //SEG24 [27] phi (byte) test::i#11 = ++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@2->test#0] -- vbuxx=vbuc1 + ldx #0+1+1 + //SEG25 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@2->test#1] -- vbuz1=vbuc1 + lda #3+1-1 + sta test.a + jsr test + //SEG26 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + b3_from_b2: + jmp b3 + //SEG27 main::@3 + b3: + //SEG28 [11] call test param-assignment [ ] ( main:2 [ ] ) + //SEG29 [27] phi from main::@3 to test [phi:main::@3->test] + test_from_b3: + //SEG30 [27] phi (byte) test::i#11 = ++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@3->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1 + //SEG31 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6 [phi:main::@3->test#1] -- vbuz1=vbuc1 + lda #(3+1-1)*6 + sta test.a + jsr test + //SEG32 [12] phi from main::@3 to main::@4 [phi:main::@3->main::@4] + b4_from_b3: + jmp b4 + //SEG33 main::@4 + b4: + //SEG34 [13] call test param-assignment [ ] ( main:2 [ ] ) + //SEG35 [27] phi from main::@4 to test [phi:main::@4->test] + test_from_b4: + //SEG36 [27] phi (byte) test::i#11 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@4->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1 + //SEG37 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@4->test#1] -- vbuz1=vbuc1 + lda #(3+1-1)*6/2 + sta test.a + jsr test + //SEG38 [14] phi from main::@4 to main::@5 [phi:main::@4->main::@5] + b5_from_b4: + jmp b5 + //SEG39 main::@5 + b5: + //SEG40 [15] call test param-assignment [ ] ( main:2 [ ] ) + //SEG41 [27] phi from main::@5 to test [phi:main::@5->test] + test_from_b5: + //SEG42 [27] phi (byte) test::i#11 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@5->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1 + //SEG43 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@5->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2) + sta test.a + jsr test + //SEG44 [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + b6_from_b5: + jmp b6 + //SEG45 main::@6 + b6: + //SEG46 [17] call test param-assignment [ ] ( main:2 [ ] ) + //SEG47 [27] phi from main::@6 to test [phi:main::@6->test] + test_from_b6: + //SEG48 [27] phi (byte) test::i#11 = ++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@6->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1 + //SEG49 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@6->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2 + sta test.a + jsr test + //SEG50 [18] phi from main::@6 to main::@7 [phi:main::@6->main::@7] + b7_from_b6: + jmp b7 + //SEG51 main::@7 + b7: + //SEG52 [19] call test param-assignment [ ] ( main:2 [ ] ) + //SEG53 [27] phi from main::@7 to test [phi:main::@7->test] + test_from_b7: + //SEG54 [27] phi (byte) test::i#11 = ++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@7->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1 + //SEG55 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@7->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1 + sta test.a + jsr test + //SEG56 [20] phi from main::@7 to main::@8 [phi:main::@7->main::@8] + b8_from_b7: + jmp b8 + //SEG57 main::@8 + b8: + //SEG58 [21] call test param-assignment [ ] ( main:2 [ ] ) + //SEG59 [27] phi from main::@8 to test [phi:main::@8->test] + test_from_b8: + //SEG60 [27] phi (byte) test::i#11 = ++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@8->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1+1 + //SEG61 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6 [phi:main::@8->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6 + sta test.a + jsr test + //SEG62 [22] phi from main::@8 to main::@9 [phi:main::@8->main::@9] + b9_from_b8: + jmp b9 + //SEG63 main::@9 + b9: + //SEG64 [23] call test param-assignment [ ] ( main:2 [ ] ) + //SEG65 [27] phi from main::@9 to test [phi:main::@9->test] + test_from_b9: + //SEG66 [27] phi (byte) test::i#11 = ++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@9->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1+1+1 + //SEG67 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@9->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6|1 + sta test.a + jsr test + //SEG68 [24] phi from main::@9 to main::@10 [phi:main::@9->main::@10] + b10_from_b9: + jmp b10 + //SEG69 main::@10 + b10: + //SEG70 [25] call test param-assignment [ ] ( main:2 [ ] ) + //SEG71 [27] phi from main::@10 to test [phi:main::@10->test] + test_from_b10: + //SEG72 [27] phi (byte) test::i#11 = ++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@10->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1+1+1+1 + //SEG73 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1&(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@10->test#1] -- vbuz1=vbuc1 + lda #(mod((3+1-1)*6/2,2)<<2>>1^6|1)&1 + sta test.a + jsr test + jmp breturn + //SEG74 main::@return + breturn: + //SEG75 [26] return [ ] ( main:2 [ ] ) + rts +} +//SEG76 test +test: { + .label a = 2 + //SEG77 [28] *((const byte*) screen1#0 + (byte) test::i#11) ← (byte) test::a#11 [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) -- pbuc1_derefidx_vbuxx=vbuz1 + lda a + sta screen1,x + //SEG78 [29] *((const byte*) screen2#0 + (byte) test::i#11) ← *((const byte[]) ref#0 + (byte) test::i#11) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx + lda ref,x + sta screen2,x + //SEG79 [30] if(*((const byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 [ test::i#11 ] ( main:2::test:5 [ test::i#11 ] main:2::test:7 [ test::i#11 ] main:2::test:9 [ test::i#11 ] main:2::test:11 [ test::i#11 ] main:2::test:13 [ test::i#11 ] main:2::test:15 [ test::i#11 ] main:2::test:17 [ test::i#11 ] main:2::test:19 [ test::i#11 ] main:2::test:21 [ test::i#11 ] main:2::test:23 [ test::i#11 ] main:2::test:25 [ test::i#11 ] ) -- pbuc1_derefidx_vbuxx_eq_vbuz1_then_la1 + lda ref,x + cmp a + beq b1 + jmp b3 + //SEG80 test::@3 + b3: + //SEG81 [31] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) RED#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) -- pbuc1_derefidx_vbuxx=vbuc2 + lda #RED + sta cols,x + jmp breturn + //SEG82 test::@return + breturn: + //SEG83 [32] return [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + rts + //SEG84 test::@1 + b1: + //SEG85 [33] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) GREEN#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) -- pbuc1_derefidx_vbuxx=vbuc2 + lda #GREEN + sta cols,x + jmp breturn +} + ref: .byte 3, 4, 3, $12, 9, 1, 4, 2, 4, 5, 1, 0 + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp b2 +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp b5 +Removing instruction jmp b6 +Removing instruction jmp b7 +Removing instruction jmp b8 +Removing instruction jmp b9 +Removing instruction jmp b10 +Removing instruction jmp breturn +Removing instruction jmp b3 +Removing instruction jmp breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction bbegin: +Removing instruction b2_from_bbegin: +Removing instruction main_from_b2: +Removing instruction bend_from_b2: +Removing instruction b1_from_main: +Removing instruction test_from_b1: +Removing instruction b2_from_b1: +Removing instruction test_from_b2: +Removing instruction b3_from_b2: +Removing instruction test_from_b3: +Removing instruction b4_from_b3: +Removing instruction test_from_b4: +Removing instruction b5_from_b4: +Removing instruction test_from_b5: +Removing instruction b6_from_b5: +Removing instruction test_from_b6: +Removing instruction b7_from_b6: +Removing instruction test_from_b7: +Removing instruction b8_from_b7: +Removing instruction test_from_b8: +Removing instruction b9_from_b8: +Removing instruction test_from_b9: +Removing instruction b10_from_b9: +Removing instruction test_from_b10: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction b2: +Removing instruction bend: +Removing instruction test_from_main: +Removing instruction b1: +Removing instruction b2: +Removing instruction b3: +Removing instruction b4: +Removing instruction b5: +Removing instruction b6: +Removing instruction b7: +Removing instruction b8: +Removing instruction b9: +Removing instruction b10: +Removing instruction breturn: +Removing instruction b3: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @2 +(label) @begin +(label) @end +(byte) GREEN +(const byte) GREEN#0 GREEN = (byte/signed byte/word/signed word/dword/signed dword) 5 +(byte) RED +(const byte) RED#0 RED = (byte/signed byte/word/signed word/dword/signed dword) 2 +(byte*) cols +(const byte*) cols#0 cols = ((byte*))(word/dword/signed dword) 55296 +(void()) main() +(label) main::@1 +(label) main::@10 +(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) main::a +(byte) main::i +(byte[]) ref +(const byte[]) ref#0 ref = { (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 18, (byte/signed byte/word/signed word/dword/signed dword) 9, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 2, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 5, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 0 } +(byte*) screen1 +(const byte*) screen1#0 screen1 = ((byte*))(word/signed word/dword/signed dword) 1024 +(byte*) screen2 +(const byte*) screen2#0 screen2 = (const byte*) screen1#0+(byte/signed byte/word/signed word/dword/signed dword) 40 +(void()) test((byte) test::i , (byte) test::a) +(label) test::@1 +(label) test::@3 +(label) test::@return +(byte) test::a +(byte) test::a#11 a zp ZP_BYTE:2 1.3333333333333333 +(byte) test::i +(byte) test::i#11 reg byte x 3.0 + +zp ZP_BYTE:2 [ test::a#11 ] +reg byte x [ test::i#11 ] + + +FINAL ASSEMBLER +Score: 205 + +//SEG0 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG1 Global Constants & labels + .label screen1 = $400 + .label cols = $d800 + .const GREEN = 5 + .const RED = 2 + .label screen2 = screen1+$28 +//SEG2 @begin +//SEG3 [1] phi from @begin to @2 [phi:@begin->@2] +//SEG4 @2 +//SEG5 [2] call main param-assignment [ ] ( ) +//SEG6 [4] phi from @2 to main [phi:@2->main] + jsr main +//SEG7 [3] phi from @2 to @end [phi:@2->@end] +//SEG8 @end +//SEG9 main +main: { + //SEG10 [5] call test param-assignment [ ] ( main:2 [ ] ) + //SEG11 [27] phi from main to test [phi:main->test] + //SEG12 [27] phi (byte) test::i#11 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main->test#0] -- vbuxx=vbuc1 + ldx #0 + //SEG13 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3 [phi:main->test#1] -- vbuz1=vbuc1 + lda #3 + sta test.a + jsr test + //SEG14 [6] phi from main to main::@1 [phi:main->main::@1] + //SEG15 main::@1 + //SEG16 [7] call test param-assignment [ ] ( main:2 [ ] ) + //SEG17 [27] phi from main::@1 to test [phi:main::@1->test] + //SEG18 [27] phi (byte) test::i#11 = ++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@1->test#0] -- vbuxx=vbuc1 + ldx #0+1 + //SEG19 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@1->test#1] -- vbuz1=vbuc1 + lda #3+1 + sta test.a + jsr test + //SEG20 [8] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + //SEG21 main::@2 + //SEG22 [9] call test param-assignment [ ] ( main:2 [ ] ) + //SEG23 [27] phi from main::@2 to test [phi:main::@2->test] + //SEG24 [27] phi (byte) test::i#11 = ++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@2->test#0] -- vbuxx=vbuc1 + ldx #0+1+1 + //SEG25 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@2->test#1] -- vbuz1=vbuc1 + lda #3+1-1 + sta test.a + jsr test + //SEG26 [10] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + //SEG27 main::@3 + //SEG28 [11] call test param-assignment [ ] ( main:2 [ ] ) + //SEG29 [27] phi from main::@3 to test [phi:main::@3->test] + //SEG30 [27] phi (byte) test::i#11 = ++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@3->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1 + //SEG31 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6 [phi:main::@3->test#1] -- vbuz1=vbuc1 + lda #(3+1-1)*6 + sta test.a + jsr test + //SEG32 [12] phi from main::@3 to main::@4 [phi:main::@3->main::@4] + //SEG33 main::@4 + //SEG34 [13] call test param-assignment [ ] ( main:2 [ ] ) + //SEG35 [27] phi from main::@4 to test [phi:main::@4->test] + //SEG36 [27] phi (byte) test::i#11 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@4->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1 + //SEG37 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@4->test#1] -- vbuz1=vbuc1 + lda #(3+1-1)*6/2 + sta test.a + jsr test + //SEG38 [14] phi from main::@4 to main::@5 [phi:main::@4->main::@5] + //SEG39 main::@5 + //SEG40 [15] call test param-assignment [ ] ( main:2 [ ] ) + //SEG41 [27] phi from main::@5 to test [phi:main::@5->test] + //SEG42 [27] phi (byte) test::i#11 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@5->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1 + //SEG43 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@5->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2) + sta test.a + jsr test + //SEG44 [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + //SEG45 main::@6 + //SEG46 [17] call test param-assignment [ ] ( main:2 [ ] ) + //SEG47 [27] phi from main::@6 to test [phi:main::@6->test] + //SEG48 [27] phi (byte) test::i#11 = ++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@6->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1 + //SEG49 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@6->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2 + sta test.a + jsr test + //SEG50 [18] phi from main::@6 to main::@7 [phi:main::@6->main::@7] + //SEG51 main::@7 + //SEG52 [19] call test param-assignment [ ] ( main:2 [ ] ) + //SEG53 [27] phi from main::@7 to test [phi:main::@7->test] + //SEG54 [27] phi (byte) test::i#11 = ++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@7->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1 + //SEG55 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@7->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1 + sta test.a + jsr test + //SEG56 [20] phi from main::@7 to main::@8 [phi:main::@7->main::@8] + //SEG57 main::@8 + //SEG58 [21] call test param-assignment [ ] ( main:2 [ ] ) + //SEG59 [27] phi from main::@8 to test [phi:main::@8->test] + //SEG60 [27] phi (byte) test::i#11 = ++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@8->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1+1 + //SEG61 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6 [phi:main::@8->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6 + sta test.a + jsr test + //SEG62 [22] phi from main::@8 to main::@9 [phi:main::@8->main::@9] + //SEG63 main::@9 + //SEG64 [23] call test param-assignment [ ] ( main:2 [ ] ) + //SEG65 [27] phi from main::@9 to test [phi:main::@9->test] + //SEG66 [27] phi (byte) test::i#11 = ++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@9->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1+1+1 + //SEG67 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@9->test#1] -- vbuz1=vbuc1 + lda #mod((3+1-1)*6/2,2)<<2>>1^6|1 + sta test.a + jsr test + //SEG68 [24] phi from main::@9 to main::@10 [phi:main::@9->main::@10] + //SEG69 main::@10 + //SEG70 [25] call test param-assignment [ ] ( main:2 [ ] ) + //SEG71 [27] phi from main::@10 to test [phi:main::@10->test] + //SEG72 [27] phi (byte) test::i#11 = ++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@10->test#0] -- vbuxx=vbuc1 + ldx #0+1+1+1+1+1+1+1+1+1+1 + //SEG73 [27] phi (byte) test::a#11 = (byte/signed byte/word/signed word/dword/signed dword) 3+(byte/signed byte/word/signed word/dword/signed dword) 1-(byte/signed byte/word/signed word/dword/signed dword) 1*(byte/signed byte/word/signed word/dword/signed dword) 6/(byte/signed byte/word/signed word/dword/signed dword) 2%(byte/signed byte/word/signed word/dword/signed dword) 2<<(byte/signed byte/word/signed word/dword/signed dword) 2>>(byte/signed byte/word/signed word/dword/signed dword) 1^(byte/signed byte/word/signed word/dword/signed dword) 6|(byte/signed byte/word/signed word/dword/signed dword) 1&(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@10->test#1] -- vbuz1=vbuc1 + lda #(mod((3+1-1)*6/2,2)<<2>>1^6|1)&1 + sta test.a + jsr test + //SEG74 main::@return + //SEG75 [26] return [ ] ( main:2 [ ] ) + rts +} +//SEG76 test +test: { + .label a = 2 + //SEG77 [28] *((const byte*) screen1#0 + (byte) test::i#11) ← (byte) test::a#11 [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) -- pbuc1_derefidx_vbuxx=vbuz1 + lda a + sta screen1,x + //SEG78 [29] *((const byte*) screen2#0 + (byte) test::i#11) ← *((const byte[]) ref#0 + (byte) test::i#11) [ test::a#11 test::i#11 ] ( main:2::test:5 [ test::a#11 test::i#11 ] main:2::test:7 [ test::a#11 test::i#11 ] main:2::test:9 [ test::a#11 test::i#11 ] main:2::test:11 [ test::a#11 test::i#11 ] main:2::test:13 [ test::a#11 test::i#11 ] main:2::test:15 [ test::a#11 test::i#11 ] main:2::test:17 [ test::a#11 test::i#11 ] main:2::test:19 [ test::a#11 test::i#11 ] main:2::test:21 [ test::a#11 test::i#11 ] main:2::test:23 [ test::a#11 test::i#11 ] main:2::test:25 [ test::a#11 test::i#11 ] ) -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx + lda ref,x + sta screen2,x + //SEG79 [30] if(*((const byte[]) ref#0 + (byte) test::i#11)==(byte) test::a#11) goto test::@1 [ test::i#11 ] ( main:2::test:5 [ test::i#11 ] main:2::test:7 [ test::i#11 ] main:2::test:9 [ test::i#11 ] main:2::test:11 [ test::i#11 ] main:2::test:13 [ test::i#11 ] main:2::test:15 [ test::i#11 ] main:2::test:17 [ test::i#11 ] main:2::test:19 [ test::i#11 ] main:2::test:21 [ test::i#11 ] main:2::test:23 [ test::i#11 ] main:2::test:25 [ test::i#11 ] ) -- pbuc1_derefidx_vbuxx_eq_vbuz1_then_la1 + lda ref,x + cmp a + beq b1 + //SEG80 test::@3 + //SEG81 [31] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) RED#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) -- pbuc1_derefidx_vbuxx=vbuc2 + lda #RED + sta cols,x + //SEG82 test::@return + breturn: + //SEG83 [32] return [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) + rts + //SEG84 test::@1 + b1: + //SEG85 [33] *((const byte*) cols#0 + (byte) test::i#11) ← (const byte) GREEN#0 [ ] ( main:2::test:5 [ ] main:2::test:7 [ ] main:2::test:9 [ ] main:2::test:11 [ ] main:2::test:13 [ ] main:2::test:15 [ ] main:2::test:17 [ ] main:2::test:19 [ ] main:2::test:21 [ ] main:2::test:23 [ ] main:2::test:25 [ ] ) -- pbuc1_derefidx_vbuxx=vbuc2 + lda #GREEN + sta cols,x + jmp breturn +} + ref: .byte 3, 4, 3, $12, 9, 1, 4, 2, 4, 5, 1, 0 + diff --git a/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.sym b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.sym new file mode 100644 index 000000000..3615eb3f4 --- /dev/null +++ b/src/test/java/dk/camelot64/kickc/test/ref/compound-assignment.sym @@ -0,0 +1,40 @@ +(label) @2 +(label) @begin +(label) @end +(byte) GREEN +(const byte) GREEN#0 GREEN = (byte/signed byte/word/signed word/dword/signed dword) 5 +(byte) RED +(const byte) RED#0 RED = (byte/signed byte/word/signed word/dword/signed dword) 2 +(byte*) cols +(const byte*) cols#0 cols = ((byte*))(word/dword/signed dword) 55296 +(void()) main() +(label) main::@1 +(label) main::@10 +(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) main::a +(byte) main::i +(byte[]) ref +(const byte[]) ref#0 ref = { (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 3, (byte/signed byte/word/signed word/dword/signed dword) 18, (byte/signed byte/word/signed word/dword/signed dword) 9, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 2, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 5, (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 0 } +(byte*) screen1 +(const byte*) screen1#0 screen1 = ((byte*))(word/signed word/dword/signed dword) 1024 +(byte*) screen2 +(const byte*) screen2#0 screen2 = (const byte*) screen1#0+(byte/signed byte/word/signed word/dword/signed dword) 40 +(void()) test((byte) test::i , (byte) test::a) +(label) test::@1 +(label) test::@3 +(label) test::@return +(byte) test::a +(byte) test::a#11 a zp ZP_BYTE:2 1.3333333333333333 +(byte) test::i +(byte) test::i#11 reg byte x 3.0 + +zp ZP_BYTE:2 [ test::a#11 ] +reg byte x [ test::i#11 ]