Home | History | Annotate | Download | only in config
      1 /* m68k.y -- bison grammar for m68k operand parsing
      2    Copyright (C) 1995-2016 Free Software Foundation, Inc.
      3    Written by Ken Raeburn and Ian Lance Taylor, Cygnus Support
      4 
      5    This file is part of GAS, the GNU Assembler.
      6 
      7    GAS is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3, or (at your option)
     10    any later version.
     11 
     12    GAS is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with GAS; see the file COPYING.  If not, write to the Free
     19    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     20    02110-1301, USA.  */
     21 
     22 /* This file holds a bison grammar to parse m68k operands.  The m68k
     23    has a complicated operand syntax, and gas supports two main
     24    variations of it.  Using a grammar is probably overkill, but at
     25    least it makes clear exactly what we do support.  */
     26 
     27 %{
     28 
     29 #include "as.h"
     30 #include "tc-m68k.h"
     31 #include "m68k-parse.h"
     32 #include "safe-ctype.h"
     33 
     34 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror,
     35    etc), as well as gratuitously global symbol names If other parser
     36    generators (bison, byacc, etc) produce additional global names that
     37    conflict at link time, then those parser generators need to be
     38    fixed instead of adding those names to this list.  */
     39 
     40 #define	yymaxdepth m68k_maxdepth
     41 #define	yyparse	m68k_parse
     42 #define	yylex	m68k_lex
     43 #define	yyerror	m68k_error
     44 #define	yylval	m68k_lval
     45 #define	yychar	m68k_char
     46 #define	yydebug	m68k_debug
     47 #define	yypact	m68k_pact
     48 #define	yyr1	m68k_r1
     49 #define	yyr2	m68k_r2
     50 #define	yydef	m68k_def
     51 #define	yychk	m68k_chk
     52 #define	yypgo	m68k_pgo
     53 #define	yyact	m68k_act
     54 #define	yyexca	m68k_exca
     55 #define yyerrflag m68k_errflag
     56 #define yynerrs	m68k_nerrs
     57 #define	yyps	m68k_ps
     58 #define	yypv	m68k_pv
     59 #define	yys	m68k_s
     60 #define	yy_yys	m68k_yys
     61 #define	yystate	m68k_state
     62 #define	yytmp	m68k_tmp
     63 #define	yyv	m68k_v
     64 #define	yy_yyv	m68k_yyv
     65 #define	yyval	m68k_val
     66 #define	yylloc	m68k_lloc
     67 #define yyreds	m68k_reds		/* With YYDEBUG defined */
     68 #define yytoks	m68k_toks		/* With YYDEBUG defined */
     69 #define yylhs	m68k_yylhs
     70 #define yylen	m68k_yylen
     71 #define yydefred m68k_yydefred
     72 #define yydgoto	m68k_yydgoto
     73 #define yysindex m68k_yysindex
     74 #define yyrindex m68k_yyrindex
     75 #define yygindex m68k_yygindex
     76 #define yytable	 m68k_yytable
     77 #define yycheck	 m68k_yycheck
     78 
     79 #ifndef YYDEBUG
     80 #define YYDEBUG 1
     81 #endif
     82 
     83 /* Internal functions.  */
     84 
     85 static enum m68k_register m68k_reg_parse (char **);
     86 static int yylex (void);
     87 static void yyerror (const char *);
     88 
     89 /* The parser sets fields pointed to by this global variable.  */
     90 static struct m68k_op *op;
     91 
     92 %}
     93 
     94 %union
     95 {
     96   struct m68k_indexreg indexreg;
     97   enum m68k_register reg;
     98   struct m68k_exp exp;
     99   unsigned long mask;
    100   int onereg;
    101   int trailing_ampersand;
    102 }
    103 
    104 %token <reg> DR AR FPR FPCR LPC ZAR ZDR LZPC CREG
    105 %token <indexreg> INDEXREG
    106 %token <exp> EXPR
    107 
    108 %type <indexreg> zireg zdireg
    109 %type <reg> zadr zdr apc zapc zpc optzapc optczapc
    110 %type <exp> optcexpr optexprc
    111 %type <mask> reglist ireglist reglistpair
    112 %type <onereg> reglistreg
    113 %type <trailing_ampersand> optional_ampersand
    114 
    115 %%
    116 
    117 /* An operand.  */
    118 
    119 operand:
    120 	  generic_operand
    121 	| motorola_operand optional_ampersand
    122 		{
    123 		  op->trailing_ampersand = $2;
    124 		}
    125 	| mit_operand optional_ampersand
    126 		{
    127 		  op->trailing_ampersand = $2;
    128 		}
    129 	;
    130 
    131 /* A trailing ampersand(for MAC/EMAC mask addressing).  */
    132 optional_ampersand:
    133 	/* empty */
    134 		{ $$ = 0; }
    135 	| '&'
    136 		{ $$ = 1; }
    137 	;
    138 
    139 /* A generic operand.  */
    140 
    141 generic_operand:
    142 	  '<' '<'
    143 		{
    144 		  op->mode = LSH;
    145 		}
    146 
    147 	| '>' '>'
    148 		{
    149 		  op->mode = RSH;
    150 		}
    151 
    152 	| DR
    153 		{
    154 		  op->mode = DREG;
    155 		  op->reg = $1;
    156 		}
    157 	| AR
    158 		{
    159 		  op->mode = AREG;
    160 		  op->reg = $1;
    161 		}
    162 	| FPR
    163 		{
    164 		  op->mode = FPREG;
    165 		  op->reg = $1;
    166 		}
    167 	| FPCR
    168 		{
    169 		  op->mode = CONTROL;
    170 		  op->reg = $1;
    171 		}
    172 	| CREG
    173 		{
    174 		  op->mode = CONTROL;
    175 		  op->reg = $1;
    176 		}
    177 	| EXPR
    178 		{
    179 		  op->mode = ABSL;
    180 		  op->disp = $1;
    181 		}
    182 	| '#' EXPR
    183 		{
    184 		  op->mode = IMMED;
    185 		  op->disp = $2;
    186 		}
    187 	| '&' EXPR
    188 		{
    189 		  op->mode = IMMED;
    190 		  op->disp = $2;
    191 		}
    192 	| reglist
    193 		{
    194 		  op->mode = REGLST;
    195 		  op->mask = $1;
    196 		}
    197 	;
    198 
    199 /* An operand in Motorola syntax.  This includes MRI syntax as well,
    200    which may or may not be different in that it permits commutativity
    201    of index and base registers, and permits an offset expression to
    202    appear inside or outside of the parentheses.  */
    203 
    204 motorola_operand:
    205 	  '(' AR ')'
    206 		{
    207 		  op->mode = AINDR;
    208 		  op->reg = $2;
    209 		}
    210 	| '(' AR ')' '+'
    211 		{
    212 		  op->mode = AINC;
    213 		  op->reg = $2;
    214 		}
    215 	| '-' '(' AR ')'
    216 		{
    217 		  op->mode = ADEC;
    218 		  op->reg = $3;
    219 		}
    220 	| '(' EXPR ',' zapc ')'
    221 		{
    222 		  op->reg = $4;
    223 		  op->disp = $2;
    224 		  if (($4 >= ZADDR0 && $4 <= ZADDR7)
    225 		      || $4 == ZPC)
    226 		    op->mode = BASE;
    227 		  else
    228 		    op->mode = DISP;
    229 		}
    230 	| '(' zapc ',' EXPR ')'
    231 		{
    232 		  op->reg = $2;
    233 		  op->disp = $4;
    234 		  if (($2 >= ZADDR0 && $2 <= ZADDR7)
    235 		      || $2 == ZPC)
    236 		    op->mode = BASE;
    237 		  else
    238 		    op->mode = DISP;
    239 		}
    240 	| EXPR '(' zapc ')'
    241 		{
    242 		  op->reg = $3;
    243 		  op->disp = $1;
    244 		  if (($3 >= ZADDR0 && $3 <= ZADDR7)
    245 		      || $3 == ZPC)
    246 		    op->mode = BASE;
    247 		  else
    248 		    op->mode = DISP;
    249 		}
    250 	| '(' LPC ')'
    251 		{
    252 		  op->mode = DISP;
    253 		  op->reg = $2;
    254 		}
    255 	| '(' ZAR ')'
    256 		{
    257 		  op->mode = BASE;
    258 		  op->reg = $2;
    259 		}
    260 	| '(' LZPC ')'
    261 		{
    262 		  op->mode = BASE;
    263 		  op->reg = $2;
    264 		}
    265 	| '(' EXPR ',' zapc ',' zireg ')'
    266 		{
    267 		  op->mode = BASE;
    268 		  op->reg = $4;
    269 		  op->disp = $2;
    270 		  op->index = $6;
    271 		}
    272 	| '(' EXPR ',' zapc ',' zpc ')'
    273 		{
    274 		  if ($4 == PC || $4 == ZPC)
    275 		    yyerror (_("syntax error"));
    276 		  op->mode = BASE;
    277 		  op->reg = $6;
    278 		  op->disp = $2;
    279 		  op->index.reg = $4;
    280 		  op->index.size = SIZE_UNSPEC;
    281 		  op->index.scale = 1;
    282 		}
    283 	| '(' EXPR ',' zdireg optczapc ')'
    284 		{
    285 		  op->mode = BASE;
    286 		  op->reg = $5;
    287 		  op->disp = $2;
    288 		  op->index = $4;
    289 		}
    290 	| '(' zdireg ',' EXPR ')'
    291 		{
    292 		  op->mode = BASE;
    293 		  op->disp = $4;
    294 		  op->index = $2;
    295 		}
    296 	| EXPR '(' zapc ',' zireg ')'
    297 		{
    298 		  op->mode = BASE;
    299 		  op->reg = $3;
    300 		  op->disp = $1;
    301 		  op->index = $5;
    302 		}
    303 	| '(' zapc ',' zireg ')'
    304 		{
    305 		  op->mode = BASE;
    306 		  op->reg = $2;
    307 		  op->index = $4;
    308 		}
    309 	| EXPR '(' zapc ',' zpc ')'
    310 		{
    311 		  if ($3 == PC || $3 == ZPC)
    312 		    yyerror (_("syntax error"));
    313 		  op->mode = BASE;
    314 		  op->reg = $5;
    315 		  op->disp = $1;
    316 		  op->index.reg = $3;
    317 		  op->index.size = SIZE_UNSPEC;
    318 		  op->index.scale = 1;
    319 		}
    320 	| '(' zapc ',' zpc ')'
    321 		{
    322 		  if ($2 == PC || $2 == ZPC)
    323 		    yyerror (_("syntax error"));
    324 		  op->mode = BASE;
    325 		  op->reg = $4;
    326 		  op->index.reg = $2;
    327 		  op->index.size = SIZE_UNSPEC;
    328 		  op->index.scale = 1;
    329 		}
    330 	| EXPR '(' zdireg optczapc ')'
    331 		{
    332 		  op->mode = BASE;
    333 		  op->reg = $4;
    334 		  op->disp = $1;
    335 		  op->index = $3;
    336 		}
    337 	| '(' zdireg optczapc ')'
    338 		{
    339 		  op->mode = BASE;
    340 		  op->reg = $3;
    341 		  op->index = $2;
    342 		}
    343 	| '(' '[' EXPR optczapc ']' ',' zireg optcexpr ')'
    344 		{
    345 		  op->mode = POST;
    346 		  op->reg = $4;
    347 		  op->disp = $3;
    348 		  op->index = $7;
    349 		  op->odisp = $8;
    350 		}
    351 	| '(' '[' EXPR optczapc ']' optcexpr ')'
    352 		{
    353 		  op->mode = POST;
    354 		  op->reg = $4;
    355 		  op->disp = $3;
    356 		  op->odisp = $6;
    357 		}
    358 	| '(' '[' zapc ']' ',' zireg optcexpr ')'
    359 		{
    360 		  op->mode = POST;
    361 		  op->reg = $3;
    362 		  op->index = $6;
    363 		  op->odisp = $7;
    364 		}
    365 	| '(' '[' zapc ']' optcexpr ')'
    366 		{
    367 		  op->mode = POST;
    368 		  op->reg = $3;
    369 		  op->odisp = $5;
    370 		}
    371 	| '(' '[' EXPR ',' zapc ',' zireg ']' optcexpr ')'
    372 		{
    373 		  op->mode = PRE;
    374 		  op->reg = $5;
    375 		  op->disp = $3;
    376 		  op->index = $7;
    377 		  op->odisp = $9;
    378 		}
    379 	| '(' '[' zapc ',' zireg ']' optcexpr ')'
    380 		{
    381 		  op->mode = PRE;
    382 		  op->reg = $3;
    383 		  op->index = $5;
    384 		  op->odisp = $7;
    385 		}
    386 	| '(' '[' EXPR ',' zapc ',' zpc ']' optcexpr ')'
    387 		{
    388 		  if ($5 == PC || $5 == ZPC)
    389 		    yyerror (_("syntax error"));
    390 		  op->mode = PRE;
    391 		  op->reg = $7;
    392 		  op->disp = $3;
    393 		  op->index.reg = $5;
    394 		  op->index.size = SIZE_UNSPEC;
    395 		  op->index.scale = 1;
    396 		  op->odisp = $9;
    397 		}
    398 	| '(' '[' zapc ',' zpc ']' optcexpr ')'
    399 		{
    400 		  if ($3 == PC || $3 == ZPC)
    401 		    yyerror (_("syntax error"));
    402 		  op->mode = PRE;
    403 		  op->reg = $5;
    404 		  op->index.reg = $3;
    405 		  op->index.size = SIZE_UNSPEC;
    406 		  op->index.scale = 1;
    407 		  op->odisp = $7;
    408 		}
    409 	| '(' '[' optexprc zdireg optczapc ']' optcexpr ')'
    410 		{
    411 		  op->mode = PRE;
    412 		  op->reg = $5;
    413 		  op->disp = $3;
    414 		  op->index = $4;
    415 		  op->odisp = $7;
    416 		}
    417 	;
    418 
    419 /* An operand in MIT syntax.  */
    420 
    421 mit_operand:
    422 	  optzapc '@'
    423 		{
    424 		  /* We use optzapc to avoid a shift/reduce conflict.  */
    425 		  if ($1 < ADDR0 || $1 > ADDR7)
    426 		    yyerror (_("syntax error"));
    427 		  op->mode = AINDR;
    428 		  op->reg = $1;
    429 		}
    430 	| optzapc '@' '+'
    431 		{
    432 		  /* We use optzapc to avoid a shift/reduce conflict.  */
    433 		  if ($1 < ADDR0 || $1 > ADDR7)
    434 		    yyerror (_("syntax error"));
    435 		  op->mode = AINC;
    436 		  op->reg = $1;
    437 		}
    438 	| optzapc '@' '-'
    439 		{
    440 		  /* We use optzapc to avoid a shift/reduce conflict.  */
    441 		  if ($1 < ADDR0 || $1 > ADDR7)
    442 		    yyerror (_("syntax error"));
    443 		  op->mode = ADEC;
    444 		  op->reg = $1;
    445 		}
    446 	| optzapc '@' '(' EXPR ')'
    447 		{
    448 		  op->reg = $1;
    449 		  op->disp = $4;
    450 		  if (($1 >= ZADDR0 && $1 <= ZADDR7)
    451 		      || $1 == ZPC)
    452 		    op->mode = BASE;
    453 		  else
    454 		    op->mode = DISP;
    455 		}
    456 	| optzapc '@' '(' optexprc zireg ')'
    457 		{
    458 		  op->mode = BASE;
    459 		  op->reg = $1;
    460 		  op->disp = $4;
    461 		  op->index = $5;
    462 		}
    463 	| optzapc '@' '(' EXPR ')' '@' '(' optexprc zireg ')'
    464 		{
    465 		  op->mode = POST;
    466 		  op->reg = $1;
    467 		  op->disp = $4;
    468 		  op->index = $9;
    469 		  op->odisp = $8;
    470 		}
    471 	| optzapc '@' '(' EXPR ')' '@' '(' EXPR ')'
    472 		{
    473 		  op->mode = POST;
    474 		  op->reg = $1;
    475 		  op->disp = $4;
    476 		  op->odisp = $8;
    477 		}
    478 	| optzapc '@' '(' optexprc zireg ')' '@' '(' EXPR ')'
    479 		{
    480 		  op->mode = PRE;
    481 		  op->reg = $1;
    482 		  op->disp = $4;
    483 		  op->index = $5;
    484 		  op->odisp = $9;
    485 		}
    486 	;
    487 
    488 /* An index register, possibly suppressed, which need not have a size
    489    or scale.  */
    490 
    491 zireg:
    492 	  INDEXREG
    493 	| zadr
    494 		{
    495 		  $$.reg = $1;
    496 		  $$.size = SIZE_UNSPEC;
    497 		  $$.scale = 1;
    498 		}
    499 	;
    500 
    501 /* A register which may be an index register, but which may not be an
    502    address register.  This nonterminal is used to avoid ambiguity when
    503    trying to parse something like (0,d5,a6) as compared to (0,a6,d5).  */
    504 
    505 zdireg:
    506 	  INDEXREG
    507 	| zdr
    508 		{
    509 		  $$.reg = $1;
    510 		  $$.size = SIZE_UNSPEC;
    511 		  $$.scale = 1;
    512 		}
    513 	;
    514 
    515 /* An address or data register, or a suppressed address or data
    516    register.  */
    517 
    518 zadr:
    519 	  zdr
    520 	| AR
    521 	| ZAR
    522 	;
    523 
    524 /* A data register which may be suppressed.  */
    525 
    526 zdr:
    527 	  DR
    528 	| ZDR
    529 	;
    530 
    531 /* Either an address register or the PC.  */
    532 
    533 apc:
    534 	  AR
    535 	| LPC
    536 	;
    537 
    538 /* Either an address register, or the PC, or a suppressed address
    539    register, or a suppressed PC.  */
    540 
    541 zapc:
    542 	  apc
    543 	| LZPC
    544 	| ZAR
    545 	;
    546 
    547 /* An optional zapc.  */
    548 
    549 optzapc:
    550 	  /* empty */
    551 		{
    552 		  $$ = ZADDR0;
    553 		}
    554 	| zapc
    555 	;
    556 
    557 /* The PC, optionally suppressed.  */
    558 
    559 zpc:
    560 	  LPC
    561 	| LZPC
    562 	;
    563 
    564 /* ',' zapc when it may be omitted.  */
    565 
    566 optczapc:
    567 	  /* empty */
    568 		{
    569 		  $$ = ZADDR0;
    570 		}
    571 	| ',' zapc
    572 		{
    573 		  $$ = $2;
    574 		}
    575 	;
    576 
    577 /* ',' EXPR when it may be omitted.  */
    578 
    579 optcexpr:
    580 	  /* empty */
    581 		{
    582 		  $$.exp.X_op = O_absent;
    583 		  $$.size = SIZE_UNSPEC;
    584 		}
    585 	| ',' EXPR
    586 		{
    587 		  $$ = $2;
    588 		}
    589 	;
    590 
    591 /* EXPR ',' when it may be omitted.  */
    592 
    593 optexprc:
    594 	  /* empty */
    595 		{
    596 		  $$.exp.X_op = O_absent;
    597 		  $$.size = SIZE_UNSPEC;
    598 		}
    599 	| EXPR ','
    600 		{
    601 		  $$ = $1;
    602 		}
    603 	;
    604 
    605 /* A register list for the movem instruction.  */
    606 
    607 reglist:
    608 	  reglistpair
    609 	| reglistpair '/' ireglist
    610 		{
    611 		  $$ = $1 | $3;
    612 		}
    613 	| reglistreg '/' ireglist
    614 		{
    615 		  $$ = (1 << $1) | $3;
    616 		}
    617 	;
    618 
    619 /* We use ireglist when we know we are looking at a reglist, and we
    620    can safely reduce a simple register to reglistreg.  If we permitted
    621    reglist to reduce to reglistreg, it would be ambiguous whether a
    622    plain register were a DREG/AREG/FPREG or a REGLST.  */
    623 
    624 ireglist:
    625 	  reglistreg
    626 		{
    627 		  $$ = 1 << $1;
    628 		}
    629 	| reglistpair
    630 	| reglistpair '/' ireglist
    631 		{
    632 		  $$ = $1 | $3;
    633 		}
    634 	| reglistreg '/' ireglist
    635 		{
    636 		  $$ = (1 << $1) | $3;
    637 		}
    638 	;
    639 
    640 reglistpair:
    641 	  reglistreg '-' reglistreg
    642 		{
    643 		  if ($1 <= $3)
    644 		    $$ = (1 << ($3 + 1)) - 1 - ((1 << $1) - 1);
    645 		  else
    646 		    $$ = (1 << ($1 + 1)) - 1 - ((1 << $3) - 1);
    647 		}
    648 	;
    649 
    650 reglistreg:
    651 	  DR
    652 		{
    653 		  $$ = $1 - DATA0;
    654 		}
    655 	| AR
    656 		{
    657 		  $$ = $1 - ADDR0 + 8;
    658 		}
    659 	| FPR
    660 		{
    661 		  $$ = $1 - FP0 + 16;
    662 		}
    663 	| FPCR
    664 		{
    665 		  if ($1 == FPI)
    666 		    $$ = 24;
    667 		  else if ($1 == FPS)
    668 		    $$ = 25;
    669 		  else
    670 		    $$ = 26;
    671 		}
    672 	;
    673 
    674 %%
    675 
    676 /* The string to parse is stored here, and modified by yylex.  */
    677 
    678 static char *str;
    679 
    680 /* The original string pointer.  */
    681 
    682 static char *strorig;
    683 
    684 /* If *CCP could be a register, return the register number and advance
    685    *CCP.  Otherwise don't change *CCP, and return 0.  */
    686 
    687 static enum m68k_register
    688 m68k_reg_parse (char **ccp)
    689 {
    690   char *start = *ccp;
    691   char c;
    692   char *p;
    693   symbolS *symbolp;
    694 
    695   if (flag_reg_prefix_optional)
    696     {
    697       if (*start == REGISTER_PREFIX)
    698 	start++;
    699       p = start;
    700     }
    701   else
    702     {
    703       if (*start != REGISTER_PREFIX)
    704 	return 0;
    705       p = start + 1;
    706     }
    707 
    708   if (! is_name_beginner (*p))
    709     return 0;
    710 
    711   p++;
    712   while (is_part_of_name (*p) && *p != '.' && *p != ':' && *p != '*')
    713     p++;
    714 
    715   c = *p;
    716   *p = 0;
    717   symbolp = symbol_find (start);
    718   *p = c;
    719 
    720   if (symbolp != NULL && S_GET_SEGMENT (symbolp) == reg_section)
    721     {
    722       *ccp = p;
    723       return S_GET_VALUE (symbolp);
    724     }
    725 
    726   /* In MRI mode, something like foo.bar can be equated to a register
    727      name.  */
    728   while (flag_mri && c == '.')
    729     {
    730       ++p;
    731       while (is_part_of_name (*p) && *p != '.' && *p != ':' && *p != '*')
    732 	p++;
    733       c = *p;
    734       *p = '\0';
    735       symbolp = symbol_find (start);
    736       *p = c;
    737       if (symbolp != NULL && S_GET_SEGMENT (symbolp) == reg_section)
    738 	{
    739 	  *ccp = p;
    740 	  return S_GET_VALUE (symbolp);
    741 	}
    742     }
    743 
    744   return 0;
    745 }
    746 
    747 /* The lexer.  */
    748 
    749 static int
    750 yylex (void)
    751 {
    752   enum m68k_register reg;
    753   char *s;
    754   int parens;
    755   int c = 0;
    756   int tail = 0;
    757   char *hold;
    758 
    759   if (*str == ' ')
    760     ++str;
    761 
    762   if (*str == '\0')
    763     return 0;
    764 
    765   /* Various special characters are just returned directly.  */
    766   switch (*str)
    767     {
    768     case '@':
    769       /* In MRI mode, this can be the start of an octal number.  */
    770       if (flag_mri)
    771 	{
    772 	  if (ISDIGIT (str[1])
    773 	      || ((str[1] == '+' || str[1] == '-')
    774 		  && ISDIGIT (str[2])))
    775 	    break;
    776 	}
    777       /* Fall through.  */
    778     case '#':
    779     case '&':
    780     case ',':
    781     case ')':
    782     case '/':
    783     case '[':
    784     case ']':
    785     case '<':
    786     case '>':
    787       return *str++;
    788     case '+':
    789       /* It so happens that a '+' can only appear at the end of an
    790 	 operand, or if it is trailed by an '&'(see mac load insn).
    791 	 If it appears anywhere else, it must be a unary.  */
    792       if (str[1] == '\0' || (str[1] == '&' && str[2] == '\0'))
    793 	return *str++;
    794       break;
    795     case '-':
    796       /* A '-' can only appear in -(ar), rn-rn, or ar@-.  If it
    797          appears anywhere else, it must be a unary minus on an
    798          expression, unless it it trailed by a '&'(see mac load insn).  */
    799       if (str[1] == '\0' || (str[1] == '&' && str[2] == '\0'))
    800 	return *str++;
    801       s = str + 1;
    802       if (*s == '(')
    803 	++s;
    804       if (m68k_reg_parse (&s) != 0)
    805 	return *str++;
    806       break;
    807     case '(':
    808       /* A '(' can only appear in `(reg)', `(expr,...', `([', `@(', or
    809          `)('.  If it appears anywhere else, it must be starting an
    810          expression.  */
    811       if (str[1] == '['
    812 	  || (str > strorig
    813 	      && (str[-1] == '@'
    814 		  || str[-1] == ')')))
    815 	return *str++;
    816       s = str + 1;
    817       if (m68k_reg_parse (&s) != 0)
    818 	return *str++;
    819       /* Check for the case of '(expr,...' by scanning ahead.  If we
    820          find a comma outside of balanced parentheses, we return '('.
    821          If we find an unbalanced right parenthesis, then presumably
    822          the '(' really starts an expression.  */
    823       parens = 0;
    824       for (s = str + 1; *s != '\0'; s++)
    825 	{
    826 	  if (*s == '(')
    827 	    ++parens;
    828 	  else if (*s == ')')
    829 	    {
    830 	      if (parens == 0)
    831 		break;
    832 	      --parens;
    833 	    }
    834 	  else if (*s == ',' && parens == 0)
    835 	    {
    836 	      /* A comma can not normally appear in an expression, so
    837 		 this is a case of '(expr,...'.  */
    838 	      return *str++;
    839 	    }
    840 	}
    841     }
    842 
    843   /* See if it's a register.  */
    844 
    845   reg = m68k_reg_parse (&str);
    846   if (reg != 0)
    847     {
    848       int ret;
    849 
    850       yylval.reg = reg;
    851 
    852       if (reg >= DATA0 && reg <= DATA7)
    853 	ret = DR;
    854       else if (reg >= ADDR0 && reg <= ADDR7)
    855 	ret = AR;
    856       else if (reg >= FP0 && reg <= FP7)
    857 	return FPR;
    858       else if (reg == FPI
    859 	       || reg == FPS
    860 	       || reg == FPC)
    861 	return FPCR;
    862       else if (reg == PC)
    863 	return LPC;
    864       else if (reg >= ZDATA0 && reg <= ZDATA7)
    865 	ret = ZDR;
    866       else if (reg >= ZADDR0 && reg <= ZADDR7)
    867 	ret = ZAR;
    868       else if (reg == ZPC)
    869 	return LZPC;
    870       else
    871 	return CREG;
    872 
    873       /* If we get here, we have a data or address register.  We
    874 	 must check for a size or scale; if we find one, we must
    875 	 return INDEXREG.  */
    876 
    877       s = str;
    878 
    879       if (*s != '.' && *s != ':' && *s != '*')
    880 	return ret;
    881 
    882       yylval.indexreg.reg = reg;
    883 
    884       if (*s != '.' && *s != ':')
    885 	yylval.indexreg.size = SIZE_UNSPEC;
    886       else
    887 	{
    888 	  ++s;
    889 	  switch (*s)
    890 	    {
    891 	    case 'w':
    892 	    case 'W':
    893 	      yylval.indexreg.size = SIZE_WORD;
    894 	      ++s;
    895 	      break;
    896 	    case 'l':
    897 	    case 'L':
    898 	      yylval.indexreg.size = SIZE_LONG;
    899 	      ++s;
    900 	      break;
    901 	    default:
    902 	      yyerror (_("illegal size specification"));
    903 	      yylval.indexreg.size = SIZE_UNSPEC;
    904 	      break;
    905 	    }
    906 	}
    907 
    908       yylval.indexreg.scale = 1;
    909 
    910       if (*s == '*' || *s == ':')
    911 	{
    912 	  expressionS scale;
    913 
    914 	  ++s;
    915 
    916 	  hold = input_line_pointer;
    917 	  input_line_pointer = s;
    918 	  expression (&scale);
    919 	  s = input_line_pointer;
    920 	  input_line_pointer = hold;
    921 
    922 	  if (scale.X_op != O_constant)
    923 	    yyerror (_("scale specification must resolve to a number"));
    924 	  else
    925 	    {
    926 	      switch (scale.X_add_number)
    927 		{
    928 		case 1:
    929 		case 2:
    930 		case 4:
    931 		case 8:
    932 		  yylval.indexreg.scale = scale.X_add_number;
    933 		  break;
    934 		default:
    935 		  yyerror (_("invalid scale value"));
    936 		  break;
    937 		}
    938 	    }
    939 	}
    940 
    941       str = s;
    942 
    943       return INDEXREG;
    944     }
    945 
    946   /* It must be an expression.  Before we call expression, we need to
    947      look ahead to see if there is a size specification.  We must do
    948      that first, because otherwise foo.l will be treated as the symbol
    949      foo.l, rather than as the symbol foo with a long size
    950      specification.  The grammar requires that all expressions end at
    951      the end of the operand, or with ',', '(', ']', ')'.  */
    952 
    953   parens = 0;
    954   for (s = str; *s != '\0'; s++)
    955     {
    956       if (*s == '(')
    957 	{
    958 	  if (parens == 0
    959 	      && s > str
    960 	      && (s[-1] == ')' || ISALNUM (s[-1])))
    961 	    break;
    962 	  ++parens;
    963 	}
    964       else if (*s == ')')
    965 	{
    966 	  if (parens == 0)
    967 	    break;
    968 	  --parens;
    969 	}
    970       else if (parens == 0
    971 	       && (*s == ',' || *s == ']'))
    972 	break;
    973     }
    974 
    975   yylval.exp.size = SIZE_UNSPEC;
    976   if (s <= str + 2
    977       || (s[-2] != '.' && s[-2] != ':'))
    978     tail = 0;
    979   else
    980     {
    981       switch (s[-1])
    982 	{
    983 	case 's':
    984 	case 'S':
    985 	case 'b':
    986 	case 'B':
    987 	  yylval.exp.size = SIZE_BYTE;
    988 	  break;
    989 	case 'w':
    990 	case 'W':
    991 	  yylval.exp.size = SIZE_WORD;
    992 	  break;
    993 	case 'l':
    994 	case 'L':
    995 	  yylval.exp.size = SIZE_LONG;
    996 	  break;
    997 	default:
    998 	  break;
    999 	}
   1000       if (yylval.exp.size != SIZE_UNSPEC)
   1001 	tail = 2;
   1002     }
   1003 
   1004 #ifdef OBJ_ELF
   1005   {
   1006     /* Look for @PLTPC, etc.  */
   1007     char *cp;
   1008 
   1009     yylval.exp.pic_reloc = pic_none;
   1010     cp = s - tail;
   1011     if (cp - 7 > str && cp[-7] == '@')
   1012       {
   1013 	if (strncmp (cp - 7, "@TLSLDM", 7) == 0)
   1014 	  {
   1015 	    yylval.exp.pic_reloc = pic_tls_ldm;
   1016 	    tail += 7;
   1017 	  }
   1018 	else if (strncmp (cp - 7, "@TLSLDO", 7) == 0)
   1019 	  {
   1020 	    yylval.exp.pic_reloc = pic_tls_ldo;
   1021 	    tail += 7;
   1022 	  }
   1023       }
   1024     else if (cp - 6 > str && cp[-6] == '@')
   1025       {
   1026 	if (strncmp (cp - 6, "@PLTPC", 6) == 0)
   1027 	  {
   1028 	    yylval.exp.pic_reloc = pic_plt_pcrel;
   1029 	    tail += 6;
   1030 	  }
   1031 	else if (strncmp (cp - 6, "@GOTPC", 6) == 0)
   1032 	  {
   1033 	    yylval.exp.pic_reloc = pic_got_pcrel;
   1034 	    tail += 6;
   1035 	  }
   1036 	else if (strncmp (cp - 6, "@TLSGD", 6) == 0)
   1037 	  {
   1038 	    yylval.exp.pic_reloc = pic_tls_gd;
   1039 	    tail += 6;
   1040 	  }
   1041 	else if (strncmp (cp - 6, "@TLSIE", 6) == 0)
   1042 	  {
   1043 	    yylval.exp.pic_reloc = pic_tls_ie;
   1044 	    tail += 6;
   1045 	  }
   1046 	else if (strncmp (cp - 6, "@TLSLE", 6) == 0)
   1047 	  {
   1048 	    yylval.exp.pic_reloc = pic_tls_le;
   1049 	    tail += 6;
   1050 	  }
   1051       }
   1052     else if (cp - 4 > str && cp[-4] == '@')
   1053       {
   1054 	if (strncmp (cp - 4, "@PLT", 4) == 0)
   1055 	  {
   1056 	    yylval.exp.pic_reloc = pic_plt_off;
   1057 	    tail += 4;
   1058 	  }
   1059 	else if (strncmp (cp - 4, "@GOT", 4) == 0)
   1060 	  {
   1061 	    yylval.exp.pic_reloc = pic_got_off;
   1062 	    tail += 4;
   1063 	  }
   1064       }
   1065   }
   1066 #endif
   1067 
   1068   if (tail != 0)
   1069     {
   1070       c = s[-tail];
   1071       s[-tail] = 0;
   1072     }
   1073 
   1074   hold = input_line_pointer;
   1075   input_line_pointer = str;
   1076   expression (&yylval.exp.exp);
   1077   str = input_line_pointer;
   1078   input_line_pointer = hold;
   1079 
   1080   if (tail != 0)
   1081     {
   1082       s[-tail] = c;
   1083       str = s;
   1084     }
   1085 
   1086   return EXPR;
   1087 }
   1088 
   1089 /* Parse an m68k operand.  This is the only function which is called
   1090    from outside this file.  */
   1091 
   1092 int
   1093 m68k_ip_op (char *s, struct m68k_op *oparg)
   1094 {
   1095   memset (oparg, 0, sizeof *oparg);
   1096   oparg->error = NULL;
   1097   oparg->index.reg = ZDATA0;
   1098   oparg->index.scale = 1;
   1099   oparg->disp.exp.X_op = O_absent;
   1100   oparg->odisp.exp.X_op = O_absent;
   1101 
   1102   str = strorig = s;
   1103   op = oparg;
   1104 
   1105   return yyparse ();
   1106 }
   1107 
   1108 /* The error handler.  */
   1109 
   1110 static void
   1111 yyerror (const char *s)
   1112 {
   1113   op->error = s;
   1114 }
   1115