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