From bddebf00922b73b835f4c34ee06dfbace1c2b1ef Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Wed, 2 Nov 2005 08:24:19 +0000 Subject: [PATCH] Add support for single-level GAS .rept directive. Nested .rept's are not allowed at the moment. The implementation works mostly like a preproc; it copies source lines and replays them to the lexer. A new .line directive was added to fix up line numbers for errors and warnings. * gas-parser.h (yasm_parser_gas): Add rept structure storage. (gas_rept): New data structure for .rept state. (gas_rept_line): Data structure to store source lines within .rept block. * gas-parser.c: Initialize rept to NULL and check for unclosed rept. * gas-bison.y: Add support for .line, .rept, and .endr directives. The DIR_REPT handler just creates the rept structure, and the DIR_ENDR handler just errors (.endr without .rept). All the real work is done in the lexer. * gas-token.re (rept_input): Replays captured .rept block source lines back to fill(). (fill): Call rept_input() instead of yasm_preproc_input() if expanding a rept block. (gas_parser_lex): Capture source lines and store into rept data structures. Also added a whole bunch of testcases. svn path=/trunk/yasm/; revision=1306 --- modules/parsers/gas/gas-bison.y | 42 +++- modules/parsers/gas/gas-parser.c | 7 + modules/parsers/gas/gas-parser.h | 22 +++ modules/parsers/gas/gas-token.re | 187 +++++++++++++++++- modules/parsers/gas/tests/Makefile.inc | 2 + modules/parsers/gas/tests/bin/Makefile.inc | 25 +++ modules/parsers/gas/tests/bin/gas_bin_test.sh | 4 + modules/parsers/gas/tests/bin/rept-err.asm | 2 + .../parsers/gas/tests/bin/rept-err.errwarn | 1 + modules/parsers/gas/tests/bin/reptempty.asm | 4 + .../parsers/gas/tests/bin/reptempty.errwarn | 0 modules/parsers/gas/tests/bin/reptempty.hex | 2 + modules/parsers/gas/tests/bin/reptlong.asm | 156 +++++++++++++++ .../parsers/gas/tests/bin/reptlong.errwarn | 0 modules/parsers/gas/tests/bin/reptlong.hex | 7 + .../parsers/gas/tests/bin/reptnested-err.asm | 7 + .../gas/tests/bin/reptnested-err.errwarn | 7 + modules/parsers/gas/tests/bin/reptsimple.asm | 5 + .../parsers/gas/tests/bin/reptsimple.errwarn | 0 modules/parsers/gas/tests/bin/reptsimple.hex | 7 + modules/parsers/gas/tests/bin/reptwarn.asm | 10 + .../parsers/gas/tests/bin/reptwarn.errwarn | 9 + modules/parsers/gas/tests/bin/reptwarn.hex | 9 + modules/parsers/gas/tests/bin/reptzero.asm | 6 + .../parsers/gas/tests/bin/reptzero.errwarn | 0 modules/parsers/gas/tests/bin/reptzero.hex | 2 + 26 files changed, 520 insertions(+), 3 deletions(-) create mode 100644 modules/parsers/gas/tests/bin/Makefile.inc create mode 100755 modules/parsers/gas/tests/bin/gas_bin_test.sh create mode 100644 modules/parsers/gas/tests/bin/rept-err.asm create mode 100644 modules/parsers/gas/tests/bin/rept-err.errwarn create mode 100644 modules/parsers/gas/tests/bin/reptempty.asm create mode 100644 modules/parsers/gas/tests/bin/reptempty.errwarn create mode 100644 modules/parsers/gas/tests/bin/reptempty.hex create mode 100644 modules/parsers/gas/tests/bin/reptlong.asm create mode 100644 modules/parsers/gas/tests/bin/reptlong.errwarn create mode 100644 modules/parsers/gas/tests/bin/reptlong.hex create mode 100644 modules/parsers/gas/tests/bin/reptnested-err.asm create mode 100644 modules/parsers/gas/tests/bin/reptnested-err.errwarn create mode 100644 modules/parsers/gas/tests/bin/reptsimple.asm create mode 100644 modules/parsers/gas/tests/bin/reptsimple.errwarn create mode 100644 modules/parsers/gas/tests/bin/reptsimple.hex create mode 100644 modules/parsers/gas/tests/bin/reptwarn.asm create mode 100644 modules/parsers/gas/tests/bin/reptwarn.errwarn create mode 100644 modules/parsers/gas/tests/bin/reptwarn.hex create mode 100644 modules/parsers/gas/tests/bin/reptzero.asm create mode 100644 modules/parsers/gas/tests/bin/reptzero.errwarn create mode 100644 modules/parsers/gas/tests/bin/reptzero.hex diff --git a/modules/parsers/gas/gas-bison.y b/modules/parsers/gas/gas-bison.y index 1b073ec6..81cec4ee 100644 --- a/modules/parsers/gas/gas-bison.y +++ b/modules/parsers/gas/gas-bison.y @@ -106,8 +106,8 @@ static void gas_parser_directive %token LINE %token DIR_2BYTE DIR_4BYTE DIR_ALIGN DIR_ASCII DIR_ASCIZ DIR_BALIGN %token DIR_BSS DIR_BYTE DIR_COMM DIR_DATA DIR_DOUBLE DIR_ENDR DIR_EXTERN -%token DIR_EQU DIR_FILE DIR_FLOAT DIR_GLOBAL DIR_IDENT DIR_INT DIR_LOC -%token DIR_LCOMM DIR_OCTA DIR_ORG DIR_P2ALIGN DIR_REPT DIR_SECTION +%token DIR_EQU DIR_FILE DIR_FLOAT DIR_GLOBAL DIR_IDENT DIR_INT DIR_LINE +%token DIR_LOC DIR_LCOMM DIR_OCTA DIR_ORG DIR_P2ALIGN DIR_REPT DIR_SECTION %token DIR_SHORT DIR_SIZE DIR_SKIP DIR_SLEB128 DIR_STRING DIR_TEXT %token DIR_TFLOAT DIR_TYPE DIR_QUAD DIR_ULEB128 DIR_VALUE DIR_WEAK DIR_WORD %token DIR_ZERO @@ -169,6 +169,44 @@ lineexp: instr $$ = $3; define_label(parser_gas, $1, 0); } + /* Line directive */ + | DIR_LINE INTNUM { + $$ = (yasm_bytecode *)NULL; + if (yasm_intnum_sign($2) < 0) + yasm__error(cur_line, N_("line number is negative")); + else + yasm_linemap_set(parser_gas->linemap, NULL, + yasm_intnum_get_uint($2), 1); + } + /* Macro directives */ + | DIR_REPT expr { + yasm_intnum *intn = yasm_expr_get_intnum(&$2, NULL); + + $$ = (yasm_bytecode *)NULL; + if (!intn) { + yasm__error(cur_line, N_("rept expression not absolute")); + } else if (yasm_intnum_sign(intn) < 0) { + yasm__error(cur_line, N_("rept expression is negative")); + } else { + gas_rept *rept = yasm_xmalloc(sizeof(gas_rept)); + STAILQ_INIT(&rept->lines); + rept->startline = cur_line; + rept->numrept = yasm_intnum_get_uint(intn); + rept->numdone = 0; + rept->line = NULL; + rept->linepos = 0; + rept->ended = 0; + rept->oldbuf = NULL; + rept->oldbuflen = 0; + rept->oldbufpos = 0; + parser_gas->rept = rept; + } + } + | DIR_ENDR { + $$ = (yasm_bytecode *)NULL; + /* Shouldn't ever get here unless we didn't get a DIR_REPT first */ + yasm__error(cur_line, N_("endr without matching rept")); + } /* Alignment directives */ | DIR_ALIGN dirvals2 { /* FIXME: Whether this is power-of-two or not depends on arch and diff --git a/modules/parsers/gas/gas-parser.c b/modules/parsers/gas/gas-parser.c index 8b98fa93..9df1cecd 100644 --- a/modules/parsers/gas/gas-parser.c +++ b/modules/parsers/gas/gas-parser.c @@ -79,11 +79,18 @@ gas_parser_do_parse(yasm_object *object, yasm_preproc *pp, yasm_arch *a, parser_gas.code_section = !strcmp(yasm_section_get_name(def_sect), ".text"); + parser_gas.rept = NULL; + /* yacc debugging, needs YYDEBUG set in bison.y.in to work */ parser_gas.debug = 1; gas_parser_parse(&parser_gas); + /* Check for ending inside a rept */ + if (parser_gas.rept) + yasm__error(parser_gas.rept->startline, + N_("rept without matching endr")); + gas_parser_cleanup(&parser_gas); /* Free locallabel base if necessary */ diff --git a/modules/parsers/gas/gas-parser.h b/modules/parsers/gas/gas-parser.h index acdbe3ef..d17ee34a 100644 --- a/modules/parsers/gas/gas-parser.h +++ b/modules/parsers/gas/gas-parser.h @@ -40,6 +40,26 @@ typedef struct Scanner { #define MAX_SAVED_LINE_LEN 80 +typedef struct gas_rept_line { + STAILQ_ENTRY(gas_rept_line) link; + YYCTYPE *data; /* line characters */ + size_t len; /* length of data */ +} gas_rept_line; + +typedef struct gas_rept { + STAILQ_HEAD(reptlinelist, gas_rept_line) lines; /* repeated lines */ + unsigned long startline; /* line number of rept directive */ + unsigned long numrept; /* number of repititions to generate */ + unsigned long numdone; /* number of repititions executed so far */ + /*@null@*/ gas_rept_line *line; /* next line to repeat */ + size_t linepos; /* position to start pulling chars from line */ + int ended; /* seen endr directive yet? */ + + char *oldbuf; /* saved previous fill buffer */ + size_t oldbuflen; /* previous fill buffer length */ + size_t oldbufpos; /* position in previous fill buffer */ +} gas_rept; + typedef struct yasm_parser_gas { FILE *in; int debug; @@ -72,6 +92,8 @@ typedef struct yasm_parser_gas { } state; int code_section; + + /*@null@*/ gas_rept *rept; } yasm_parser_gas; /* shorter access names to commonly used parser_gas fields */ diff --git a/modules/parsers/gas/gas-token.re b/modules/parsers/gas/gas-token.re index 98db9472..e284232f 100644 --- a/modules/parsers/gas/gas-token.re +++ b/modules/parsers/gas/gas-token.re @@ -54,6 +54,80 @@ RCSID("$Id$"); #define TOKLEN (size_t)(cursor-s->tok) +static size_t +rept_input(yasm_parser_gas *parser_gas, /*@out@*/ char *buf, size_t max_size) +{ + gas_rept *rept = parser_gas->rept; + size_t numleft = max_size; + char *bufp = buf; + + /* If numrept is 0, copy out just the line end characters */ + if (rept->numrept == 0) { + /* Skip first line, which contains .line */ + rept->line = STAILQ_NEXT(rept->line, link); + if (!rept->line) { + rept->numrept = 1; + rept->numdone = 1; + } + while (rept->numrept == 0 && numleft > 0) { + *bufp++ = rept->line->data[rept->line->len-1]; + rept->line = STAILQ_NEXT(rept->line, link); + if (!rept->line) { + rept->numrept = 1; + rept->numdone = 1; + } + } + } + + /* Copy out the previous fill buffer until we're *really* done */ + if (rept->numdone == rept->numrept) { + size_t numcopy = rept->oldbuflen - rept->oldbufpos; + if (numcopy > numleft) + numcopy = numleft; + memcpy(bufp, &rept->oldbuf[rept->oldbufpos], numcopy); + numleft -= numcopy; + bufp += numcopy; + rept->oldbufpos += numcopy; + + if (rept->oldbufpos == rept->oldbuflen) { + /* Delete lines, then delete rept and clear rept state */ + gas_rept_line *cur, *next; + cur = STAILQ_FIRST(&rept->lines); + while (cur) { + next = STAILQ_NEXT(cur, link); + yasm_xfree(cur->data); + yasm_xfree(cur); + cur = next; + } + yasm_xfree(rept->oldbuf); + yasm_xfree(rept); + parser_gas->rept = NULL; + } + } + + while (numleft > 0 && rept->numdone < rept->numrept) { + /* Copy from line data to buf */ + size_t numcopy = rept->line->len - rept->linepos; + if (numcopy > numleft) + numcopy = numleft; + memcpy(bufp, &rept->line->data[rept->linepos], numcopy); + numleft -= numcopy; + bufp += numcopy; + rept->linepos += numcopy; + + /* Update locations if needed */ + if (rept->linepos == rept->line->len) { + rept->line = STAILQ_NEXT(rept->line, link); + rept->linepos = 0; + } + if (rept->line == NULL) { + rept->numdone++; + rept->line = STAILQ_FIRST(&rept->lines); + } + } + + return (max_size-numleft); +} static YYCTYPE * fill(yasm_parser_gas *parser_gas, YYCTYPE *cursor) @@ -85,7 +159,10 @@ fill(yasm_parser_gas *parser_gas, YYCTYPE *cursor) yasm_xfree(s->bot); s->bot = buf; } - if((cnt = yasm_preproc_input(parser_gas->preproc, s->lim, + if (parser_gas->rept && parser_gas->rept->ended) { + /* Pull from rept lines instead of preproc */ + cnt = rept_input(parser_gas, s->lim, BSIZE); + } else if((cnt = yasm_preproc_input(parser_gas->preproc, s->lim, BSIZE)) == 0) { s->eof = &s->lim[cnt]; *s->eof++ = '\n'; } @@ -168,15 +245,22 @@ strbuf_append(size_t count, YYCTYPE *cursor, Scanner *s, unsigned long line, int gas_parser_lex(YYSTYPE *lvalp, yasm_parser_gas *parser_gas) { + /*@null@*/ gas_rept *rept = parser_gas->rept; Scanner *s = &parser_gas->s; YYCTYPE *cursor = s->cur; size_t count; YYCTYPE savech; + int linestart; + gas_rept_line *new_line; /* Catch EOF */ if (s->eof && cursor == s->eof) return 0; + /* Handle rept */ + if (rept && !rept->ended) + goto rept_directive; + /* Jump to proper "exclusive" states */ switch (parser_gas->state) { case SECTION_DIRECTIVE: @@ -276,6 +360,7 @@ scan: '.ident' { RETURN(DIR_IDENT); } '.int' { RETURN(DIR_INT); } '.lcomm' { RETURN(DIR_LCOMM); } + '.line' { RETURN(DIR_LINE); } '.loc' { RETURN(DIR_LOC); } '.long' { RETURN(DIR_INT); } '.octa' { RETURN(DIR_OCTA); } @@ -504,4 +589,104 @@ stringconst_scan: goto stringconst_scan; } */ + +rept_directive: + strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE); + strbuf_size = STRBUF_ALLOC_SIZE; + count = 0; + linestart = 1; + + +rept_scan: + SCANINIT(); + + /*!re2c + [\n;] { + /* Line ending, save in lines */ + new_line = yasm_xmalloc(sizeof(gas_rept_line)); + if (cursor == s->eof) { + yasm_xfree(strbuf); + return 0; + } + strbuf_append(count++, cursor, s, cur_line, s->tok[0]); + new_line->data = strbuf; + new_line->len = count; + STAILQ_INSERT_TAIL(&rept->lines, new_line, link); + /* Allocate new strbuf */ + strbuf = yasm_xmalloc(STRBUF_ALLOC_SIZE); + strbuf_size = STRBUF_ALLOC_SIZE; + count = 0; + /* Mark start of line */ + linestart = 1; + goto rept_scan; + } + '.rept' { + int i; + if (linestart) { + /* We don't support nested right now, error */ + yasm__error(cur_line, N_("nested rept not supported")); + } + for (i=0; i<6; i++) + strbuf_append(count++, cursor, s, cur_line, s->tok[i]); + goto rept_scan; + } + '.endr' { + if (linestart) { + /* We're done, kick off the main lexer */ + rept->line = STAILQ_FIRST(&rept->lines); + if (!rept->line) { + /* Didn't get any intervening data? Empty repeat, so + * don't even bother. + */ + yasm_xfree(strbuf); + yasm_xfree(rept); + parser_gas->rept = NULL; + } else { + rept->ended = 1; + + /* Add .line as first line to get line numbers correct */ + new_line = yasm_xmalloc(sizeof(gas_rept_line)); + new_line->data = yasm_xmalloc(40); + sprintf(new_line->data, ".line %lu;", rept->startline+1); + new_line->len = strlen(new_line->data); + STAILQ_INSERT_HEAD(&rept->lines, new_line, link); + + /* Save previous fill buffer */ + rept->oldbuf = parser_gas->s.bot; + rept->oldbuflen = s->lim - s->bot; + rept->oldbufpos = cursor - s->bot; + + /* Reset fill */ + s->bot = NULL; + s->tok = NULL; + s->ptr = NULL; + s->cur = NULL; + s->pos = NULL; + s->lim = NULL; + s->top = NULL; + s->eof = NULL; + cursor = NULL; + YYFILL(1); + } + + goto scan; + } else { + int i; + for (i=0; i<6; i++) + strbuf_append(count++, cursor, s, cur_line, s->tok[i]); + goto rept_scan; + } + } + + any { + if (cursor == s->eof) { + yasm_xfree(strbuf); + return 0; + } + strbuf_append(count++, cursor, s, cur_line, s->tok[0]); + linestart = 0; + goto rept_scan; + } + */ + } diff --git a/modules/parsers/gas/tests/Makefile.inc b/modules/parsers/gas/tests/Makefile.inc index 484d60eb..7134b34a 100644 --- a/modules/parsers/gas/tests/Makefile.inc +++ b/modules/parsers/gas/tests/Makefile.inc @@ -33,3 +33,5 @@ EXTRA_DIST += modules/parsers/gas/tests/varinsn.asm EXTRA_DIST += modules/parsers/gas/tests/varinsn.errwarn EXTRA_DIST += modules/parsers/gas/tests/varinsn.hex +EXTRA_DIST += modules/parsers/gas/tests/bin/Makefile.inc +include modules/parsers/gas/tests/bin/Makefile.inc diff --git a/modules/parsers/gas/tests/bin/Makefile.inc b/modules/parsers/gas/tests/bin/Makefile.inc new file mode 100644 index 00000000..7acd93ff --- /dev/null +++ b/modules/parsers/gas/tests/bin/Makefile.inc @@ -0,0 +1,25 @@ +# $Id$ + +TESTS += modules/parsers/gas/tests/bin/gas_bin_test.sh + +EXTRA_DIST += modules/parsers/gas/tests/bin/gas_bin_test.sh +EXTRA_DIST += modules/parsers/gas/tests/bin/rept-err.asm +EXTRA_DIST += modules/parsers/gas/tests/bin/rept-err.errwarn +EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.asm +EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.errwarn +EXTRA_DIST += modules/parsers/gas/tests/bin/reptempty.hex +EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.asm +EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.errwarn +EXTRA_DIST += modules/parsers/gas/tests/bin/reptlong.hex +EXTRA_DIST += modules/parsers/gas/tests/bin/reptnested-err.asm +EXTRA_DIST += modules/parsers/gas/tests/bin/reptnested-err.errwarn +EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.asm +EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.errwarn +EXTRA_DIST += modules/parsers/gas/tests/bin/reptsimple.hex +EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.asm +EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.errwarn +EXTRA_DIST += modules/parsers/gas/tests/bin/reptwarn.hex +EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.asm +EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.errwarn +EXTRA_DIST += modules/parsers/gas/tests/bin/reptzero.hex + diff --git a/modules/parsers/gas/tests/bin/gas_bin_test.sh b/modules/parsers/gas/tests/bin/gas_bin_test.sh new file mode 100755 index 00000000..f0c83e9f --- /dev/null +++ b/modules/parsers/gas/tests/bin/gas_bin_test.sh @@ -0,0 +1,4 @@ +#! /bin/sh +# $Id$ +${srcdir}/out_test.sh gas_bin_test modules/parsers/gas/tests/bin "gas-compat parser bin output" "-f bin -p gas" "" +exit $? diff --git a/modules/parsers/gas/tests/bin/rept-err.asm b/modules/parsers/gas/tests/bin/rept-err.asm new file mode 100644 index 00000000..143e9041 --- /dev/null +++ b/modules/parsers/gas/tests/bin/rept-err.asm @@ -0,0 +1,2 @@ +.rept 6 +.byte 0 diff --git a/modules/parsers/gas/tests/bin/rept-err.errwarn b/modules/parsers/gas/tests/bin/rept-err.errwarn new file mode 100644 index 00000000..050398c2 --- /dev/null +++ b/modules/parsers/gas/tests/bin/rept-err.errwarn @@ -0,0 +1 @@ +-:1: rept without matching endr diff --git a/modules/parsers/gas/tests/bin/reptempty.asm b/modules/parsers/gas/tests/bin/reptempty.asm new file mode 100644 index 00000000..45600837 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptempty.asm @@ -0,0 +1,4 @@ +.byte 1 +.rept 2 +.endr +.byte 2 diff --git a/modules/parsers/gas/tests/bin/reptempty.errwarn b/modules/parsers/gas/tests/bin/reptempty.errwarn new file mode 100644 index 00000000..e69de29b diff --git a/modules/parsers/gas/tests/bin/reptempty.hex b/modules/parsers/gas/tests/bin/reptempty.hex new file mode 100644 index 00000000..26334819 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptempty.hex @@ -0,0 +1,2 @@ +01 +02 diff --git a/modules/parsers/gas/tests/bin/reptlong.asm b/modules/parsers/gas/tests/bin/reptlong.asm new file mode 100644 index 00000000..cc5e992e --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptlong.asm @@ -0,0 +1,156 @@ +.byte 1 +.rept 5 +.byte 0 +.endr +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +# AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +.byte 2 diff --git a/modules/parsers/gas/tests/bin/reptlong.errwarn b/modules/parsers/gas/tests/bin/reptlong.errwarn new file mode 100644 index 00000000..e69de29b diff --git a/modules/parsers/gas/tests/bin/reptlong.hex b/modules/parsers/gas/tests/bin/reptlong.hex new file mode 100644 index 00000000..627e3d21 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptlong.hex @@ -0,0 +1,7 @@ +01 +00 +00 +00 +00 +00 +02 diff --git a/modules/parsers/gas/tests/bin/reptnested-err.asm b/modules/parsers/gas/tests/bin/reptnested-err.asm new file mode 100644 index 00000000..bb85988a --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptnested-err.asm @@ -0,0 +1,7 @@ +.rept 6 +.byte 1 +.rept 2 +.byte 2 +.endr +.byte 3 +.endr diff --git a/modules/parsers/gas/tests/bin/reptnested-err.errwarn b/modules/parsers/gas/tests/bin/reptnested-err.errwarn new file mode 100644 index 00000000..016b13e9 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptnested-err.errwarn @@ -0,0 +1,7 @@ +-:2: nested rept not supported +-:3: rept without matching endr +-:4: nested rept not supported +-:4: nested rept not supported +-:4: nested rept not supported +-:4: nested rept not supported +-:4: nested rept not supported diff --git a/modules/parsers/gas/tests/bin/reptsimple.asm b/modules/parsers/gas/tests/bin/reptsimple.asm new file mode 100644 index 00000000..cb7045a9 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptsimple.asm @@ -0,0 +1,5 @@ +.byte 1 +.rept 5 +.byte 0 +.endr +.byte 2 diff --git a/modules/parsers/gas/tests/bin/reptsimple.errwarn b/modules/parsers/gas/tests/bin/reptsimple.errwarn new file mode 100644 index 00000000..e69de29b diff --git a/modules/parsers/gas/tests/bin/reptsimple.hex b/modules/parsers/gas/tests/bin/reptsimple.hex new file mode 100644 index 00000000..627e3d21 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptsimple.hex @@ -0,0 +1,7 @@ +01 +00 +00 +00 +00 +00 +02 diff --git a/modules/parsers/gas/tests/bin/reptwarn.asm b/modules/parsers/gas/tests/bin/reptwarn.asm new file mode 100644 index 00000000..826bd81d --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptwarn.asm @@ -0,0 +1,10 @@ +.byte 1000 +.rept 3 +.byte 1000 + + +.byte 1000 +.endr + +.byte 1000 +.byte 1000 diff --git a/modules/parsers/gas/tests/bin/reptwarn.errwarn b/modules/parsers/gas/tests/bin/reptwarn.errwarn new file mode 100644 index 00000000..bd1611d8 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptwarn.errwarn @@ -0,0 +1,9 @@ +-:1: warning: value does not fit in 8 bit field +-:3: warning: value does not fit in 8 bit field +-:6: warning: value does not fit in 8 bit field +-:3: warning: value does not fit in 8 bit field +-:6: warning: value does not fit in 8 bit field +-:3: warning: value does not fit in 8 bit field +-:6: warning: value does not fit in 8 bit field +-:9: warning: value does not fit in 8 bit field +-:10: warning: value does not fit in 8 bit field diff --git a/modules/parsers/gas/tests/bin/reptwarn.hex b/modules/parsers/gas/tests/bin/reptwarn.hex new file mode 100644 index 00000000..91ee3813 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptwarn.hex @@ -0,0 +1,9 @@ +e8 +e8 +e8 +e8 +e8 +e8 +e8 +e8 +e8 diff --git a/modules/parsers/gas/tests/bin/reptzero.asm b/modules/parsers/gas/tests/bin/reptzero.asm new file mode 100644 index 00000000..02749d2d --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptzero.asm @@ -0,0 +1,6 @@ +.byte 1 +.rept 0 +.byte 2 +.byte 3 +.endr +.byte 4 diff --git a/modules/parsers/gas/tests/bin/reptzero.errwarn b/modules/parsers/gas/tests/bin/reptzero.errwarn new file mode 100644 index 00000000..e69de29b diff --git a/modules/parsers/gas/tests/bin/reptzero.hex b/modules/parsers/gas/tests/bin/reptzero.hex new file mode 100644 index 00000000..5b7f2e83 --- /dev/null +++ b/modules/parsers/gas/tests/bin/reptzero.hex @@ -0,0 +1,2 @@ +01 +04 -- 2.40.0