+%option noyywrap
+
/* bfin-lex.l ADI Blackfin lexer
- Copyright 2005
- Free Software Foundation, Inc.
+ Copyright (C) 2005-2019 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
+ the Free Software Foundation; either version 3, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
02110-1301, USA. */
%{
-#include <stdlib.h>
-#include <string.h>
+#include "as.h"
#include "bfin-defs.h"
#include "bfin-parse.h"
-#include "as.h"
static long parse_int (char **end);
static int parse_halfreg (Register *r, int cl, char *hr);
and <INITIAL> would match some keyword rules only with
initial. */
%s KEYWORD
+%s FLAGS
%%
[sS][fF][tT][rR][eE][sS][eE][tT] _REG.regno = REG_sftreset; return REG;
[hH][wW][eE][rR][rR][cC][aA][uU][sS][eE] _REG.regno = REG_hwerrcause; return REG;
[eE][xX][cC][aA][uU][sS][eE] _REG.regno = REG_excause; return REG;
[eE][mM][uU][cC][aA][uU][sS][eE] _REG.regno = REG_emucause; return REG;
-[zZ] return Z;
-[xX] return X;
+<FLAGS>[zZ] return Z;
+<FLAGS>[xX] return X;
[wW]32 yylval.value = M_W32; return MMOD;
[wW] return W;
[vV][iI][tT]_[mM][aA][xX] return VIT_MAX;
[tT][hH] return TH;
[tT][fF][uU] yylval.value = M_TFU; return MMOD;
[tT][eE][sS][tT][sS][eE][tT] return TESTSET;
-[tT] yylval.value = M_T; return MMOD;
-[sS] return S;
+<FLAGS>[tT] yylval.value = M_T; return MMOD;
+<FLAGS>[sS] return S;
[sS][yY][sS][cC][fF][gG] _REG.regno = REG_SYSCFG; return REG;
[sS][tT][iI] return STI;
[sS][sS][yY][nN][cC] return SSYNC;
-[sS][pP]"."[lL] _REG.regno = REG_SP; return HALF_REG;
-[sS][pP]"."[hH] _REG.regno = REG_SP | F_REG_HIGH; return HALF_REG;
+[sS][pP]"."[lL] _REG.regno = REG_SP; _REG.flags = F_REG_LOW; return HALF_REG;
+[sS][pP]"."[hH] _REG.regno = REG_SP; _REG.flags = F_REG_HIGH; return HALF_REG;
[sS][pP] _REG.regno = REG_SP; return REG;
[sS][iI][gG][nN][bB][iI][tT][sS] return SIGNBITS;
[sS][iI][gG][nN] return SIGN;
[mM][0-3]"."[lLhH] return parse_halfreg (&yylval.reg, T_REG_M, yytext);
[mM][0-3] return parse_reg (&yylval.reg, T_REG_M, yytext);
-[mM] return M;
+<FLAGS>[mM] return M;
[lL][tT] return LT;
[lL][sS][hH][iI][fF][tT] return LSHIFT;
[lL][sS][eE][tT][uU][pP] return LSETUP;
[gG][eE] return GE;
[fF][uU] yylval.value = M_FU; return MMOD;
[fF][pP] _REG.regno = REG_FP; return REG;
-[fF][pP]"."[lL] _REG.regno = REG_FP; return HALF_REG;
-[fF][pP]"."[hH] _REG.regno = REG_FP | F_REG_HIGH; return HALF_REG;
+[fF][pP]"."[lL] _REG.regno = REG_FP; _REG.flags = F_REG_LOW; return HALF_REG;
+[fF][pP]"."[hH] _REG.regno = REG_FP; _REG.flags = F_REG_HIGH; return HALF_REG;
[eE][xX][tT][rR][aA][cC][tT] return EXTRACT;
[eE][xX][pP][aA][dD][jJ] return EXPADJ;
[bB][yY][tT][eE][oO][pP]16[mM] return BYTEOP16M;
[bB][yY][tT][eE][oO][pP]16[pP] return BYTEOP16P;
[bB][yY][tT][eE][oO][pP]3[pP] return BYTEOP3P;
-[bB][yY][tT][eE][oO][pP]2[mM] return BYTEOP2M;
[bB][yY][tT][eE][oO][pP]2[pP] return BYTEOP2P;
[bB][yY][tT][eE][oO][pP]1[pP] return BYTEOP1P;
[bB][yY] return BY;
[bB] return B;
[aA][zZ] _REG.regno = S_AZ; return STATUS_REG;
[aA][nN] _REG.regno = S_AN; return STATUS_REG;
+[aA][cC]0_[cC][oO][pP][yY] _REG.regno = S_AC0_COPY; return STATUS_REG;
+[vV]_[cC][oO][pP][yY] _REG.regno = S_V_COPY; return STATUS_REG;
[aA][qQ] _REG.regno = S_AQ; return STATUS_REG;
[aA][cC]0 _REG.regno = S_AC0; return STATUS_REG;
[aA][cC]1 _REG.regno = S_AC1; return STATUS_REG;
[aA][vV]0[sS] _REG.regno = S_AV0S; return STATUS_REG;
[aA][vV]1 _REG.regno = S_AV1; return STATUS_REG;
[aA][vV]1[sS] _REG.regno = S_AV1S; return STATUS_REG;
-[vV] _REG.regno = S_V; return STATUS_REG;
[vV][sS] _REG.regno = S_VS; return STATUS_REG;
+[rR][nN][dD]_[mM][oO][dD] _REG.regno = S_RND_MOD; return STATUS_REG;
[aA][sS][tT][aA][tT] _REG.regno = REG_ASTAT; return REG;
[aA]1"."[hH] return A_ONE_DOT_H;
[aA]0"."[hH] return A_ZERO_DOT_H;
[aA][bB][sS] return ABS;
-abort return ABORT;
+[aA][bB][oO][rR][tT] return ABORT;
[aA]1"."[xX] _REG.regno = REG_A1x; return REG;
[aA]1"."[wW] _REG.regno = REG_A1w; return REG;
[aA]1 _REG.regno = REG_A1; return REG_A_DOUBLE_ONE;
[aA]0"."[wW] _REG.regno = REG_A0w; return REG;
[aA]0 _REG.regno = REG_A0; return REG_A_DOUBLE_ZERO;
[Gg][Oo][Tt] return GOT;
+[Gg][Oo][Tt]"17"[Mm]"4" return GOT17M4;
+[Ff][Uu][Nn][Cc][Dd][Ee][Ss][Cc]"_"[Gg][Oo][Tt]"17"[Mm]"4" return FUNCDESC_GOT17M4;
[Pp][Ll][Tt][Pp][Cc] return PLTPC;
"<<=" return _LESS_LESS_ASSIGN;
"<<" return LESS_LESS;
"<" return LESS_THAN;
-"(" return LPAREN;
-")" return RPAREN;
+"(" BEGIN(FLAGS); return LPAREN;
+")" BEGIN(INITIAL); return RPAREN;
":" return COLON;
"/" return SLASH;
"-=" return _MINUS_ASSIGN;
<KEYWORD>[iI][fF][lL][uU][sS][hH] return IFLUSH;
<KEYWORD>[fF][lL][uU][sS][hH][iI][nN][vV] return FLUSHINV;
<KEYWORD>[fF][lL][uU][sS][hH] return FLUSH;
-([0-9]+)|(0[xX][0-9a-fA-F]+)|([bhfodBHOFD]#[0-9a-fA-F]+)|(0.[0-9]+) {
+([0-9]+)|(0[xX][0-9a-fA-F]+)|([bhfodBHOFD]#[0-9a-fA-F]+)|(0"."[0-9]+) {
yylval.value = parse_int (&yytext);
return NUMBER;
}
-[A-Za-z_$.][A-Za-z0-9_$.]* {
+[[:alpha:]\x80-\xff_$.][[:alnum:]\x80-\xff_$.]* {
yylval.symbol = symbol_find_or_make (yytext);
symbol_mark_used (yylval.symbol);
- return SYMBOL;
+ return SYMBOL;
}
[0-9][bfBF] {
char *name;
if ((yylval.symbol != NULL)
&& (S_IS_DEFINED (yylval.symbol)))
return SYMBOL;
- as_bad ("backward reference to unknown label %d:",
- (int) (ref[0] - '0'));
+ as_bad ("backward reference to unknown label %d:",
+ (int) (ref[0] - '0'));
}
else if (ref[1] == 'f' || ref[1] == 'F')
{
yylval.symbol = symbol_find_or_make (name);
/* We have no need to check symbol properties. */
return SYMBOL;
- }
- }
+ }
+ }
[ \t\n] ;
"/*".*"*/" ;
. return yytext[0];
int shiftvalue = 0;
char * char_bag;
long value = 0;
- char c;
char *arg = *end;
while (*arg && *arg == ' ')
fmt = 'd';
break;
- case '0': /* Accept different formated integers hex octal and binary. */
+ case '0': /* Accept different formatted integers hex octal and binary. */
{
- c = *++arg;
+ char c = *++arg;
arg++;
if (c == 'x' || c == 'X') /* Hex input. */
fmt = 'h';
break;
/* The assembler allows for fractional constants to be created
- by either the 0.xxxx or the f#xxxx format
+ by either the 0.xxxx or the f#xxxx format
i.e. 0.5 would result in 0x4000
{
while (1)
{
- int c;
+ char c;
c = *arg++;
if (c >= '0' && c <= '9')
value = (value * 10) + (c - '0');
{
char c;
c = *arg++;
- if (c == 0 || !index (char_bag, c))
+ if (c == 0 || !strchr (char_bag, c))
{
not_done = 0;
*--arg = c;
static int parse_reg (Register *r, int cl, char *rt)
{
r->regno = cl | (rt[1] - '0');
+ r->flags = F_REG_NONE;
return REG;
}
case 'l':
case 'L':
+ r->flags = F_REG_LOW;
break;
case 'h':
case 'H':
- r->regno |= F_REG_HIGH;
+ r->flags = F_REG_HIGH;
break;
}
/* Our start state is KEYWORD as we have
command keywords such as PREFETCH. */
-void
+void
set_start_state (void)
{
BEGIN KEYWORD;
}
-
-
-#ifndef yywrap
-int
-yywrap ()
-{
- return 1;
-}
-#endif