]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - gas/bfin-parse.c
Merge commit 'upstream/2.20'
[msp430-binutils.git] / gas / bfin-parse.c
index 5305e0713bede32225ca0c5f8b424fc3f1697b9f..c9ccad5ed7684bda0b529eec1857b333fefd2b0b 100644 (file)
 #include "as.h"
 #include <obstack.h>
 
-#include "bfin-aux.h"  // opcode generating auxiliaries
+#include "bfin-aux.h"  /* Opcode generating auxiliaries.  */
 #include "libbfd.h"
 #include "elf/common.h"
 #include "elf/bfin.h"
@@ -570,13 +570,13 @@ int yyerror (char *msg);
 void error (char *format, ...)
 {
     va_list ap;
-    char buffer[2000];
+    static char buffer[2000];
     
     va_start (ap, format);
     vsprintf (buffer, format, ap);
     va_end (ap);
 
-    as_bad (buffer);
+    as_bad ("%s", buffer);
 }
 
 int
@@ -623,12 +623,6 @@ extern int yylex (void);
 
 /* Auxiliary functions.  */
 
-static void
-neg_value (Expr_Node *expr)
-{
-  expr->value.i_value = -expr->value.i_value;
-}
-
 static int
 valid_dreg_pair (Register *reg1, Expr_Node *reg2)
 {
@@ -665,6 +659,29 @@ check_multiply_halfregs (Macfunc *aa, Macfunc *ab)
 }
 
 
+/* Check mac option.  */
+
+static int
+check_macfunc_option (Macfunc *a, Opt_mode *opt)
+{
+  /* Default option is always valid.  */
+  if (opt->mod == 0)
+    return 0;
+
+  if ((a->w == 1 && a->P == 1
+       && opt->mod != M_FU && opt->mod != M_IS && opt->mod != M_IU
+       && opt->mod != M_S2RND && opt->mod != M_ISS2)
+      || (a->w == 1 && a->P == 0
+         && opt->mod != M_FU && opt->mod != M_IS && opt->mod != M_IU
+         && opt->mod != M_T && opt->mod != M_TFU && opt->mod != M_S2RND
+         && opt->mod != M_ISS2 && opt->mod != M_IH)
+      || (a->w == 0 && a->P == 0
+         && opt->mod != M_FU && opt->mod != M_IS && opt->mod != M_W32))
+    return -1;
+
+  return 0;
+}
+
 /* Check (vector) mac funcs and ops.  */
 
 static int
@@ -675,6 +692,11 @@ check_macfuncs (Macfunc *aa, Opt_mode *opa,
   Macfunc mtmp;
   Opt_mode otmp;
 
+  /* The option mode should be put at the end of the second instruction
+     of the vector except M, which should follow MAC1 instruction.  */
+  if (opa->mod != 0)
+    return yyerror ("Bad opt mode");
+
   /* If a0macfunc comes before a1macfunc, swap them.  */
        
   if (aa->n == 0)
@@ -692,16 +714,14 @@ check_macfuncs (Macfunc *aa, Opt_mode *opa,
     {
       if (opb->MM != 0)
        return yyerror ("(M) not allowed with A0MAC");
-      if (opa->mod != 0)
-       return yyerror ("Bad opt mode");
       if (ab->n != 0)
        return yyerror ("Vector AxMACs can't be same");
     }
 
   /*  If both ops are one of 0, 1, or 2, we have multiply_halfregs in both
   assignment_or_macfuncs.  */
-  if (aa->op < 3 && aa->op >=0
-      && ab->op < 3 && ab->op >= 0)
+  if ((aa->op == 0 || aa->op == 1 || aa->op == 2)
+      && (ab->op == 0 || ab->op == 1 || ab->op == 2))
     {
       if (check_multiply_halfregs (aa, ab) < 0)
        return -1;
@@ -722,20 +742,18 @@ check_macfuncs (Macfunc *aa, Opt_mode *opa,
       if (aa->w && (aa->dst.regno - ab->dst.regno != 1))
        return yyerror ("Destination Dregs must differ by one");
     }
-  /* We assign to full regs, thus obey even/odd rules.  */
-  else if ((aa->w && aa->P && IS_EVEN (aa->dst)) 
-          || (ab->w && ab->P && !IS_EVEN (ab->dst)))
-    return yyerror ("Even/Odd register assignment mismatch");
-  /* We assign to half regs, thus obey hi/low rules.  */
-  else if ( (aa->w && !aa->P && !IS_H (aa->dst)) 
-           || (ab->w && !aa->P && IS_H (ab->dst)))
-    return yyerror ("High/Low register assignment mismatch");
+
+  /* Make sure mod flags get ORed, too.  */
+  opb->mod |= opa->mod;
+
+  /* Check option.  */
+  if (check_macfunc_option (aa, opb) < 0
+      && check_macfunc_option (ab, opb) < 0)
+    return yyerror ("bad option");
 
   /* Make sure first macfunc has got both P flags ORed.  */
   aa->P |= ab->P;
 
-  /* Make sure mod flags get ORed, too.  */
-  opb->mod |= opa->mod;
   return 0;    
 }
 
@@ -762,6 +780,29 @@ is_group2 (INSTR_T x)
   return 0;
 }
 
+static INSTR_T
+gen_multi_instr_1 (INSTR_T dsp32, INSTR_T dsp16_grp1, INSTR_T dsp16_grp2)
+{
+  int mask1 = dsp32 ? insn_regmask (dsp32->value, dsp32->next->value) : 0;
+  int mask2 = dsp16_grp1 ? insn_regmask (dsp16_grp1->value, 0) : 0;
+  int mask3 = dsp16_grp2 ? insn_regmask (dsp16_grp2->value, 0) : 0;
+
+  if ((mask1 & mask2) || (mask1 & mask3) || (mask2 & mask3))
+    yyerror ("resource conflict in multi-issue instruction");
+
+  /* Anomaly 05000074 */
+  if (ENABLE_AC_05000074
+      && dsp32 != NULL && dsp16_grp1 != NULL
+      && (dsp32->value & 0xf780) == 0xc680
+      && ((dsp16_grp1->value & 0xfe40) == 0x9240
+         || (dsp16_grp1->value & 0xfe08) == 0xba08
+         || (dsp16_grp1->value & 0xfc00) == 0xbc00))
+    yyerror ("anomaly 05000074 - Multi-Issue Instruction with \
+dsp32shiftimm in slot1 and P-reg Store in slot2 Not Supported");
+
+  return bfin_gen_multi_instr (dsp32, dsp16_grp1, dsp16_grp2);
+}
+
 
 
 /* Enabling traces.  */
@@ -784,7 +825,7 @@ is_group2 (INSTR_T x)
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 366 "bfin-parse.y"
+#line 407 "bfin-parse.y"
 {
   INSTR_T instr;
   Expr_Node *expr;
@@ -796,8 +837,8 @@ typedef union YYSTYPE
   struct { int r0; } r0;
   Opt_mode mod;
 }
-/* Line 187 of yacc.c.  */
-#line 801 "bfin-parse.c"
+/* Line 193 of yacc.c.  */
+#line 842 "bfin-parse.c"
        YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -810,7 +851,7 @@ typedef union YYSTYPE
 
 
 /* Line 216 of yacc.c.  */
-#line 814 "bfin-parse.c"
+#line 855 "bfin-parse.c"
 
 #ifdef short
 # undef short
@@ -860,7 +901,7 @@ typedef short int yytype_int16;
 #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
 
 #ifndef YY_
-# if YYENABLE_NLS
+# if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
 #   define YY_(msgid) dgettext ("bison-runtime", msgid)
@@ -1023,18 +1064,18 @@ union yyalloc
 #endif
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  145
+#define YYFINAL  150
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1278
+#define YYLAST   1284
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  175
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  47
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  348
+#define YYNRULES  350
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  1021
+#define YYNSTATES  1026
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -1105,32 +1146,33 @@ static const yytype_uint16 yyprhs[] =
      429,   434,   438,   442,   446,   458,   470,   480,   486,   492,
      502,   508,   514,   521,   528,   534,   540,   546,   553,   560,
      566,   568,   572,   576,   580,   584,   589,   594,   604,   614,
-     620,   628,   633,   640,   646,   653,   661,   671,   680,   689,
-     701,   711,   716,   722,   729,   737,   744,   749,   756,   762,
-     769,   776,   781,   790,   801,   812,   825,   831,   838,   844,
-     851,   856,   861,   866,   874,   884,   894,   904,   911,   918,
-     925,   934,   943,   950,   956,   962,   971,   976,   984,   986,
-     988,   990,   992,   994,   996,   998,  1000,  1002,  1004,  1007,
-    1010,  1015,  1020,  1027,  1034,  1037,  1040,  1045,  1048,  1051,
-    1054,  1057,  1060,  1063,  1070,  1077,  1083,  1088,  1092,  1096,
-    1100,  1104,  1108,  1112,  1117,  1120,  1125,  1128,  1133,  1136,
-    1141,  1144,  1152,  1161,  1170,  1178,  1186,  1194,  1204,  1212,
-    1221,  1231,  1240,  1247,  1255,  1264,  1274,  1283,  1291,  1299,
-    1306,  1318,  1326,  1338,  1346,  1350,  1353,  1355,  1363,  1373,
-    1385,  1389,  1395,  1403,  1405,  1408,  1411,  1416,  1418,  1425,
-    1432,  1439,  1441,  1443,  1444,  1450,  1456,  1460,  1464,  1468,
-    1472,  1473,  1475,  1477,  1479,  1481,  1483,  1484,  1488,  1489,
-    1493,  1497,  1498,  1502,  1506,  1512,  1518,  1519,  1523,  1527,
-    1528,  1532,  1536,  1537,  1541,  1545,  1549,  1555,  1561,  1562,
-    1566,  1567,  1571,  1573,  1575,  1577,  1579,  1580,  1584,  1588,
-    1592,  1598,  1604,  1606,  1608,  1610,  1611,  1615,  1616,  1620,
-    1625,  1630,  1632,  1634,  1636,  1638,  1640,  1642,  1644,  1646,
-    1650,  1654,  1658,  1662,  1668,  1674,  1680,  1686,  1690,  1694,
-    1700,  1706,  1707,  1709,  1711,  1714,  1717,  1720,  1724,  1726,
-    1732,  1738,  1742,  1745,  1748,  1751,  1755,  1757,  1759,  1761,
-    1763,  1767,  1771,  1775,  1779,  1781,  1783,  1785,  1787,  1791,
-    1793,  1795,  1799,  1801,  1803,  1807,  1810,  1813,  1815,  1819,
-    1823,  1827,  1831,  1835,  1839,  1843,  1847,  1851,  1855
+     620,   628,   633,   640,   647,   655,   665,   674,   683,   695,
+     705,   710,   716,   723,   731,   738,   743,   750,   756,   763,
+     770,   775,   784,   795,   806,   819,   825,   832,   838,   845,
+     850,   855,   860,   868,   878,   888,   898,   905,   912,   919,
+     928,   937,   944,   950,   956,   965,   970,   978,   980,   982,
+     984,   986,   988,   990,   992,   994,   996,   998,  1001,  1004,
+    1009,  1014,  1021,  1028,  1031,  1034,  1039,  1042,  1045,  1048,
+    1051,  1054,  1057,  1064,  1071,  1077,  1082,  1086,  1090,  1094,
+    1098,  1102,  1106,  1111,  1114,  1119,  1122,  1127,  1130,  1135,
+    1138,  1146,  1155,  1164,  1172,  1180,  1188,  1198,  1206,  1215,
+    1225,  1234,  1241,  1249,  1258,  1268,  1277,  1285,  1293,  1300,
+    1312,  1320,  1332,  1340,  1344,  1347,  1349,  1357,  1367,  1379,
+    1383,  1389,  1397,  1400,  1403,  1405,  1408,  1411,  1416,  1418,
+    1420,  1427,  1434,  1441,  1443,  1445,  1446,  1452,  1458,  1462,
+    1466,  1470,  1474,  1475,  1477,  1479,  1481,  1483,  1485,  1486,
+    1490,  1491,  1495,  1499,  1500,  1504,  1508,  1514,  1520,  1521,
+    1525,  1529,  1530,  1534,  1538,  1539,  1543,  1547,  1551,  1557,
+    1563,  1564,  1568,  1569,  1573,  1575,  1577,  1579,  1581,  1582,
+    1586,  1590,  1594,  1600,  1606,  1608,  1610,  1612,  1613,  1617,
+    1618,  1622,  1627,  1632,  1634,  1636,  1638,  1640,  1642,  1644,
+    1646,  1648,  1652,  1656,  1660,  1664,  1670,  1676,  1682,  1688,
+    1692,  1696,  1702,  1708,  1709,  1711,  1713,  1716,  1719,  1722,
+    1726,  1728,  1734,  1740,  1744,  1747,  1750,  1753,  1757,  1759,
+    1761,  1763,  1765,  1769,  1773,  1777,  1781,  1783,  1785,  1787,
+    1789,  1793,  1795,  1797,  1801,  1803,  1805,  1809,  1812,  1815,
+    1817,  1821,  1825,  1829,  1833,  1837,  1841,  1845,  1849,  1853,
+    1857
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -1200,168 +1242,169 @@ static const yytype_int16 yyrhs[] =
       98,   211,   180,    -1,   206,    87,   179,   159,    36,    -1,
       36,    98,    87,    36,   159,    36,   191,    -1,   206,   179,
       91,   220,    -1,    26,    98,    26,    91,   220,   189,    -1,
-      36,    98,    36,    91,   220,    -1,    36,    98,    36,    91,
-     220,   191,    -1,    26,    98,    87,    26,   159,    36,   189,
-      -1,    36,    98,    19,   163,    26,   158,    36,   162,   190,
-      -1,    36,    98,    19,   163,    36,   158,    36,   162,    -1,
-      26,    98,    18,   163,    26,   158,    26,   162,    -1,    26,
-      98,    18,   163,    26,   158,    26,   162,   163,   133,   162,
-      -1,    26,    98,    17,   163,    26,   158,    36,   162,   187,
-      -1,   206,   179,    93,   220,    -1,   206,    86,   179,   159,
-      36,    -1,    36,    98,    86,    36,   159,    36,    -1,    26,
-      98,    86,    26,   159,    36,   190,    -1,    26,    98,    85,
-      26,   159,    36,    -1,   206,   179,    92,   220,    -1,    26,
-      98,    26,    92,   220,   190,    -1,    36,    98,    36,    92,
-     220,    -1,    36,    98,    36,    93,   220,   191,    -1,    26,
-      98,    26,    93,   220,   189,    -1,    36,    98,    21,    26,
-      -1,    26,    98,    11,   163,    36,   158,    36,   162,    -1,
-      36,    98,    28,    98,    88,   163,   179,   158,    26,   162,
-      -1,    36,    98,    28,    98,    69,   163,   179,   158,    26,
-     162,    -1,    36,    98,    28,    98,    69,   163,   179,   158,
-     179,   158,    28,   162,    -1,   206,    90,   179,   159,    36,
-      -1,    26,    98,    90,    26,   159,    36,    -1,   206,    90,
-     179,   159,   220,    -1,    26,    98,    90,    26,   159,   220,
-      -1,    36,    98,    23,   179,    -1,    36,    98,    23,    26,
-      -1,    36,    98,    23,    36,    -1,    36,    98,    16,   163,
-      26,   162,   181,    -1,    26,    98,    16,   163,    26,   158,
-      26,   162,   181,    -1,   150,   163,    26,   158,    26,   158,
-     179,   162,   181,    -1,   206,    88,   163,   179,   158,   179,
-     158,    28,   162,    -1,   147,   163,    26,   158,   220,   162,
-      -1,   148,   163,    26,   158,   220,   162,    -1,   146,   163,
-      26,   158,   220,   162,    -1,    28,   105,   149,   163,    26,
-     158,   220,   162,    -1,    28,    98,   149,   163,    26,   158,
-     220,   162,    -1,   157,    64,    28,    26,    98,    26,    -1,
-     157,    28,    26,    98,    26,    -1,   157,    64,    28,    57,
-     220,    -1,   157,    64,    28,    57,   220,   163,   131,   162,
-      -1,   157,    28,    57,   220,    -1,   157,    28,    57,   220,
-     163,   131,   162,    -1,    37,    -1,    39,    -1,    38,    -1,
-      40,    -1,    41,    -1,    42,    -1,    44,    -1,    47,    -1,
-      48,    -1,    49,    -1,    46,    26,    -1,    45,    26,    -1,
-      57,   163,    26,   162,    -1,    60,   163,    26,   162,    -1,
-      60,   163,    27,    71,    26,   162,    -1,    57,   163,    27,
-      71,    26,   162,    -1,    50,   220,    -1,    51,   220,    -1,
-     120,   163,    26,   162,    -1,    57,   220,    -1,    58,   220,
-      -1,    59,   220,    -1,    59,   218,    -1,    60,   220,    -1,
-      60,   218,    -1,    97,   163,    26,   158,    26,   162,    -1,
-      96,   163,    26,   158,    26,   162,    -1,    26,    98,    70,
-      26,   189,    -1,    26,    98,    63,    26,    -1,    26,    95,
-      26,    -1,    26,    95,   220,    -1,    26,    89,    26,    -1,
-      26,    94,    26,    -1,    26,    94,   220,    -1,    26,    89,
-     220,    -1,   114,   164,    26,   165,    -1,   114,   199,    -1,
-     113,   164,    26,   165,    -1,   113,   199,    -1,   115,   164,
-      26,   165,    -1,   115,   199,    -1,   116,   164,    26,   165,
-      -1,   116,   199,    -1,   123,   164,    26,   205,   165,    98,
-      26,    -1,   123,   164,    26,   202,   220,   165,    98,    26,
-      -1,   124,   164,    26,   202,   220,   165,    98,    26,    -1,
-     124,   164,    26,   205,   165,    98,    26,    -1,   124,   164,
-      26,   205,   165,    98,    36,    -1,   164,    26,   202,   220,
-     165,    98,    26,    -1,    26,    98,   124,   164,    26,   202,
-     220,   165,   187,    -1,    36,    98,   124,   164,    26,   205,
-     165,    -1,    26,    98,   124,   164,    26,   205,   165,   187,
-      -1,    26,    98,   124,   164,    26,    84,    26,   165,   187,
-      -1,    36,    98,   124,   164,    26,    84,    26,   165,    -1,
-     164,    26,   205,   165,    98,    26,    -1,   164,    26,    84,
-      26,   165,    98,    26,    -1,   124,   164,    26,    84,    26,
-     165,    98,    36,    -1,    26,    98,   123,   164,    26,   202,
-     220,   165,   187,    -1,    26,    98,   123,   164,    26,   205,
-     165,   187,    -1,    26,    98,   164,    26,    84,    26,   165,
-      -1,    26,    98,   164,    26,   202,   217,   165,    -1,    26,
-      98,   164,    26,   205,   165,    -1,   198,    98,   163,    26,
-     160,   220,   158,    26,   160,   220,   162,    -1,   198,    98,
-     163,    26,   160,   220,   162,    -1,   163,    26,   160,   220,
-     158,    26,   160,   220,   162,    98,   199,    -1,   163,    26,
-     160,   220,   162,    98,   199,    -1,   198,    98,    26,    -1,
-      24,   220,    -1,    25,    -1,    52,   163,   220,   158,   220,
-     162,    26,    -1,    52,   163,   220,   158,   220,   162,    26,
-      98,    26,    -1,    52,   163,   220,   158,   220,   162,    26,
-      98,    26,    92,   220,    -1,    53,   220,    26,    -1,    53,
-     220,    26,    98,    26,    -1,    53,   220,    26,    98,    26,
-      92,   220,    -1,   154,    -1,   154,   179,    -1,   154,    26,
-      -1,   156,   163,    26,   162,    -1,   153,    -1,   155,   163,
-      36,   158,   220,   162,    -1,   152,   163,    26,   158,   220,
-     162,    -1,   151,   163,    26,   158,   220,   162,    -1,    30,
-      -1,    31,    -1,    -1,   163,   135,   158,   136,   162,    -1,
-     163,   136,   158,   135,   162,    -1,   163,   136,   162,    -1,
-     163,   135,   162,    -1,   163,   121,   162,    -1,   163,   122,
-     162,    -1,    -1,   126,    -1,   127,    -1,   128,    -1,   121,
-      -1,   122,    -1,    -1,   163,   182,   162,    -1,    -1,   163,
-     125,   162,    -1,   163,   126,   162,    -1,    -1,   163,   183,
-     162,    -1,   163,   182,   162,    -1,   163,   183,   158,   182,
-     162,    -1,   163,   182,   158,   183,   162,    -1,    -1,   163,
-     134,   162,    -1,   163,   133,   162,    -1,    -1,   163,   133,
-     162,    -1,   163,   134,   162,    -1,    -1,   163,   125,   162,
-      -1,   163,   126,   162,    -1,   163,   143,   162,    -1,   163,
-     143,   158,   126,   162,    -1,   163,   126,   158,   143,   162,
-      -1,    -1,   163,   143,   162,    -1,    -1,   163,   126,   162,
-      -1,   108,    -1,   111,    -1,   110,    -1,   109,    -1,    -1,
-     163,   137,   162,    -1,   163,   137,   162,    -1,   163,   136,
-     162,    -1,   163,   136,   158,   137,   162,    -1,   163,   137,
-     158,   136,   162,    -1,    13,    -1,    14,    -1,    15,    -1,
-      -1,   163,   136,   162,    -1,    -1,   163,   136,   162,    -1,
-     164,    83,    26,   165,    -1,   164,    26,    84,   165,    -1,
-      75,    -1,    76,    -1,    79,    -1,    80,    -1,    81,    -1,
-      82,    -1,    71,    -1,    70,    -1,   163,   140,   162,    -1,
-     163,   129,   162,    -1,   163,   139,   162,    -1,   163,   130,
-     162,    -1,   163,   140,   158,   137,   162,    -1,   163,   129,
-     158,   137,   162,    -1,   163,   139,   158,   137,   162,    -1,
-     163,   130,   158,   137,   162,    -1,   163,   144,   162,    -1,
-     163,   145,   162,    -1,   163,   144,   158,   137,   162,    -1,
-     163,   145,   158,   137,   162,    -1,    -1,    84,    -1,    83,
-      -1,   179,    98,    -1,   179,   103,    -1,   179,   104,    -1,
-      26,    98,   179,    -1,   210,    -1,    26,    98,   163,   210,
-     162,    -1,    36,    98,   163,   210,   162,    -1,    36,    98,
-     179,    -1,   206,   211,    -1,   208,   211,    -1,   207,   211,
-      -1,    36,    72,    36,    -1,    98,    -1,   100,    -1,   102,
-      -1,   101,    -1,    28,   212,   166,    -1,    28,   212,   143,
-      -1,   166,   212,    28,    -1,   143,   212,    28,    -1,   168,
-      -1,   170,    -1,   171,    -1,   172,    -1,   214,   173,   215,
-      -1,   216,    -1,   220,    -1,   214,   173,   174,    -1,   169,
-      -1,   214,    -1,   163,   221,   162,    -1,    63,   221,    -1,
-      70,   221,    -1,   221,    -1,   221,    72,   221,    -1,   221,
-      73,   221,    -1,   221,    67,   221,    -1,   221,    71,   221,
-      -1,   221,    70,   221,    -1,   221,    91,   221,    -1,   221,
-      92,   221,    -1,   221,    65,   221,    -1,   221,    68,   221,
-      -1,   221,    66,   221,    -1,   219,    -1
+      36,    98,    36,    91,   220,   191,    -1,    26,    98,    87,
+      26,   159,    36,   189,    -1,    36,    98,    19,   163,    26,
+     158,    36,   162,   190,    -1,    36,    98,    19,   163,    36,
+     158,    36,   162,    -1,    26,    98,    18,   163,    26,   158,
+      26,   162,    -1,    26,    98,    18,   163,    26,   158,    26,
+     162,   163,   133,   162,    -1,    26,    98,    17,   163,    26,
+     158,    36,   162,   187,    -1,   206,   179,    93,   220,    -1,
+     206,    86,   179,   159,    36,    -1,    36,    98,    86,    36,
+     159,    36,    -1,    26,    98,    86,    26,   159,    36,   190,
+      -1,    26,    98,    85,    26,   159,    36,    -1,   206,   179,
+      92,   220,    -1,    26,    98,    26,    92,   220,   190,    -1,
+      36,    98,    36,    92,   220,    -1,    36,    98,    36,    93,
+     220,   191,    -1,    26,    98,    26,    93,   220,   189,    -1,
+      36,    98,    21,    26,    -1,    26,    98,    11,   163,    36,
+     158,    36,   162,    -1,    36,    98,    28,    98,    88,   163,
+     179,   158,    26,   162,    -1,    36,    98,    28,    98,    69,
+     163,   179,   158,    26,   162,    -1,    36,    98,    28,    98,
+      69,   163,   179,   158,   179,   158,    28,   162,    -1,   206,
+      90,   179,   159,    36,    -1,    26,    98,    90,    26,   159,
+      36,    -1,   206,    90,   179,   159,   220,    -1,    26,    98,
+      90,    26,   159,   220,    -1,    36,    98,    23,   179,    -1,
+      36,    98,    23,    26,    -1,    36,    98,    23,    36,    -1,
+      36,    98,    16,   163,    26,   162,   181,    -1,    26,    98,
+      16,   163,    26,   158,    26,   162,   181,    -1,   150,   163,
+      26,   158,    26,   158,   179,   162,   181,    -1,   206,    88,
+     163,   179,   158,   179,   158,    28,   162,    -1,   147,   163,
+      26,   158,   220,   162,    -1,   148,   163,    26,   158,   220,
+     162,    -1,   146,   163,    26,   158,   220,   162,    -1,    28,
+     105,   149,   163,    26,   158,   220,   162,    -1,    28,    98,
+     149,   163,    26,   158,   220,   162,    -1,   157,    64,    28,
+      26,    98,    26,    -1,   157,    28,    26,    98,    26,    -1,
+     157,    64,    28,    57,   220,    -1,   157,    64,    28,    57,
+     220,   163,   131,   162,    -1,   157,    28,    57,   220,    -1,
+     157,    28,    57,   220,   163,   131,   162,    -1,    37,    -1,
+      39,    -1,    38,    -1,    40,    -1,    41,    -1,    42,    -1,
+      44,    -1,    47,    -1,    48,    -1,    49,    -1,    46,    26,
+      -1,    45,    26,    -1,    57,   163,    26,   162,    -1,    60,
+     163,    26,   162,    -1,    60,   163,    27,    71,    26,   162,
+      -1,    57,   163,    27,    71,    26,   162,    -1,    50,   220,
+      -1,    51,   220,    -1,   120,   163,    26,   162,    -1,    57,
+     220,    -1,    58,   220,    -1,    59,   220,    -1,    59,   218,
+      -1,    60,   220,    -1,    60,   218,    -1,    97,   163,    26,
+     158,    26,   162,    -1,    96,   163,    26,   158,    26,   162,
+      -1,    26,    98,    70,    26,   189,    -1,    26,    98,    63,
+      26,    -1,    26,    95,    26,    -1,    26,    95,   220,    -1,
+      26,    89,    26,    -1,    26,    94,    26,    -1,    26,    94,
+     220,    -1,    26,    89,   220,    -1,   114,   164,    26,   165,
+      -1,   114,   199,    -1,   113,   164,    26,   165,    -1,   113,
+     199,    -1,   115,   164,    26,   165,    -1,   115,   199,    -1,
+     116,   164,    26,   165,    -1,   116,   199,    -1,   123,   164,
+      26,   205,   165,    98,    26,    -1,   123,   164,    26,   202,
+     220,   165,    98,    26,    -1,   124,   164,    26,   202,   220,
+     165,    98,    26,    -1,   124,   164,    26,   205,   165,    98,
+      26,    -1,   124,   164,    26,   205,   165,    98,    36,    -1,
+     164,    26,   202,   220,   165,    98,    26,    -1,    26,    98,
+     124,   164,    26,   202,   220,   165,   187,    -1,    36,    98,
+     124,   164,    26,   205,   165,    -1,    26,    98,   124,   164,
+      26,   205,   165,   187,    -1,    26,    98,   124,   164,    26,
+      84,    26,   165,   187,    -1,    36,    98,   124,   164,    26,
+      84,    26,   165,    -1,   164,    26,   205,   165,    98,    26,
+      -1,   164,    26,    84,    26,   165,    98,    26,    -1,   124,
+     164,    26,    84,    26,   165,    98,    36,    -1,    26,    98,
+     123,   164,    26,   202,   220,   165,   187,    -1,    26,    98,
+     123,   164,    26,   205,   165,   187,    -1,    26,    98,   164,
+      26,    84,    26,   165,    -1,    26,    98,   164,    26,   202,
+     217,   165,    -1,    26,    98,   164,    26,   205,   165,    -1,
+     198,    98,   163,    26,   160,   220,   158,    26,   160,   220,
+     162,    -1,   198,    98,   163,    26,   160,   220,   162,    -1,
+     163,    26,   160,   220,   158,    26,   160,   220,   162,    98,
+     199,    -1,   163,    26,   160,   220,   162,    98,   199,    -1,
+     198,    98,    26,    -1,    24,   220,    -1,    25,    -1,    52,
+     163,   220,   158,   220,   162,    26,    -1,    52,   163,   220,
+     158,   220,   162,    26,    98,    26,    -1,    52,   163,   220,
+     158,   220,   162,    26,    98,    26,    92,   220,    -1,    53,
+     220,    26,    -1,    53,   220,    26,    98,    26,    -1,    53,
+     220,    26,    98,    26,    92,   220,    -1,    54,   220,    -1,
+      55,   220,    -1,   154,    -1,   154,   179,    -1,   154,    26,
+      -1,   156,   163,    26,   162,    -1,   153,    -1,    43,    -1,
+     155,   163,    36,   158,   220,   162,    -1,   152,   163,    26,
+     158,   220,   162,    -1,   151,   163,    26,   158,   220,   162,
+      -1,    30,    -1,    31,    -1,    -1,   163,   135,   158,   136,
+     162,    -1,   163,   136,   158,   135,   162,    -1,   163,   136,
+     162,    -1,   163,   135,   162,    -1,   163,   121,   162,    -1,
+     163,   122,   162,    -1,    -1,   126,    -1,   127,    -1,   128,
+      -1,   121,    -1,   122,    -1,    -1,   163,   182,   162,    -1,
+      -1,   163,   125,   162,    -1,   163,   126,   162,    -1,    -1,
+     163,   183,   162,    -1,   163,   182,   162,    -1,   163,   183,
+     158,   182,   162,    -1,   163,   182,   158,   183,   162,    -1,
+      -1,   163,   134,   162,    -1,   163,   133,   162,    -1,    -1,
+     163,   133,   162,    -1,   163,   134,   162,    -1,    -1,   163,
+     125,   162,    -1,   163,   126,   162,    -1,   163,   143,   162,
+      -1,   163,   143,   158,   126,   162,    -1,   163,   126,   158,
+     143,   162,    -1,    -1,   163,   143,   162,    -1,    -1,   163,
+     126,   162,    -1,   108,    -1,   111,    -1,   110,    -1,   109,
+      -1,    -1,   163,   137,   162,    -1,   163,   137,   162,    -1,
+     163,   136,   162,    -1,   163,   136,   158,   137,   162,    -1,
+     163,   137,   158,   136,   162,    -1,    13,    -1,    14,    -1,
+      15,    -1,    -1,   163,   136,   162,    -1,    -1,   163,   136,
+     162,    -1,   164,    83,    26,   165,    -1,   164,    26,    84,
+     165,    -1,    75,    -1,    76,    -1,    79,    -1,    80,    -1,
+      81,    -1,    82,    -1,    71,    -1,    70,    -1,   163,   140,
+     162,    -1,   163,   129,   162,    -1,   163,   139,   162,    -1,
+     163,   130,   162,    -1,   163,   140,   158,   137,   162,    -1,
+     163,   129,   158,   137,   162,    -1,   163,   139,   158,   137,
+     162,    -1,   163,   130,   158,   137,   162,    -1,   163,   144,
+     162,    -1,   163,   145,   162,    -1,   163,   144,   158,   137,
+     162,    -1,   163,   145,   158,   137,   162,    -1,    -1,    84,
+      -1,    83,    -1,   179,    98,    -1,   179,   103,    -1,   179,
+     104,    -1,    26,    98,   179,    -1,   210,    -1,    26,    98,
+     163,   210,   162,    -1,    36,    98,   163,   210,   162,    -1,
+      36,    98,   179,    -1,   206,   211,    -1,   208,   211,    -1,
+     207,   211,    -1,    36,    72,    36,    -1,    98,    -1,   100,
+      -1,   102,    -1,   101,    -1,    28,   212,   166,    -1,    28,
+     212,   143,    -1,   166,   212,    28,    -1,   143,   212,    28,
+      -1,   168,    -1,   170,    -1,   171,    -1,   172,    -1,   214,
+     173,   215,    -1,   216,    -1,   220,    -1,   214,   173,   174,
+      -1,   169,    -1,   214,    -1,   163,   221,   162,    -1,    63,
+     221,    -1,    70,   221,    -1,   221,    -1,   221,    72,   221,
+      -1,   221,    73,   221,    -1,   221,    67,   221,    -1,   221,
+      71,   221,    -1,   221,    70,   221,    -1,   221,    91,   221,
+      -1,   221,    92,   221,    -1,   221,    65,   221,    -1,   221,
+      68,   221,    -1,   221,    66,   221,    -1,   219,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   567,   567,   568,   580,   582,   615,   642,   653,   657,
-     692,   712,   717,   727,   737,   742,   747,   763,   779,   791,
-     801,   814,   833,   851,   874,   896,   901,   911,   922,   933,
-     947,   962,   978,   994,  1010,  1021,  1035,  1061,  1079,  1084,
-    1090,  1102,  1113,  1124,  1135,  1146,  1157,  1168,  1194,  1208,
-    1218,  1263,  1282,  1293,  1304,  1315,  1326,  1337,  1353,  1370,
-    1386,  1397,  1408,  1439,  1450,  1463,  1474,  1513,  1523,  1533,
-    1553,  1563,  1573,  1583,  1594,  1602,  1612,  1622,  1633,  1657,
-    1668,  1674,  1685,  1696,  1707,  1715,  1736,  1762,  1791,  1822,
-    1836,  1847,  1861,  1895,  1905,  1915,  1940,  1952,  1970,  1981,
-    1992,  2003,  2016,  2027,  2038,  2049,  2060,  2071,  2104,  2114,
-    2127,  2147,  2158,  2169,  2182,  2195,  2206,  2217,  2228,  2239,
-    2249,  2260,  2271,  2283,  2294,  2305,  2316,  2329,  2341,  2353,
-    2364,  2375,  2386,  2398,  2410,  2421,  2432,  2443,  2453,  2459,
-    2465,  2471,  2477,  2483,  2489,  2495,  2501,  2507,  2513,  2524,
-    2535,  2546,  2557,  2568,  2579,  2590,  2596,  2607,  2618,  2629,
-    2640,  2651,  2661,  2674,  2682,  2690,  2714,  2725,  2736,  2747,
-    2758,  2769,  2781,  2794,  2803,  2814,  2825,  2837,  2848,  2859,
-    2870,  2884,  2896,  2911,  2930,  2941,  2959,  2993,  3011,  3028,
-    3039,  3050,  3061,  3082,  3101,  3114,  3128,  3140,  3156,  3196,
-    3227,  3243,  3262,  3276,  3295,  3311,  3319,  3328,  3339,  3351,
-    3365,  3373,  3383,  3395,  3400,  3405,  3411,  3419,  3425,  3431,
-    3437,  3450,  3454,  3464,  3468,  3473,  3478,  3483,  3490,  3494,
-    3501,  3505,  3510,  3515,  3523,  3527,  3534,  3538,  3546,  3551,
-    3557,  3566,  3571,  3577,  3583,  3589,  3598,  3601,  3605,  3612,
-    3615,  3619,  3626,  3631,  3637,  3643,  3649,  3654,  3662,  3665,
-    3672,  3675,  3682,  3686,  3690,  3694,  3701,  3704,  3711,  3716,
-    3723,  3730,  3742,  3746,  3750,  3757,  3760,  3770,  3773,  3782,
-    3788,  3797,  3801,  3808,  3812,  3816,  3820,  3827,  3831,  3838,
-    3846,  3854,  3862,  3870,  3877,  3884,  3892,  3902,  3907,  3912,
-    3917,  3925,  3928,  3932,  3941,  3948,  3955,  3962,  3977,  3983,
-    3991,  3999,  4017,  4024,  4031,  4041,  4054,  4058,  4062,  4066,
-    4073,  4079,  4085,  4091,  4101,  4110,  4112,  4114,  4118,  4126,
-    4130,  4137,  4143,  4149,  4153,  4157,  4161,  4167,  4173,  4177,
-    4181,  4185,  4189,  4193,  4197,  4201,  4205,  4209,  4213
+       0,   608,   608,   609,   621,   623,   656,   683,   694,   698,
+     736,   756,   761,   771,   781,   786,   791,   807,   823,   835,
+     845,   858,   877,   895,   918,   940,   945,   955,   966,   977,
+     991,  1006,  1022,  1038,  1054,  1065,  1079,  1105,  1123,  1128,
+    1134,  1146,  1157,  1168,  1179,  1190,  1201,  1212,  1238,  1252,
+    1262,  1307,  1326,  1337,  1348,  1359,  1370,  1381,  1397,  1414,
+    1430,  1441,  1452,  1485,  1496,  1509,  1520,  1559,  1569,  1579,
+    1599,  1609,  1619,  1630,  1644,  1655,  1668,  1678,  1690,  1705,
+    1716,  1722,  1742,  1753,  1764,  1772,  1798,  1828,  1857,  1888,
+    1902,  1913,  1927,  1961,  1979,  2004,  2016,  2034,  2045,  2056,
+    2067,  2080,  2091,  2102,  2113,  2124,  2135,  2168,  2178,  2191,
+    2211,  2222,  2233,  2246,  2259,  2270,  2281,  2292,  2303,  2313,
+    2324,  2335,  2347,  2358,  2369,  2380,  2393,  2405,  2417,  2428,
+    2439,  2450,  2462,  2474,  2485,  2496,  2507,  2517,  2523,  2529,
+    2535,  2541,  2547,  2553,  2559,  2565,  2571,  2577,  2588,  2599,
+    2610,  2621,  2632,  2643,  2654,  2660,  2671,  2682,  2693,  2704,
+    2715,  2725,  2738,  2746,  2754,  2778,  2789,  2800,  2811,  2822,
+    2833,  2845,  2858,  2867,  2878,  2889,  2901,  2912,  2923,  2934,
+    2948,  2960,  2986,  3016,  3027,  3052,  3089,  3117,  3142,  3153,
+    3164,  3175,  3201,  3220,  3234,  3258,  3270,  3289,  3335,  3372,
+    3388,  3407,  3421,  3440,  3456,  3464,  3473,  3484,  3496,  3510,
+    3518,  3528,  3540,  3550,  3561,  3566,  3571,  3577,  3585,  3591,
+    3597,  3603,  3609,  3622,  3626,  3636,  3640,  3645,  3650,  3655,
+    3662,  3666,  3673,  3677,  3682,  3687,  3695,  3699,  3706,  3710,
+    3718,  3723,  3729,  3738,  3743,  3749,  3755,  3761,  3770,  3773,
+    3777,  3784,  3787,  3791,  3798,  3803,  3809,  3815,  3821,  3826,
+    3834,  3837,  3844,  3847,  3854,  3858,  3862,  3866,  3873,  3876,
+    3883,  3888,  3895,  3902,  3914,  3918,  3922,  3929,  3932,  3942,
+    3945,  3954,  3960,  3969,  3973,  3980,  3984,  3988,  3992,  3999,
+    4003,  4010,  4018,  4026,  4034,  4042,  4049,  4056,  4064,  4074,
+    4079,  4084,  4089,  4097,  4100,  4104,  4113,  4120,  4127,  4134,
+    4149,  4155,  4168,  4181,  4199,  4206,  4213,  4223,  4236,  4240,
+    4244,  4248,  4255,  4261,  4267,  4273,  4283,  4292,  4294,  4296,
+    4300,  4308,  4312,  4319,  4325,  4331,  4335,  4339,  4343,  4349,
+    4355,  4359,  4363,  4367,  4371,  4375,  4379,  4383,  4387,  4391,
+    4395
 };
 #endif
 
@@ -1459,19 +1502,20 @@ static const yytype_uint8 yyr1[] =
      178,   178,   178,   178,   178,   178,   178,   178,   178,   178,
      178,   178,   178,   178,   178,   178,   178,   178,   178,   178,
      178,   178,   178,   178,   178,   178,   178,   178,   178,   178,
-     178,   179,   179,   180,   180,   180,   180,   180,   181,   181,
-     182,   182,   182,   182,   183,   183,   184,   184,   185,   185,
-     185,   186,   186,   186,   186,   186,   187,   187,   187,   188,
-     188,   188,   189,   189,   189,   189,   189,   189,   190,   190,
-     191,   191,   192,   192,   192,   192,   193,   193,   194,   194,
-     194,   194,   195,   195,   195,   196,   196,   197,   197,   198,
-     199,   200,   200,   201,   201,   201,   201,   202,   202,   203,
-     203,   203,   203,   203,   203,   203,   203,   204,   204,   204,
-     204,   205,   205,   205,   206,   207,   208,   209,   209,   209,
-     209,   209,   210,   210,   210,   211,   212,   212,   212,   212,
-     213,   213,   213,   213,   214,   215,   215,   215,   216,   217,
-     217,   218,   219,   219,   219,   219,   219,   220,   221,   221,
-     221,   221,   221,   221,   221,   221,   221,   221,   221
+     178,   178,   178,   179,   179,   180,   180,   180,   180,   180,
+     181,   181,   182,   182,   182,   182,   183,   183,   184,   184,
+     185,   185,   185,   186,   186,   186,   186,   186,   187,   187,
+     187,   188,   188,   188,   189,   189,   189,   189,   189,   189,
+     190,   190,   191,   191,   192,   192,   192,   192,   193,   193,
+     194,   194,   194,   194,   195,   195,   195,   196,   196,   197,
+     197,   198,   199,   200,   200,   201,   201,   201,   201,   202,
+     202,   203,   203,   203,   203,   203,   203,   203,   203,   204,
+     204,   204,   204,   205,   205,   205,   206,   207,   208,   209,
+     209,   209,   209,   209,   210,   210,   210,   211,   212,   212,
+     212,   212,   213,   213,   213,   213,   214,   215,   215,   215,
+     216,   217,   217,   218,   219,   219,   219,   219,   219,   220,
+     221,   221,   221,   221,   221,   221,   221,   221,   221,   221,
+     221
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1486,32 +1530,33 @@ static const yytype_uint8 yyr2[] =
        4,     3,     3,     3,    11,    11,     9,     5,     5,     9,
        5,     5,     6,     6,     5,     5,     5,     6,     6,     5,
        1,     3,     3,     3,     3,     4,     4,     9,     9,     5,
-       7,     4,     6,     5,     6,     7,     9,     8,     8,    11,
-       9,     4,     5,     6,     7,     6,     4,     6,     5,     6,
-       6,     4,     8,    10,    10,    12,     5,     6,     5,     6,
-       4,     4,     4,     7,     9,     9,     9,     6,     6,     6,
-       8,     8,     6,     5,     5,     8,     4,     7,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     2,     2,
-       4,     4,     6,     6,     2,     2,     4,     2,     2,     2,
-       2,     2,     2,     6,     6,     5,     4,     3,     3,     3,
-       3,     3,     3,     4,     2,     4,     2,     4,     2,     4,
-       2,     7,     8,     8,     7,     7,     7,     9,     7,     8,
-       9,     8,     6,     7,     8,     9,     8,     7,     7,     6,
-      11,     7,    11,     7,     3,     2,     1,     7,     9,    11,
-       3,     5,     7,     1,     2,     2,     4,     1,     6,     6,
-       6,     1,     1,     0,     5,     5,     3,     3,     3,     3,
-       0,     1,     1,     1,     1,     1,     0,     3,     0,     3,
-       3,     0,     3,     3,     5,     5,     0,     3,     3,     0,
-       3,     3,     0,     3,     3,     3,     5,     5,     0,     3,
-       0,     3,     1,     1,     1,     1,     0,     3,     3,     3,
-       5,     5,     1,     1,     1,     0,     3,     0,     3,     4,
-       4,     1,     1,     1,     1,     1,     1,     1,     1,     3,
-       3,     3,     3,     5,     5,     5,     5,     3,     3,     5,
-       5,     0,     1,     1,     2,     2,     2,     3,     1,     5,
-       5,     3,     2,     2,     2,     3,     1,     1,     1,     1,
-       3,     3,     3,     3,     1,     1,     1,     1,     3,     1,
-       1,     3,     1,     1,     3,     2,     2,     1,     3,     3,
-       3,     3,     3,     3,     3,     3,     3,     3,     1
+       7,     4,     6,     6,     7,     9,     8,     8,    11,     9,
+       4,     5,     6,     7,     6,     4,     6,     5,     6,     6,
+       4,     8,    10,    10,    12,     5,     6,     5,     6,     4,
+       4,     4,     7,     9,     9,     9,     6,     6,     6,     8,
+       8,     6,     5,     5,     8,     4,     7,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     2,     2,     4,
+       4,     6,     6,     2,     2,     4,     2,     2,     2,     2,
+       2,     2,     6,     6,     5,     4,     3,     3,     3,     3,
+       3,     3,     4,     2,     4,     2,     4,     2,     4,     2,
+       7,     8,     8,     7,     7,     7,     9,     7,     8,     9,
+       8,     6,     7,     8,     9,     8,     7,     7,     6,    11,
+       7,    11,     7,     3,     2,     1,     7,     9,    11,     3,
+       5,     7,     2,     2,     1,     2,     2,     4,     1,     1,
+       6,     6,     6,     1,     1,     0,     5,     5,     3,     3,
+       3,     3,     0,     1,     1,     1,     1,     1,     0,     3,
+       0,     3,     3,     0,     3,     3,     5,     5,     0,     3,
+       3,     0,     3,     3,     0,     3,     3,     3,     5,     5,
+       0,     3,     0,     3,     1,     1,     1,     1,     0,     3,
+       3,     3,     5,     5,     1,     1,     1,     0,     3,     0,
+       3,     4,     4,     1,     1,     1,     1,     1,     1,     1,
+       1,     3,     3,     3,     3,     5,     5,     5,     5,     3,
+       3,     5,     5,     0,     1,     1,     2,     2,     2,     3,
+       1,     5,     5,     3,     2,     2,     2,     3,     1,     1,
+       1,     1,     3,     3,     3,     3,     1,     1,     1,     1,
+       3,     1,     1,     3,     1,     1,     3,     2,     2,     1,
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1519,239 +1564,239 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,     7,     0,     0,   206,     0,     0,   221,   222,     0,
-       0,     0,     0,     0,   138,   140,   139,   141,   142,   143,
-     144,     0,     0,   145,   146,   147,     0,     0,     0,     0,
-      11,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     7,     0,     0,   205,     0,     0,   223,   224,     0,
+       0,     0,     0,     0,   137,   139,   138,   140,   141,   142,
+     219,   143,     0,     0,   144,   145,   146,     0,     0,     0,
+       0,     0,     0,    11,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   217,   213,     0,     0,     0,     0,     0,     0,     8,
-       0,     3,     0,     0,     0,     0,     0,     0,   223,   308,
-      80,     0,     0,     0,     0,   324,   332,   333,   348,   205,
-     337,     0,     0,     0,     0,     0,     0,     0,   316,   317,
-     319,   318,     0,     0,     0,     0,     0,     0,     0,   149,
-     148,   154,   155,     0,     0,     0,   157,   158,   333,   160,
-     159,     0,   162,   161,     0,     0,     0,   176,     0,   174,
-       0,   178,     0,   180,     0,     0,     0,   316,     0,     0,
-       0,     0,     0,     0,     0,   215,   214,     0,     0,     0,
-       0,     0,   301,     0,     0,     1,     0,     4,   304,   305,
-     306,     0,    46,     0,     0,     0,     0,     0,     0,     0,
-      45,     0,   312,    49,   275,   314,   313,     0,     9,     0,
-     335,   336,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   169,   172,   170,   171,   167,   168,     0,
-       0,     0,     0,     0,     0,   272,   273,   274,     0,     0,
-       0,    81,    83,   246,     0,   246,     0,     0,   281,   282,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   307,
-       0,     0,   223,   249,    63,    59,    57,    61,    62,    82,
-       0,     0,    84,     0,   321,   320,    26,    14,    27,    15,
-       0,     0,     0,     0,    51,     0,     0,     0,     0,     0,
-       0,   311,   223,    48,     0,   210,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   301,   301,
-     323,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   288,   287,   303,   302,     0,     0,
-       0,   322,     0,   275,   204,     0,     0,    38,    25,     0,
-       0,     0,     0,     0,     0,     0,     0,    40,     0,    56,
-       0,     0,     0,     0,   334,   345,   347,   340,   346,   342,
-     341,   338,   339,   343,   344,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   287,   283,   284,
-     285,   286,     0,     0,     0,     0,     0,     0,    53,     0,
-      47,   166,   252,   258,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   301,     0,     0,     0,
-      86,     0,    50,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   111,   121,   122,   120,     0,     0,
+       0,     0,     0,     0,   218,   214,     0,     0,     0,     0,
+       0,     0,     8,     0,     3,     0,     0,     0,     0,     0,
+       0,   225,   310,    80,     0,     0,     0,     0,   326,   334,
+     335,   350,   204,   339,     0,     0,     0,     0,     0,     0,
+       0,   318,   319,   321,   320,     0,     0,     0,     0,     0,
+       0,     0,   148,   147,   153,   154,     0,     0,   212,   213,
+       0,   156,   157,   335,   159,   158,     0,   161,   160,     0,
+       0,     0,   175,     0,   173,     0,   177,     0,   179,     0,
+       0,     0,   318,     0,     0,     0,     0,     0,     0,     0,
+     216,   215,     0,     0,     0,     0,     0,   303,     0,     0,
+       1,     0,     4,   306,   307,   308,     0,    46,     0,     0,
+       0,     0,     0,     0,     0,    45,     0,   314,    49,   277,
+     316,   315,     0,     9,     0,   337,   338,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   168,   171,
+     169,   170,   166,   167,     0,     0,     0,     0,     0,     0,
+     274,   275,   276,     0,     0,     0,    81,    83,   248,     0,
+     248,     0,     0,   283,   284,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   309,     0,     0,   225,   251,    63,
+      59,    57,    61,    62,    82,     0,     0,    84,     0,   323,
+     322,    26,    14,    27,    15,     0,     0,     0,     0,    51,
+       0,     0,     0,     0,     0,     0,   313,   225,    48,     0,
+     209,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   303,   303,   325,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   290,
+     289,   305,   304,     0,     0,     0,   324,     0,   277,   203,
+       0,     0,    38,    25,     0,     0,     0,     0,     0,     0,
+       0,     0,    40,     0,    56,     0,     0,     0,     0,   336,
+     347,   349,   342,   348,   344,   343,   340,   341,   345,   346,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    85,     0,     0,   150,     0,   331,   151,     0,     0,
-       0,     0,   175,   173,   177,   179,   156,   302,     0,     0,
-     302,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     216,     0,   136,     0,     0,     0,     0,     0,     0,     0,
-     279,     0,     6,    60,     0,   315,     0,     0,     0,     0,
-       0,     0,    91,   106,   101,     0,     0,     0,   227,     0,
-     226,     0,     0,   223,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    79,    67,    68,     0,   252,   258,
-     252,   236,   238,     0,     0,     0,     0,   165,     0,    24,
-       0,     0,     0,     0,   301,   301,     0,   306,     0,   309,
-     302,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     277,   277,    74,    75,   277,   277,     0,    76,    70,    71,
-       0,     0,     0,     0,     0,     0,     0,     0,    93,   108,
-     260,     0,   238,     0,     0,   301,     0,   310,     0,     0,
-     211,     0,     0,     0,     0,   280,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   133,     0,
-       0,   134,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,   102,    89,     0,   116,   118,    41,   276,
-       0,     0,     0,     0,    10,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    92,   107,   110,     0,
-     230,    52,     0,     0,    36,   248,   247,     0,     0,     0,
-       0,     0,   105,   258,   252,   117,   119,     0,     0,   302,
-       0,     0,     0,    12,     0,   333,   329,     0,   330,   199,
-       0,     0,     0,     0,   250,   251,    58,     0,    77,    78,
-      72,    73,     0,     0,     0,     0,     0,    42,     0,     0,
-       0,     0,    94,   109,     0,    39,   103,   260,   302,     0,
-      13,     0,     0,     0,   153,   152,   164,   163,     0,     0,
-       0,     0,     0,   129,   127,   128,     0,   220,   219,   218,
-       0,   132,     0,     0,     0,     0,     0,     0,   192,     5,
-       0,     0,     0,     0,     0,   224,   225,     0,   307,     0,
+       0,     0,   289,   285,   286,   287,   288,     0,     0,     0,
+       0,     0,     0,    53,     0,    47,   165,   254,   260,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   231,   232,   233,     0,     0,     0,     0,     0,
-     253,     0,   254,     0,   255,   259,   104,    95,     0,   246,
-       0,     0,   246,     0,   197,     0,   198,     0,     0,     0,
-       0,     0,     0,     0,     0,   123,     0,     0,     0,     0,
-       0,     0,     0,     0,    90,     0,   188,     0,   207,   212,
-       0,   181,     0,     0,   184,   185,     0,   137,     0,     0,
-       0,     0,     0,     0,     0,   203,   193,   186,     0,   201,
-      55,    54,     0,     0,     0,     0,     0,     0,     0,    34,
-     112,     0,   246,    98,     0,     0,   237,     0,   239,   240,
-       0,     0,     0,   246,   196,   246,   246,   189,     0,   325,
-     326,   327,   328,     0,    28,   258,   223,   278,   131,   130,
-       0,     0,   258,    97,    43,    44,     0,     0,   261,     0,
-     191,   223,     0,   182,   194,   183,     0,   135,     0,     0,
+       0,   303,     0,     0,     0,    86,     0,    50,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   110,
+     120,   121,   119,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    85,     0,     0,   149,
+       0,   333,   150,     0,     0,     0,     0,   174,   172,   176,
+     178,   155,   304,     0,     0,   304,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   217,     0,   135,     0,     0,
+       0,     0,     0,     0,     0,   281,     0,     6,    60,     0,
+     317,     0,     0,     0,     0,     0,     0,    91,   105,   100,
+       0,     0,     0,   229,     0,   228,     0,     0,   225,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    79,
+      67,    68,     0,   254,   260,   254,   238,   240,     0,     0,
+       0,     0,   164,     0,    24,     0,     0,     0,     0,   303,
+     303,     0,   308,     0,   311,   304,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   279,   279,    74,    75,   279,
+     279,     0,    76,    70,    71,     0,     0,     0,     0,     0,
+       0,     0,     0,   262,   107,   262,     0,   240,     0,     0,
+     303,     0,   312,     0,     0,   210,     0,     0,     0,     0,
+     282,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   132,     0,     0,   133,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   101,    89,
+       0,   115,   117,    41,   278,     0,     0,     0,     0,    10,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   124,   100,     0,    69,     0,     0,     0,   257,
-     256,   195,   190,   187,    66,     0,    37,    88,   228,   229,
-      96,     0,     0,     0,     0,    87,   208,   125,     0,     0,
-       0,     0,     0,     0,   126,     0,   266,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,   114,     0,   113,     0,
-       0,     0,     0,   266,   262,   265,   264,   263,     0,     0,
-       0,     0,     0,    64,     0,     0,     0,     0,    99,   241,
-     238,    20,   238,     0,     0,   209,     0,     0,    18,    19,
-     202,   200,    65,     0,    30,     0,     0,     0,   230,    23,
-      22,    21,   115,     0,     0,     0,   267,     0,    29,     0,
-      31,    32,     0,    33,   234,   235,     0,     0,     0,     0,
+       0,    92,   106,   109,     0,   232,    52,     0,     0,    36,
+     250,   249,     0,     0,     0,     0,     0,   104,   260,   254,
+     116,   118,     0,     0,   304,     0,     0,     0,    12,     0,
+     335,   331,     0,   332,   198,     0,     0,     0,     0,   252,
+     253,    58,     0,    77,    78,    72,    73,     0,     0,     0,
+       0,     0,    42,     0,     0,     0,     0,    93,   108,     0,
+      39,   102,   262,   304,     0,    13,     0,     0,     0,   152,
+     151,   163,   162,     0,     0,     0,     0,     0,   128,   126,
+     127,     0,   222,   221,   220,     0,   131,     0,     0,     0,
+       0,     0,     0,   191,     5,     0,     0,     0,     0,     0,
+     226,   227,     0,   309,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   233,   234,   235,
+       0,     0,     0,     0,     0,   255,     0,   256,     0,   257,
+     261,   103,    94,     0,   248,     0,     0,   248,     0,   196,
+       0,   197,     0,     0,     0,     0,     0,     0,     0,     0,
+     122,     0,     0,     0,     0,     0,     0,     0,     0,    90,
+       0,   187,     0,   206,   211,     0,   180,     0,     0,   183,
+     184,     0,   136,     0,     0,     0,     0,     0,     0,     0,
+     202,   192,   185,     0,   200,    55,    54,     0,     0,     0,
+       0,     0,     0,     0,    34,   111,     0,   248,    97,     0,
+       0,   239,     0,   241,   242,     0,     0,     0,   248,   195,
+     248,   248,   188,     0,   327,   328,   329,   330,     0,    28,
+     260,   225,   280,   130,   129,     0,     0,   260,    96,    43,
+      44,     0,     0,   263,     0,   190,   225,     0,   181,   193,
+     182,     0,   134,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   123,    99,     0,
+      69,     0,     0,     0,   259,   258,   194,   189,   186,    66,
+       0,    37,    88,   230,   231,    95,     0,     0,     0,     0,
+      87,   207,   124,     0,     0,     0,     0,     0,     0,   125,
+       0,   268,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,   113,     0,   112,     0,     0,     0,     0,   268,   264,
+     267,   266,   265,     0,     0,     0,     0,     0,    64,     0,
+       0,     0,     0,    98,   243,   240,    20,   240,     0,     0,
+     208,     0,     0,    18,    19,   201,   199,    65,     0,    30,
+       0,     0,     0,   232,    23,    22,    21,   114,     0,     0,
+       0,   269,     0,    29,     0,    31,    32,     0,    33,   236,
+     237,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   245,   232,   244,     0,     0,
+       0,     0,   271,     0,   270,     0,   292,     0,   294,     0,
+     293,     0,   291,     0,   299,     0,   300,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     243,   230,   242,     0,     0,     0,     0,   269,     0,   268,
-       0,   290,     0,   292,     0,   291,     0,   289,     0,   297,
-       0,   298,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   245,   244,     0,   266,   266,
-     270,   271,   294,   296,   295,   293,   299,   300,    35,    16,
-      17
+     247,   246,     0,   268,   268,   272,   273,   296,   298,   297,
+     295,   301,   302,    35,    16,    17
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    60,    61,    62,   361,   168,   745,   715,   957,   601,
-     604,   939,   348,   372,   487,   489,   652,   908,   913,   948,
-     220,   309,   638,    64,   117,   221,   345,   288,   950,   953,
-     289,   362,   363,    67,    68,    69,   166,    93,    70,    77,
-     812,   626,   627,   109,    78,    79,    80
+      -1,    63,    64,    65,   366,   173,   750,   720,   962,   606,
+     609,   944,   353,   377,   492,   494,   657,   913,   918,   953,
+     225,   314,   643,    67,   122,   226,   350,   293,   955,   958,
+     294,   367,   368,    70,    71,    72,   171,    96,    73,    80,
+     817,   631,   632,   114,    81,    82,    83
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -907
+#define YYPACT_NINF -875
 static const yytype_int16 yypact[] =
 {
-     878,  -907,  -120,   291,  -907,   614,   439,  -907,  -907,   -35,
-     -11,    31,    61,    81,  -907,  -907,  -907,  -907,  -907,  -907,
-    -907,   183,   202,  -907,  -907,  -907,   291,   291,   -56,   291,
-    -907,   351,   291,   291,   354,    96,   111,    86,   160,   162,
-     168,   122,   170,   172,   318,   134,   146,   196,   200,   217,
-     228,  -907,   230,   233,   252,    46,   207,    26,   318,  -907,
-     412,  -907,   -48,   195,   324,   270,   274,   394,   271,  -907,
-    -907,   418,   291,   291,   291,  -907,  -907,  -907,  -907,  -907,
-     561,    55,    69,    71,   482,   421,    80,   107,    70,  -907,
-    -907,  -907,     5,  -107,   414,   419,   422,   440,   121,  -907,
-    -907,  -907,  -907,   291,   465,    42,  -907,  -907,   321,  -907,
-    -907,    52,  -907,  -907,   479,   489,   495,  -907,   502,  -907,
-     520,  -907,   558,  -907,   560,   569,   593,  -907,   594,   599,
-     604,   609,   630,   640,   643,  -907,  -907,   638,   650,    27,
-     657,   -22,   237,   663,   667,  -907,  1024,  -907,  -907,  -907,
-     186,     9,  -907,   568,   272,   186,   186,   186,   547,   186,
-     174,   291,  -907,  -907,   548,  -907,  -907,   147,   556,   555,
-    -907,  -907,   459,   291,   291,   291,   291,   291,   291,   291,
-     291,   291,   291,  -907,  -907,  -907,  -907,  -907,  -907,   562,
-     563,   564,   565,   567,   570,  -907,  -907,  -907,   572,   573,
-     574,   508,  -907,   575,   645,   -52,   159,   201,  -907,  -907,
-     697,   698,   703,   705,   706,   576,   577,    20,   708,   668,
-     579,   580,   271,   581,  -907,  -907,  -907,   582,  -907,   239,
-     583,   320,  -907,   585,  -907,  -907,  -907,  -907,  -907,  -907,
-     586,   587,   725,   145,    15,   654,   411,   717,   718,   591,
-     272,  -907,   271,  -907,   598,   659,   597,   689,   588,   601,
-     690,   606,   607,   -46,   -39,   -37,    -4,   605,   301,   323,
-    -907,   610,   613,   615,   616,   617,   618,   619,   621,   671,
-     291,    47,   740,   291,  -907,  -907,  -907,   744,   291,   620,
-     622,  -907,   -47,   548,  -907,   746,   742,   623,   626,   627,
-     629,   186,   631,   291,   291,   291,   653,  -907,   644,  -907,
-     -42,   -31,   374,   291,  -907,   608,   571,  -907,   600,   397,
-     397,  -907,  -907,   510,   510,   763,   765,   766,   768,   769,
-     760,   771,   772,   773,   774,   775,   776,   641,  -907,  -907,
-    -907,  -907,   291,   291,   291,   777,   779,   219,  -907,   778,
-    -907,  -907,   646,   647,   648,   649,   652,   655,   780,   786,
-     745,   403,   394,   394,   274,   656,   382,   186,   789,   791,
-     661,   249,  -907,   688,   218,   260,   268,   795,   186,   186,
-     186,   796,   798,   154,  -907,  -907,  -907,  -907,   687,   800,
-      33,   291,   291,   291,   805,   792,   670,   672,   804,   274,
-     673,   674,   291,   807,  -907,   808,  -907,  -907,   811,   812,
-     813,   675,  -907,  -907,  -907,  -907,  -907,  -907,   291,   676,
-     816,   291,   678,   291,   291,   291,   818,   291,   291,   291,
-    -907,   819,   683,   749,   291,   686,     0,   684,   685,   753,
-    -907,  1024,  -907,  -907,   692,  -907,   186,   186,   817,   820,
-     700,   210,  -907,  -907,  -907,   693,   704,   723,  -907,   730,
-    -907,   762,   770,   271,   709,   710,   711,   712,   713,   719,
-     722,   726,   727,   728,  -907,  -907,  -907,   843,   646,   647,
-     646,    24,   105,   721,   729,   731,    87,  -907,   738,  -907,
-     851,   852,   856,   305,   301,   464,   867,  -907,   732,  -907,
-     869,   291,   733,   739,   741,   743,   870,   759,   781,   782,
-     737,   737,  -907,  -907,   737,   737,   783,  -907,  -907,  -907,
-     784,   785,   787,   788,   790,   793,   794,   797,   799,  -907,
-     799,   801,   802,   871,   896,   481,   806,  -907,   897,   809,
-     847,   810,   814,   815,   821,  -907,   822,   842,   823,   824,
-     853,   828,   833,   834,   803,   835,   837,   838,  -907,   827,
-     924,   840,   855,   928,   857,   861,   865,   940,   825,   291,
-     872,   899,   890,  -907,  -907,   186,  -907,  -907,   826,  -907,
-     844,   845,    11,    40,  -907,   947,   291,   291,   291,   291,
-     952,   943,   954,   945,   956,   894,  -907,  -907,  -907,   978,
-     428,  -907,   979,   487,  -907,  -907,  -907,   982,   848,    44,
-      73,   849,  -907,   647,   646,  -907,  -907,   291,   850,   983,
-     291,   854,   858,  -907,   862,   839,  -907,   873,  -907,  -907,
-     987,   988,   990,   919,  -907,  -907,  -907,   882,  -907,  -907,
-    -907,  -907,   291,   291,   859,  1001,  1003,  -907,   513,   186,
-     186,   914,  -907,  -907,  1007,  -907,  -907,   799,   997,   881,
-    -907,   949,  1025,   291,  -907,  -907,  -907,  -907,   955,  1041,
-     980,   981,   178,  -907,  -907,  -907,   186,  -907,  -907,  -907,
-     923,  -907,   957,   238,   926,   925,  1061,  1064,  -907,  -907,
-     133,   186,   186,   933,   186,  -907,  -907,   186,  -907,   186,
-     932,   935,   936,   937,   938,   939,   941,   942,   944,   946,
-     291,   999,  -907,  -907,  -907,   948,  1000,   950,   951,  1002,
-    -907,   959,  -907,   973,  -907,  -907,  -907,  -907,   953,   575,
-     958,   960,   575,  1014,  -907,   477,  -907,  1009,   962,   964,
-     394,   965,   966,   967,   566,  -907,   968,   969,   970,   971,
-     961,   976,   974,   984,  -907,   977,  -907,   394,  1011,  -907,
-    1085,  -907,  1078,  1089,  -907,  -907,   989,  -907,   991,   972,
-     986,  1090,  1091,   291,  1096,  -907,  -907,  -907,  1115,  -907,
-    -907,  -907,  1117,   186,   291,  1124,  1126,  1128,  1129,  -907,
-    -907,   859,   575,   993,   995,  1132,  -907,  1133,  -907,  -907,
-    1111,   998,  1004,   575,  -907,   575,   575,  -907,   291,  -907,
-    -907,  -907,  -907,   186,  -907,   647,   271,  -907,  -907,  -907,
-    1006,  1020,   647,  -907,  -907,  -907,   313,  1135,  -907,  1092,
-    -907,   271,  1136,  -907,  -907,  -907,   859,  -907,  1137,  1139,
-    1013,  1021,  1023,  1099,  1026,  1027,  1029,  1031,  1034,  1035,
-    1036,  1037,  -907,  -907,  1065,  -907,   398,   612,  1098,  -907,
-    -907,  -907,  -907,  -907,  -907,  1130,  -907,  -907,  -907,  -907,
-    -907,  1039,  1044,  1042,  1163,  -907,  1113,  -907,  1043,  1046,
-     291,   611,  1109,   291,  -907,  1082,  1047,   291,   291,   291,
-     291,  1049,  1183,  1186,  1180,   186,  -907,  1187,  -907,  1143,
-     291,   291,   291,  1047,  -907,  -907,  -907,  -907,  1054,   925,
-    1055,  1056,  1083,  -907,  1057,  1059,  1060,  1062,  -907,  1063,
-     802,  -907,   802,  1066,  1201,  -907,  1067,  1069,  -907,  -907,
-    -907,  -907,  -907,  1068,  1070,  1071,  1071,  1072,   476,  -907,
-    -907,  -907,  -907,  1073,  1203,  1205,  -907,   557,  -907,   332,
-    -907,  -907,   553,  -907,  -907,  -907,   167,   380,  1196,  1077,
-    1079,   391,   408,   413,   453,   456,   462,   499,   506,   584,
-    -907,   428,  -907,  1076,   291,   291,  1103,  -907,  1105,  -907,
-    1106,  -907,  1107,  -907,  1108,  -907,  1110,  -907,  1112,  -907,
-    1114,  -907,  1080,  1084,  1176,  1088,  1093,  1094,  1095,  1097,
-    1100,  1101,  1102,  1104,  1116,  -907,  -907,  1216,  1047,  1047,
-    -907,  -907,  -907,  -907,  -907,  -907,  -907,  -907,  -907,  -907,
-    -907
+     862,  -875,   -87,   -20,  -875,   493,   421,  -875,  -875,    -8,
+      25,    44,    56,    93,  -875,  -875,  -875,  -875,  -875,  -875,
+    -875,  -875,   213,   241,  -875,  -875,  -875,   -20,   -20,    67,
+     -20,   -20,   -20,  -875,   205,   -20,   -20,   263,   134,   147,
+     154,   161,   163,   179,   209,   220,   233,   459,   245,   251,
+     253,   259,   286,   306,  -875,   316,   336,   345,    28,   492,
+      22,   459,  -875,   511,  -875,   -11,   208,   443,     1,   356,
+     522,   400,  -875,  -875,   542,   -20,   -20,   -20,  -875,  -875,
+    -875,  -875,  -875,   605,   126,   168,   171,   499,   554,   192,
+     214,   105,  -875,  -875,  -875,    10,   -60,   547,   557,   576,
+     581,    88,  -875,  -875,  -875,  -875,   -20,   602,  -875,  -875,
+      59,  -875,  -875,   471,  -875,  -875,   130,  -875,  -875,   619,
+     635,   638,  -875,   639,  -875,   640,  -875,   643,  -875,   648,
+     653,   656,  -875,   655,   658,   659,   661,   667,   672,   673,
+    -875,  -875,   664,   676,    27,   681,   118,   189,   684,   683,
+    -875,  1008,  -875,  -875,  -875,   149,     8,  -875,   641,    -2,
+     149,   149,   149,   549,   149,   123,   -20,  -875,  -875,   551,
+    -875,  -875,   117,   560,   564,  -875,  -875,   559,   -20,   -20,
+     -20,   -20,   -20,   -20,   -20,   -20,   -20,   -20,  -875,  -875,
+    -875,  -875,  -875,  -875,   556,   563,   565,   566,   567,   568,
+    -875,  -875,  -875,   569,   570,   571,   624,  -875,   572,   649,
+     -33,   222,   275,  -875,  -875,   701,   710,   711,   712,   713,
+     577,   578,   102,   714,   674,   580,   583,   400,   584,  -875,
+    -875,  -875,   585,  -875,   330,   586,   376,  -875,   587,  -875,
+    -875,  -875,  -875,  -875,  -875,   589,   590,   718,   409,   -16,
+     657,   237,   720,   721,   594,    -2,  -875,   400,  -875,   596,
+     662,   597,   690,   591,   601,   693,   608,   609,   -40,   -19,
+      36,    54,   606,   232,   295,  -875,   611,   612,   613,   614,
+     615,   616,   617,   618,   678,   -20,    46,   751,   -20,  -875,
+    -875,  -875,   752,   -20,   620,   622,  -875,    -1,   551,  -875,
+     753,   745,   625,   626,   623,   629,   149,   630,   -20,   -20,
+     -20,   665,  -875,   654,  -875,   -50,    55,   454,   -20,  -875,
+     153,   481,  -875,   403,   352,   352,  -875,  -875,   430,   430,
+     766,   767,   768,   769,   770,   761,   772,   773,   774,   775,
+     776,   777,   642,  -875,  -875,  -875,  -875,   -20,   -20,   -20,
+     778,   780,   225,  -875,   781,  -875,  -875,   644,   645,   650,
+     651,   652,   660,   786,   787,   744,   436,   522,   522,   356,
+     663,   350,   149,   791,   792,   666,   325,  -875,   688,   278,
+     293,   318,   795,   149,   149,   149,   796,   797,   137,  -875,
+    -875,  -875,  -875,   689,   800,    57,   -20,   -20,   -20,   806,
+     793,   671,   675,   805,   356,   670,   677,   -20,   807,  -875,
+     810,  -875,  -875,   811,   812,   813,   680,  -875,  -875,  -875,
+    -875,  -875,  -875,   -20,   682,   814,   -20,   685,   -20,   -20,
+     -20,   815,   -20,   -20,   -20,  -875,   816,   686,   748,   -20,
+     691,   138,   687,   694,   750,  -875,  1008,  -875,  -875,   695,
+    -875,   149,   149,   818,   820,   702,    74,  -875,  -875,  -875,
+     707,   708,   715,  -875,   729,  -875,   779,   783,   400,   717,
+     716,   722,   723,   725,   731,   733,   765,   771,   782,  -875,
+    -875,  -875,   817,   644,   645,   644,   204,   297,   709,   762,
+     784,   162,  -875,   730,  -875,   836,   889,   891,   387,   232,
+     381,   902,  -875,   785,  -875,   904,   -20,   789,   788,   790,
+     798,   905,   799,   801,   802,   794,   794,  -875,  -875,   794,
+     794,   804,  -875,  -875,  -875,   808,   803,   809,   821,   819,
+     824,   825,   826,   827,  -875,   827,   828,   829,   896,   897,
+     292,   822,  -875,   898,   831,   843,   832,   833,   834,   835,
+    -875,   837,   838,   839,   841,   840,   845,   849,   859,   842,
+     860,   861,   865,  -875,   852,   911,   867,   846,   913,   847,
+     851,   853,   915,   863,   -20,   857,   873,   883,  -875,  -875,
+     149,  -875,  -875,   877,  -875,   869,   875,    15,    21,  -875,
+     924,   -20,   -20,   -20,   -20,   942,   933,   944,   935,   946,
+     882,  -875,  -875,  -875,   948,   223,  -875,   954,   341,  -875,
+    -875,  -875,   972,   907,   242,   362,   908,  -875,   645,   644,
+    -875,  -875,   -20,   906,   973,   -20,   909,   910,  -875,   912,
+     830,  -875,   914,  -875,  -875,   975,  1047,  1049,   978,  -875,
+    -875,  -875,   945,  -875,  -875,  -875,  -875,   -20,   -20,   917,
+    1042,  1046,  -875,   402,   149,   149,   957,  -875,  -875,  1048,
+    -875,  -875,   827,  1059,   921,  -875,   989,  1062,   -20,  -875,
+    -875,  -875,  -875,   991,  1064,   993,   994,   156,  -875,  -875,
+    -875,   149,  -875,  -875,  -875,   931,  -875,   963,   260,   936,
+     934,  1069,  1071,  -875,  -875,   419,   149,   149,   941,   149,
+    -875,  -875,   149,  -875,   149,   940,   943,   949,   950,   951,
+     952,   953,   955,   956,   958,   -20,  1004,  -875,  -875,  -875,
+     964,  1005,   965,   967,  1012,  -875,   968,  -875,   980,  -875,
+    -875,  -875,  -875,   947,   572,   960,   969,   572,  1022,  -875,
+     321,  -875,  1018,   971,   974,   522,   976,   977,   979,   457,
+    -875,   981,   982,   983,   984,   961,   990,   985,   987,  -875,
+     970,  -875,   522,  1032,  -875,  1111,  -875,  1104,  1116,  -875,
+    -875,   988,  -875,   995,  1003,  1006,  1126,  1127,   -20,  1141,
+    -875,  -875,  -875,  1142,  -875,  -875,  -875,  1145,   149,   -20,
+    1144,  1150,  1151,  1152,  -875,  -875,   917,   572,  1016,  1019,
+    1154,  -875,  1156,  -875,  -875,  1153,  1021,  1024,   572,  -875,
+     572,   572,  -875,   -20,  -875,  -875,  -875,  -875,   149,  -875,
+     645,   400,  -875,  -875,  -875,  1025,  1026,   645,  -875,  -875,
+    -875,   363,  1158,  -875,  1117,  -875,   400,  1164,  -875,  -875,
+    -875,   917,  -875,  1165,  1166,  1033,  1031,  1034,  1113,  1035,
+    1036,  1037,  1039,  1043,  1044,  1045,  1050,  -875,  -875,  1066,
+    -875,   573,   500,  1131,  -875,  -875,  -875,  -875,  -875,  -875,
+    1136,  -875,  -875,  -875,  -875,  -875,  1051,  1053,  1052,  1171,
+    -875,  1120,  -875,  1055,  1056,   -20,   548,  1110,   -20,  -875,
+    1083,  1054,   -20,   -20,   -20,   -20,  1057,  1192,  1194,  1188,
+     149,  -875,  1195,  -875,  1155,   -20,   -20,   -20,  1054,  -875,
+    -875,  -875,  -875,  1060,   934,  1063,  1065,  1087,  -875,  1067,
+    1068,  1070,  1072,  -875,  1073,   829,  -875,   829,  1075,  1206,
+    -875,  1077,  1080,  -875,  -875,  -875,  -875,  -875,  1078,  1076,
+    1079,  1079,  1081,   410,  -875,  -875,  -875,  -875,  1082,  1205,
+    1207,  -875,   465,  -875,   288,  -875,  -875,   504,  -875,  -875,
+    -875,   432,   441,  1210,  1088,  1089,   446,   449,   475,   476,
+     477,   478,   484,   485,   488,  -875,   223,  -875,  1085,   -20,
+     -20,  1106,  -875,  1105,  -875,  1114,  -875,  1115,  -875,  1118,
+    -875,  1119,  -875,  1121,  -875,  1122,  -875,  1091,  1092,  1178,
+    1095,  1098,  1099,  1100,  1101,  1102,  1103,  1107,  1108,  1109,
+    -875,  -875,  1230,  1054,  1054,  -875,  -875,  -875,  -875,  -875,
+    -875,  -875,  -875,  -875,  -875,  -875
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -907,  -907,  -907,  -122,    10,  -208,  -737,  -906,   284,  -907,
-    -509,  -907,  -196,  -907,  -451,  -460,  -502,  -907,  -863,  -907,
-    -907,   975,   -69,  -907,   -27,  -907,   402,  -180,   325,  -907,
-    -243,     2,    22,  -168,   963,  -213,   -50,    59,  -907,   -16,
-    -907,  -907,  -907,  1220,  -907,   -26,    19
+    -875,  -875,  -875,  -129,    26,  -221,  -700,  -874,   294,  -875,
+    -512,  -875,  -192,  -875,  -443,  -463,  -500,  -875,  -815,  -875,
+    -875,   986,  -287,  -875,   -30,  -875,   406,  -176,   331,  -875,
+    -250,     2,    17,  -140,   959,  -206,   -54,    19,  -875,   -17,
+    -875,  -875,  -875,  1236,  -875,   -27,    24
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -1761,266 +1806,268 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -3
 static const yytype_int16 yytable[] =
 {
-     101,   102,    65,   104,   365,   106,   107,   110,   113,   350,
-      63,   119,   121,   123,   370,   162,   165,   108,   108,   597,
-     296,   346,    66,   655,   292,   419,   422,   596,   653,   598,
-     146,   441,   956,   232,   222,   294,   234,   400,   411,   163,
-     928,     7,     8,    71,   401,   411,   360,   411,   252,   364,
-       7,     8,   142,   279,   852,   184,   186,   188,   223,   235,
-     226,   228,   136,    94,   389,   993,   395,   161,   256,   257,
-       7,     8,   253,   433,   139,   160,   164,   254,   259,   260,
-     411,   183,   399,    72,   280,   284,   285,    95,   418,   421,
-      73,   170,   171,   172,   219,   185,   229,   187,   231,   877,
-       7,     8,   526,   128,   434,    72,   225,   103,   251,   143,
-     140,   347,    73,   147,   442,    72,   457,   144,    72,   412,
-     458,   527,    73,   502,   172,    73,   413,   459,   414,    96,
-     172,   460,    72,   227,    72,   307,   282,   240,   283,    73,
-     241,    73,   242,    72,   243,  1019,  1020,   244,    65,   245,
-      73,     7,     8,   726,   233,   754,    63,   246,   563,    97,
-     293,   415,   564,   727,   297,   298,   299,   300,    66,   302,
-      72,   385,   295,   171,   697,     7,     8,    73,   388,    98,
-     522,   386,   599,    74,    72,   351,   501,   600,    75,    76,
-     523,    73,   315,   316,   317,   318,   319,   320,   321,   322,
-     323,   324,   721,   699,   764,    74,   722,   247,   248,    99,
-      75,    76,   608,   609,   765,    74,     7,     8,    74,   230,
-      75,    76,    72,    75,    76,   170,   171,   352,   100,    73,
-     610,   723,    74,   141,    74,   724,   172,    75,    76,    75,
-      76,   769,   770,    74,   510,   249,   576,   771,    75,    76,
-     116,   618,   621,   387,   432,   584,   135,   436,   772,   114,
-       7,     8,   438,   602,    72,   303,   304,   305,   603,   172,
-      74,    73,   148,    72,   115,    75,    76,   452,   453,   454,
-      73,    72,   310,   311,   250,   124,   512,   464,    73,    75,
-      76,   778,   659,   148,   514,   779,   152,   129,   149,   150,
-       7,     8,     7,     8,     7,     8,   153,   284,   285,   130,
-     153,   450,   162,   165,   617,   620,   478,   479,   480,   568,
-     286,   287,    74,    72,   118,   969,   120,    75,    76,   970,
-      73,    72,   122,    72,   125,    72,   126,   306,    73,   871,
-     154,   615,    73,     7,     8,   374,   375,   155,   511,   513,
-     515,   376,   483,   484,    72,   866,   156,   157,   158,   131,
-     159,    73,   870,   132,    74,   528,   529,   530,    72,    75,
-      76,   284,   285,    74,   498,    73,   539,   503,    75,    76,
-     133,    74,   507,   508,   286,   417,    75,    76,   517,   518,
-     519,   134,   546,   284,   285,   549,   137,   551,   552,   553,
-     461,   555,   556,   557,     7,     8,   286,   420,   561,   536,
-     462,   940,   145,   941,    72,   138,   127,    72,    89,    90,
-      91,    73,   151,    74,    73,   577,   378,   379,    75,    76,
-     153,    74,   380,    74,   167,    74,    75,    76,    75,    76,
-      75,    76,   639,    65,   169,   640,   641,   224,   571,   572,
-     236,    63,   284,   285,    74,   237,   570,   570,   238,    75,
-      76,   963,   964,    66,   175,   286,   500,   616,    74,   179,
-     180,   965,   966,    75,    76,   628,   239,   338,   339,   340,
-     341,   284,   285,   296,   365,   625,   400,   189,   190,   191,
-     192,   255,   193,   194,   258,   195,   196,   197,   198,   199,
-     200,   148,   391,   392,   393,   261,   149,   497,   201,   394,
-     202,   203,     7,     8,   105,   262,   204,   111,   205,    75,
-      76,   263,    75,    76,   173,   174,   175,   176,   264,   177,
-     178,   179,   180,   804,   284,   285,   807,    88,   971,    89,
-      90,    91,   972,   690,    92,   206,   265,   286,   619,   976,
-     181,   182,   207,   977,   712,   713,   714,   208,   209,   210,
-     701,   702,   703,   704,   286,   658,   978,   211,   212,   213,
-     979,   980,   214,   334,   335,   981,   336,   175,   284,   337,
-     177,   178,   179,   180,   266,   693,   267,   338,   339,   340,
-     341,   728,   698,   251,   731,   268,   853,   954,   955,   342,
-     343,   344,   712,   713,   714,   215,   216,   861,   867,   862,
-     863,   982,   717,   718,   984,   983,   742,   743,   985,   269,
-     986,   314,   270,   875,   987,   271,   173,   174,   175,   176,
-     272,   177,   178,   179,   180,   273,   173,   759,   175,   176,
-     296,   177,   178,   179,   180,   217,   218,   809,   810,   811,
-      75,    76,   181,   182,   748,   749,   274,   988,   775,   750,
-     751,   989,   181,   182,   990,   173,   275,   175,   991,   276,
-     177,   178,   179,   180,   277,   175,   278,   893,   177,   178,
-     179,   180,   284,   285,   794,   281,   766,   820,   821,   290,
-     816,   181,   182,   961,   962,   291,   783,   967,   968,   181,
-     182,   780,   781,    81,   570,   954,   955,   831,    82,    83,
-     301,   308,    84,    85,   312,   313,   349,    86,    87,   904,
-     905,   906,   907,   353,   354,   325,   326,   327,   328,   355,
-     329,   356,   357,   330,   366,   331,   332,   333,   347,   367,
-     358,   359,   368,   369,   371,   373,   377,   842,   381,   382,
-     383,   384,   390,   396,   397,   398,   402,   403,   847,   404,
-     405,   408,   406,   407,   409,   410,   435,   416,   423,   431,
-     437,   424,   444,   425,   426,   427,   428,   429,   445,   455,
-     456,   446,   864,   430,   447,   439,   448,   440,   449,   465,
-     451,   466,   467,   846,   468,   469,   470,   471,   472,   473,
-     474,   475,   476,   481,   477,   482,   494,   490,   491,   486,
-     488,   492,   495,   485,   493,   504,   496,   505,   499,   506,
-     509,   516,   520,   865,   521,   524,   525,   531,   532,   533,
-     535,   534,   538,   540,   541,   537,   872,   542,   543,   544,
-     545,   547,   548,   550,   554,   558,   559,   560,   562,   565,
-     566,   567,   569,   573,   903,   578,   574,   910,   575,   580,
-     582,   914,   915,   916,   917,   581,   579,   585,   583,   595,
-     586,   587,   588,   589,   925,   926,   927,   590,    -2,     1,
-     591,   611,   930,   605,   592,   593,   594,   612,   613,   607,
-       2,   606,   614,   622,   623,   624,   633,   630,   629,   631,
-     637,   632,     3,     4,     5,   922,     6,   656,     7,     8,
+     104,   105,    68,   107,   108,   109,   375,   111,   112,   115,
+     118,   124,   126,   128,   167,   170,   370,    69,   355,   113,
+     113,   602,   297,   424,   427,   660,    66,   157,     7,     8,
+     351,     7,     8,   227,   299,   658,   406,   158,   237,   301,
+     601,   168,   603,    75,   416,     7,     8,   257,   147,   405,
+      76,     7,     8,   284,   289,   290,   144,   189,   191,   193,
+     228,    75,   231,   233,    75,   416,   133,   151,    76,   961,
+     166,   159,   438,   394,   258,   400,    74,   446,   160,   259,
+     149,   141,   369,   239,   285,   261,   262,   161,   162,   163,
+      97,   164,   145,   933,   165,   169,   857,   423,   426,   175,
+     176,   177,   998,   439,   245,   148,   240,   246,   462,   247,
+     581,   248,   463,   224,   249,   404,   250,   236,     7,     8,
+     416,   507,    75,    98,   251,   417,   531,   256,   365,    76,
+     352,   234,     7,     8,   177,     7,     8,    75,   416,   312,
+     177,   882,    99,    77,    76,   532,   418,   393,    78,    79,
+     152,    75,   188,    68,   100,   731,   264,   265,    76,   238,
+     447,    77,   759,   527,    77,    75,    78,    79,    69,    78,
+      79,   300,    76,   528,   252,   253,   732,    66,   702,     7,
+       8,   298,   769,   176,   704,   302,   303,   304,   305,    75,
+     307,   101,   770,    75,   190,   506,    76,   192,  1024,  1025,
+      76,   419,   320,   321,   322,   323,   324,   325,   326,   327,
+     328,   329,   254,   464,   308,   309,   310,   465,   230,   420,
+     180,   153,    77,   182,   183,   184,   185,    78,    79,   644,
+     106,    75,   645,   646,    75,   175,   176,    77,    76,   102,
+     232,    76,    78,    79,   186,   187,   177,   589,   356,   623,
+     626,   255,   315,   316,   235,    75,    78,    79,   437,   289,
+     290,   441,    76,   774,   775,    77,   443,   103,    75,   776,
+      78,    79,   291,   292,   392,    76,   287,    75,   288,   177,
+     777,   457,   458,   459,    76,    75,   311,   613,   614,    77,
+     664,   469,    76,    77,    78,    79,   568,   119,    78,    79,
+     569,   357,   289,   290,   515,   615,   153,   289,   290,   301,
+     120,   154,   155,   167,   170,   291,   422,   573,   121,   517,
+     483,   484,   485,   622,   625,   123,    75,   125,   396,   397,
+     398,    77,   455,    76,    77,   399,    78,    79,    75,    78,
+      79,    75,   140,   127,   519,    76,     7,     8,    76,   717,
+     718,   719,   516,   518,   520,    77,    75,   871,   488,   489,
+      78,    79,   604,    76,   875,   289,   290,   605,   110,   533,
+     534,   535,   129,    78,    79,   291,   663,    77,   291,   425,
+     544,    75,    78,    79,   130,    77,     7,     8,    76,   876,
+      78,    79,   158,     7,     8,   503,   551,   131,   508,   554,
+     726,   556,   557,   558,   727,   560,   561,   562,   134,   522,
+     523,   524,   566,   945,   135,   946,   136,   968,   969,   180,
+     289,   290,   137,   620,   184,   185,   116,   970,   971,   582,
+     541,    78,    79,   291,   505,   390,   379,   380,    77,     7,
+       8,    77,   381,    78,    79,   391,    78,    79,    68,   138,
+      75,   289,   290,   576,   577,   607,    77,    76,   512,   513,
+     608,    78,    79,    69,   291,   624,   722,   723,   178,   139,
+     180,   621,    66,   182,   183,   184,   185,   575,   575,   633,
+     466,    77,   383,   384,     7,     8,    78,    79,   385,   630,
+     467,   814,   815,   816,   186,   187,   370,   180,   405,   142,
+     182,   183,   184,   185,   194,   195,   196,   197,   143,   198,
+     199,   150,   200,   201,   202,   203,   204,   205,   146,    91,
+     728,    92,    93,    94,   729,   206,    95,   207,   208,     7,
+       8,   959,   960,   209,   153,   210,   717,   718,   719,   154,
+     502,   156,   809,   753,   754,   812,   178,   695,   180,   181,
+      77,   182,   183,   184,   185,    78,    79,   132,   158,    92,
+      93,    94,   211,   172,   706,   707,   708,   709,   174,   212,
+     289,   290,   186,   187,   213,   214,   215,   783,   825,   826,
+     229,   784,    84,   241,   216,   217,   218,    85,    86,   219,
+     974,    87,    88,   242,   975,   733,    89,    90,   736,   976,
+     872,   966,   967,   977,   981,   858,   698,   983,   982,   959,
+     960,   984,   243,   703,   256,   880,   866,   244,   867,   868,
+     747,   748,   220,   221,   178,   179,   180,   181,   260,   182,
+     183,   184,   185,   985,   987,   989,   991,   986,   988,   990,
+     992,   764,   993,   995,   263,   266,   994,   996,   972,   973,
+     186,   187,   343,   344,   345,   346,   909,   910,   911,   912,
+     780,   267,   222,   223,   268,   269,   270,    78,    79,   271,
+     178,   179,   180,   181,   272,   182,   183,   184,   185,   273,
+     755,   756,   274,   275,   276,   277,   898,   278,   799,   339,
+     340,   821,   341,   279,   289,   342,   186,   187,   280,   281,
+     282,   788,   283,   343,   344,   345,   346,   771,   836,   286,
+     295,   296,   306,   301,   313,   347,   348,   349,   317,   330,
+     354,   319,   785,   786,   318,   575,   331,   358,   332,   333,
+     334,   335,   336,   337,   338,   352,   359,   360,   361,   362,
+     371,   363,   364,   373,   389,   372,   374,   376,   378,   382,
+     386,   847,   387,   388,   407,   395,   401,   402,   403,   409,
+     408,   410,   852,   412,   413,   411,   414,   415,   421,   428,
+     429,   430,   431,   432,   433,   434,   436,   440,   442,   449,
+     435,   450,   453,   451,   452,   444,   869,   445,   454,   456,
+     461,   460,   470,   471,   472,   473,   474,   475,   476,   477,
+     478,   479,   480,   481,   486,   482,   487,   491,   493,   495,
+     496,   497,   499,   500,   851,   501,   490,   509,   510,   498,
+     514,   521,   525,   526,   511,   504,   530,   529,   536,   537,
+     538,   540,   542,   545,   539,   543,   546,   547,   548,   549,
+     553,   559,   563,   600,   870,   550,   565,   552,   572,   564,
+     555,   585,   570,   567,   578,   574,   579,   877,   908,   571,
+     580,   915,    -2,     1,   586,   919,   920,   921,   922,   583,
+     584,   610,   617,   616,     2,   590,   591,   587,   930,   931,
+     932,   588,   592,   593,   935,   594,     3,     4,     5,   595,
+       6,   596,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,   597,   611,   618,   927,   619,   627,   598,
+     629,   638,   661,   662,   666,   668,   674,   686,   677,   689,
+     599,   693,   612,   696,   688,   690,   635,   628,   636,   691,
+     705,   692,  1000,  1001,   634,   153,   637,   642,    38,    39,
+     697,   639,   647,   640,   641,   649,   648,   650,   710,   711,
+     712,   713,   714,   715,   716,    40,    41,    42,    43,   651,
+     721,   652,    44,   685,   665,    45,    46,   653,   654,   655,
+     656,   659,   608,   667,   669,   670,   671,   672,   724,   735,
+     681,   742,   673,   740,   675,    47,   676,   678,    48,    49,
+      50,   679,    51,    52,    53,    54,    55,    56,    57,    58,
+       2,   680,   682,   683,   694,    59,    60,   684,    61,    62,
+     687,   700,     3,     4,     5,   699,     6,   701,     7,     8,
        9,    10,    11,    12,    13,    14,    15,    16,    17,    18,
-      19,   634,    20,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,   657,   661,    30,    31,    32,    33,    34,   663,
-     669,   642,   643,   635,   636,   645,   646,   644,   995,   996,
-     681,   672,   647,   683,   684,   685,   648,   649,   680,   686,
-     650,   676,   651,   687,   654,   603,   688,   692,   660,   691,
-     148,   662,   664,   700,    35,    36,   665,   666,   705,   706,
-     707,   708,   709,   667,   694,   710,   689,   668,   670,   671,
-     673,    37,    38,    39,    40,   674,   675,   677,    41,   678,
-     679,    42,    43,   682,   711,   716,   695,   696,   719,   730,
-     720,   725,   735,   737,   738,   729,   739,   740,   741,   732,
-     733,    44,   744,   755,    45,    46,    47,   734,    48,    49,
-      50,    51,    52,    53,    54,    55,     2,   746,   736,   747,
-     752,    56,    57,   753,    58,    59,   756,   757,     3,     4,
-       5,   758,     6,   760,     7,     8,     9,    10,    11,    12,
-      13,    14,    15,    16,    17,    18,    19,   761,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,   762,   763,
-      30,    31,    32,    33,    34,   767,   773,   776,   768,   774,
-     777,   782,   784,   785,   786,   787,   788,   795,   797,   802,
-     800,   789,   801,   790,   791,   808,   792,   813,   793,   832,
-     796,   833,   798,   799,   834,   835,   840,   841,   803,   826,
-      35,    36,   843,   805,   814,   806,   815,   817,   818,   819,
-     822,   823,   824,   825,   827,   838,   828,    37,    38,    39,
-      40,   844,   830,   858,    41,   845,   829,    42,    43,   839,
-     848,   836,   849,   837,   850,   851,   854,   855,   856,   857,
-     859,   873,   876,   878,   874,   879,   860,    44,   868,   894,
-      45,    46,    47,   880,    48,    49,    50,    51,    52,    53,
-      54,    55,   869,   411,   881,   882,   883,    56,    57,   884,
-      58,    59,   885,   886,   887,   888,   889,   890,   891,   899,
-     895,   896,   897,   901,   898,   900,   902,   909,   911,   919,
-     912,   918,   920,   921,   924,   923,   929,   931,   932,   934,
-     933,   935,   936,   943,   937,   944,   938,   945,   942,   959,
-     946,   960,   973,   947,   949,   952,   958,   974,   994,   975,
-     997,   998,  1005,   999,  1000,  1001,  1006,  1002,  1007,  1003,
-    1008,  1004,  1018,   992,   112,  1009,  1010,  1011,   892,  1012,
-       0,   951,  1013,  1014,  1015,     0,  1016,     0,   443,     0,
-       0,     0,     0,     0,     0,   463,     0,     0,  1017
+      19,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37,   725,
+     730,   734,   738,   743,   737,   744,   745,   739,   751,   741,
+     749,   746,   752,   757,   758,   760,   761,   762,   763,   765,
+     766,   767,   768,   772,   773,   781,   778,   782,   779,   787,
+     789,   790,   800,   802,    38,    39,   807,   791,   792,   793,
+     805,   806,   808,   813,   794,   795,   818,   796,   797,   831,
+     798,    40,    41,    42,    43,   810,   801,   803,    44,   804,
+     837,    45,    46,   819,   811,   835,   820,   838,   822,   823,
+     839,   824,   840,   827,   828,   829,   830,   833,   832,   834,
+     841,    47,   845,   846,    48,    49,    50,   842,    51,    52,
+      53,    54,    55,    56,    57,    58,   843,   848,   849,   844,
+     853,    59,    60,   850,    61,    62,   854,   855,   856,   859,
+     861,   860,   862,   864,   878,   863,   865,   873,   874,   879,
+     881,   883,   884,   885,   886,   888,   887,   416,   889,   896,
+     890,   891,   899,   892,   893,   894,   900,   904,   914,   916,
+     895,   902,   905,   901,   903,   906,   907,   917,   924,   923,
+     925,   926,   934,   928,   938,   936,   929,   937,   948,   939,
+     940,   964,   941,   965,   942,   949,   943,   947,   950,   952,
+     951,  1003,   954,  1002,   957,   963,   978,   999,   979,   980,
+    1012,  1004,  1005,  1010,  1011,  1006,  1007,  1013,  1008,  1009,
+    1014,  1015,  1016,  1017,  1018,  1019,  1023,   897,   997,  1020,
+    1021,  1022,   956,   117,     0,     0,   468,     0,     0,     0,
+       0,     0,     0,     0,   448
 };
 
 static const yytype_int16 yycheck[] =
 {
-      26,    27,     0,    29,   217,    31,    32,    33,    34,   205,
-       0,    38,    39,    40,   222,    65,    66,    33,    34,   479,
-      72,   201,     0,   532,   146,   268,   269,   478,   530,   480,
-      78,    78,   938,    28,    84,    26,   143,   250,    84,    65,
-     903,    30,    31,   163,   252,    84,    26,    84,    98,   217,
-      30,    31,    26,    26,   791,    81,    82,    83,    84,   166,
-      86,    87,    52,    98,   244,   971,   246,    65,    26,    27,
-      30,    31,    98,    26,    28,    65,    66,   103,    26,    27,
-      84,    26,   250,    63,    57,    70,    71,    98,   268,   269,
-      70,    72,    73,    74,    84,    26,    26,    26,    88,   836,
-      30,    31,    69,    44,    57,    63,    26,   163,    98,    83,
-      64,   163,    70,   161,   161,    63,   158,    58,    63,   165,
-     162,    88,    70,   366,   105,    70,   165,   158,   165,    98,
-     111,   162,    63,    26,    63,   161,   158,    16,   160,    70,
-      19,    70,    21,    63,    23,  1008,  1009,    26,   146,    28,
-      70,    30,    31,   613,   149,   657,   146,    36,   158,    98,
-     150,   165,   162,   614,   154,   155,   156,   157,   146,   159,
-      63,    26,   163,   154,   163,    30,    31,    70,   163,    98,
-      26,    36,   158,   163,    63,    26,   366,   163,   168,   169,
-      36,    70,   173,   174,   175,   176,   177,   178,   179,   180,
-     181,   182,   158,   163,    26,   163,   162,    86,    87,    26,
-     168,   169,   125,   126,    36,   163,    30,    31,   163,   149,
-     168,   169,    63,   168,   169,   206,   207,    26,    26,    70,
-     143,   158,   163,    26,   163,   162,   217,   168,   169,   168,
-     169,     3,     4,   163,    26,   124,    36,     9,   168,   169,
-     164,   494,   495,   243,   280,   463,    26,   283,    20,   163,
-      30,    31,   288,   158,    63,    91,    92,    93,   163,   250,
-     163,    70,    98,    63,   163,   168,   169,   303,   304,   305,
-      70,    63,   135,   136,   163,   163,    26,   313,    70,   168,
-     169,   158,   535,    98,    26,   162,    26,   163,   103,   104,
-      30,    31,    30,    31,    30,    31,    36,    70,    71,   163,
-      36,   301,   362,   363,   494,   495,   342,   343,   344,   441,
-      83,    84,   163,    63,   164,   158,   164,   168,   169,   162,
-      70,    63,   164,    63,   164,    63,   164,   163,    70,    26,
-      70,    36,    70,    30,    31,   106,   107,    77,   374,   375,
-     376,   112,   133,   134,    63,   815,    86,    87,    88,   163,
-      90,    70,   822,   163,   163,   391,   392,   393,    63,   168,
-     169,    70,    71,   163,   364,    70,   402,   367,   168,   169,
-     163,   163,   133,   134,    83,    84,   168,   169,   378,   379,
-     380,   163,   418,    70,    71,   421,   163,   423,   424,   425,
-      26,   427,   428,   429,    30,    31,    83,    84,   434,   399,
-      36,   920,     0,   922,    63,   163,    98,    63,   100,   101,
-     102,    70,    98,   163,    70,   451,   106,   107,   168,   169,
-      36,   163,   112,   163,   163,   163,   168,   169,   168,   169,
-     168,   169,   511,   441,    26,   514,   515,    26,   446,   447,
-      36,   441,    70,    71,   163,    36,   446,   447,    36,   168,
-     169,   129,   130,   441,    67,    83,    84,   493,   163,    72,
-      73,   139,   140,   168,   169,   501,    36,    79,    80,    81,
-      82,    70,    71,    72,   697,   501,   699,     5,     6,     7,
-       8,    26,    10,    11,   173,    13,    14,    15,    16,    17,
-      18,    98,    91,    92,    93,    26,   103,   104,    26,    98,
-      28,    29,    30,    31,   163,    26,    34,   163,    36,   168,
-     169,    26,   168,   169,    65,    66,    67,    68,    26,    70,
-      71,    72,    73,   729,    70,    71,   732,    98,   158,   100,
-     101,   102,   162,   569,   105,    63,    26,    83,    84,   158,
-      91,    92,    70,   162,   126,   127,   128,    75,    76,    77,
-     586,   587,   588,   589,    83,    84,   158,    85,    86,    87,
-     162,   158,    90,    65,    66,   162,    68,    67,    70,    71,
-      70,    71,    72,    73,    26,   575,    26,    79,    80,    81,
-      82,   617,   582,   583,   620,    26,   792,   121,   122,    91,
-      92,    93,   126,   127,   128,   123,   124,   803,   816,   805,
-     806,   158,   125,   126,   158,   162,   642,   643,   162,    26,
-     158,   162,    28,   831,   162,    26,    65,    66,    67,    68,
-      26,    70,    71,    72,    73,    26,    65,   663,    67,    68,
-      72,    70,    71,    72,    73,   163,   164,   170,   171,   172,
-     168,   169,    91,    92,   141,   142,    26,   158,   685,   649,
-     650,   162,    91,    92,   158,    65,    26,    67,   162,    26,
-      70,    71,    72,    73,    36,    67,    26,   857,    70,    71,
-      72,    73,    70,    71,   710,    28,   676,   121,   122,    26,
-     740,    91,    92,   136,   137,    28,   694,   144,   145,    91,
-      92,   691,   692,    89,   694,   121,   122,   757,    94,    95,
-     163,   163,    98,    99,   158,   160,    71,   103,   104,   108,
-     109,   110,   111,    26,    26,   163,   163,   163,   163,    26,
-     163,    26,    26,   163,    26,   163,   163,   163,   163,    71,
-     164,   164,   163,   163,   163,   163,   163,   773,   163,   163,
-     163,    26,    98,    36,    36,   164,   158,    98,   784,   162,
-      71,    71,   174,   162,   158,   158,    26,   162,   158,    98,
-      26,   158,    26,   158,   158,   158,   158,   158,    36,   126,
-     136,   158,   808,   162,   158,   165,   159,   165,   159,    26,
-     159,    26,    26,   783,    26,    26,    36,    26,    26,    26,
-      26,    26,    26,    26,   163,    26,    26,   159,   159,   163,
-     163,   159,    26,    35,   159,    26,    71,    26,   162,   158,
-     132,    26,    26,   813,    26,   138,    26,    22,    36,   159,
-      26,   159,   158,    26,    26,   162,   826,    26,    26,    26,
-     165,   165,    26,   165,    26,    26,   163,    98,   162,   165,
-     165,    98,   160,    36,   880,   162,    36,   883,   158,   136,
-      98,   887,   888,   889,   890,   135,   162,   158,    98,    26,
-     160,   160,   160,   160,   900,   901,   902,   158,     0,     1,
-     158,   143,   909,   162,   158,   158,   158,    36,    36,   158,
-      12,   162,    36,    26,   162,    26,    26,   158,   165,   158,
-     163,   158,    24,    25,    26,   895,    28,    36,    30,    31,
+      27,    28,     0,    30,    31,    32,   227,    34,    35,    36,
+      37,    41,    42,    43,    68,    69,   222,     0,   210,    36,
+      37,   484,   151,   273,   274,   537,     0,    26,    30,    31,
+     206,    30,    31,    87,    26,   535,   257,    36,    28,    72,
+     483,    68,   485,    63,    84,    30,    31,   101,    26,   255,
+      70,    30,    31,    26,    70,    71,    28,    84,    85,    86,
+      87,    63,    89,    90,    63,    84,    47,    78,    70,   943,
+      68,    70,    26,   249,   101,   251,   163,    78,    77,   106,
+      61,    55,   222,   143,    57,    26,    27,    86,    87,    88,
+      98,    90,    64,   908,    68,    69,   796,   273,   274,    75,
+      76,    77,   976,    57,    16,    83,   166,    19,   158,    21,
+      36,    23,   162,    87,    26,   255,    28,    91,    30,    31,
+      84,   371,    63,    98,    36,   165,    69,   101,    26,    70,
+     163,    26,    30,    31,   110,    30,    31,    63,    84,   166,
+     116,   841,    98,   163,    70,    88,   165,   163,   168,   169,
+     161,    63,    26,   151,    98,   618,    26,    27,    70,   149,
+     161,   163,   662,    26,   163,    63,   168,   169,   151,   168,
+     169,   163,    70,    36,    86,    87,   619,   151,   163,    30,
+      31,   155,    26,   159,   163,   159,   160,   161,   162,    63,
+     164,    98,    36,    63,    26,   371,    70,    26,  1013,  1014,
+      70,   165,   178,   179,   180,   181,   182,   183,   184,   185,
+     186,   187,   124,   158,    91,    92,    93,   162,    26,   165,
+      67,    98,   163,    70,    71,    72,    73,   168,   169,   516,
+     163,    63,   519,   520,    63,   211,   212,   163,    70,    26,
+      26,    70,   168,   169,    91,    92,   222,   468,    26,   499,
+     500,   163,   135,   136,   149,    63,   168,   169,   285,    70,
+      71,   288,    70,     3,     4,   163,   293,    26,    63,     9,
+     168,   169,    83,    84,   248,    70,   158,    63,   160,   255,
+      20,   308,   309,   310,    70,    63,   163,   125,   126,   163,
+     540,   318,    70,   163,   168,   169,   158,   163,   168,   169,
+     162,    26,    70,    71,    26,   143,    98,    70,    71,    72,
+     163,   103,   104,   367,   368,    83,    84,   446,   164,    26,
+     347,   348,   349,   499,   500,   164,    63,   164,    91,    92,
+      93,   163,   306,    70,   163,    98,   168,   169,    63,   168,
+     169,    63,    26,   164,    26,    70,    30,    31,    70,   126,
+     127,   128,   379,   380,   381,   163,    63,   820,   133,   134,
+     168,   169,   158,    70,   827,    70,    71,   163,   163,   396,
+     397,   398,   163,   168,   169,    83,    84,   163,    83,    84,
+     407,    63,   168,   169,   164,   163,    30,    31,    70,    26,
+     168,   169,    36,    30,    31,   369,   423,   164,   372,   426,
+     158,   428,   429,   430,   162,   432,   433,   434,   163,   383,
+     384,   385,   439,   925,   163,   927,   163,   129,   130,    67,
+      70,    71,   163,    36,    72,    73,   163,   139,   140,   456,
+     404,   168,   169,    83,    84,    26,   106,   107,   163,    30,
+      31,   163,   112,   168,   169,    36,   168,   169,   446,   163,
+      63,    70,    71,   451,   452,   158,   163,    70,   133,   134,
+     163,   168,   169,   446,    83,    84,   125,   126,    65,   163,
+      67,   498,   446,    70,    71,    72,    73,   451,   452,   506,
+      26,   163,   106,   107,    30,    31,   168,   169,   112,   506,
+      36,   170,   171,   172,    91,    92,   702,    67,   704,   163,
+      70,    71,    72,    73,     5,     6,     7,     8,   163,    10,
+      11,     0,    13,    14,    15,    16,    17,    18,    26,    98,
+     158,   100,   101,   102,   162,    26,   105,    28,    29,    30,
+      31,   121,   122,    34,    98,    36,   126,   127,   128,   103,
+     104,    98,   734,   141,   142,   737,    65,   574,    67,    68,
+     163,    70,    71,    72,    73,   168,   169,    98,    36,   100,
+     101,   102,    63,   163,   591,   592,   593,   594,    26,    70,
+      70,    71,    91,    92,    75,    76,    77,   158,   121,   122,
+      26,   162,    89,    36,    85,    86,    87,    94,    95,    90,
+     158,    98,    99,    36,   162,   622,   103,   104,   625,   158,
+     821,   136,   137,   162,   158,   797,   580,   158,   162,   121,
+     122,   162,    36,   587,   588,   836,   808,    36,   810,   811,
+     647,   648,   123,   124,    65,    66,    67,    68,    26,    70,
+      71,    72,    73,   158,   158,   158,   158,   162,   162,   162,
+     162,   668,   158,   158,   173,    26,   162,   162,   144,   145,
+      91,    92,    79,    80,    81,    82,   108,   109,   110,   111,
+     690,    26,   163,   164,    26,    26,    26,   168,   169,    26,
+      65,    66,    67,    68,    26,    70,    71,    72,    73,    26,
+     654,   655,    26,    28,    26,    26,   862,    26,   715,    65,
+      66,   745,    68,    26,    70,    71,    91,    92,    26,    26,
+      36,   699,    26,    79,    80,    81,    82,   681,   762,    28,
+      26,    28,   163,    72,   163,    91,    92,    93,   158,   163,
+      71,   162,   696,   697,   160,   699,   163,    26,   163,   163,
+     163,   163,   163,   163,   163,   163,    26,    26,    26,    26,
+      26,   164,   164,   163,    26,    71,   163,   163,   163,   163,
+     163,   778,   163,   163,   158,    98,    36,    36,   164,   162,
+      98,    71,   789,   162,    71,   174,   158,   158,   162,   158,
+     158,   158,   158,   158,   158,   158,    98,    26,    26,    26,
+     162,    36,   159,   158,   158,   165,   813,   165,   159,   159,
+     136,   126,    26,    26,    26,    26,    26,    36,    26,    26,
+      26,    26,    26,    26,    26,   163,    26,   163,   163,   159,
+     159,   159,    26,    26,   788,    71,    35,    26,    26,   159,
+     132,    26,    26,    26,   158,   162,    26,   138,    22,    36,
+     159,    26,   162,    26,   159,   158,    26,    26,    26,    26,
+      26,    26,    26,    26,   818,   165,    98,   165,    98,   163,
+     165,   136,   165,   162,    36,   160,    36,   831,   885,   165,
+     158,   888,     0,     1,   135,   892,   893,   894,   895,   162,
+     162,   162,    36,   143,    12,   158,   160,    98,   905,   906,
+     907,    98,   160,   160,   914,   160,    24,    25,    26,   158,
+      28,   158,    30,    31,    32,    33,    34,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,    55,    56,    57,
+      58,    59,    60,   158,   162,    36,   900,    36,    26,   158,
+      26,    26,    36,    36,    36,    92,    98,    26,    98,    26,
+     158,    26,   158,    70,    98,    98,   158,   162,   158,    98,
+      26,    98,   979,   980,   165,    98,   158,   163,    96,    97,
+      77,   162,   158,   162,   162,   162,   158,   158,    26,    36,
+      26,    36,    26,    91,    26,   113,   114,   115,   116,   158,
+      26,   162,   120,   131,   162,   123,   124,   163,   163,   163,
+     163,   163,   163,   162,   162,   162,   162,   162,    26,    26,
+     158,    26,   165,   173,   165,   143,   165,   162,   146,   147,
+     148,   162,   150,   151,   152,   153,   154,   155,   156,   157,
+      12,   162,   162,   162,   161,   163,   164,   162,   166,   167,
+     163,   162,    24,    25,    26,   158,    28,   162,    30,    31,
       32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,   162,    44,    45,    46,    47,    48,    49,    50,    51,
-      52,    53,    36,    36,    56,    57,    58,    59,    60,    92,
-      98,   158,   158,   162,   162,   158,   158,   162,   974,   975,
-      26,    98,   162,    98,    26,    98,   163,   163,   131,    98,
-     163,   158,   163,    98,   163,   163,    26,    77,   162,    70,
-      98,   162,   162,    26,    96,    97,   162,   162,    26,    36,
-      26,    36,    26,   162,   158,    91,   161,   165,   165,   165,
-     162,   113,   114,   115,   116,   162,   162,   162,   120,   162,
-     162,   123,   124,   163,    26,    26,   162,   162,    26,    26,
-     162,   162,   173,    26,    26,   165,    26,    98,   136,   165,
-     162,   143,   163,    26,   146,   147,   148,   165,   150,   151,
-     152,   153,   154,   155,   156,   157,    12,    36,   165,    36,
-     126,   163,   164,    36,   166,   167,   165,    98,    24,    25,
-      26,    26,    28,    98,    30,    31,    32,    33,    34,    35,
-      36,    37,    38,    39,    40,    41,    42,    26,    44,    45,
-      46,    47,    48,    49,    50,    51,    52,    53,    98,    98,
-      56,    57,    58,    59,    60,   162,   160,    26,   131,   164,
-      26,   158,   160,   158,   158,   158,   158,    98,    98,   126,
-      98,   162,   143,   162,   162,    91,   162,    98,   162,    98,
-     162,    26,   162,   162,    36,    26,    26,    26,   165,   158,
-      96,    97,    26,   165,   162,   165,   162,   162,   162,   162,
-     162,   162,   162,   162,   158,   163,   162,   113,   114,   115,
-     116,    26,   165,    32,   120,    28,   162,   123,   124,   163,
-      26,   162,    26,   162,    26,    26,   163,   162,    26,    26,
-     162,    26,    26,    26,    72,    26,   162,   143,   162,    71,
-     146,   147,   148,   160,   150,   151,   152,   153,   154,   155,
-     156,   157,   162,    84,   163,   162,   160,   163,   164,   162,
-     166,   167,   163,   162,   160,   160,   160,   160,   133,    36,
-      70,   162,   158,   160,   162,    92,   160,    98,   126,    26,
-     163,   162,    26,    33,    71,    28,   162,   162,   162,   162,
-     137,   162,   162,    22,   162,   158,   163,   158,   162,    26,
-     162,    26,    36,   163,   163,   163,   163,   160,   162,   160,
-     137,   136,   162,   137,   137,   137,   162,   137,    72,   137,
-     162,   137,    36,   969,    34,   162,   162,   162,   856,   162,
-      -1,   936,   162,   162,   162,    -1,   162,    -1,   293,    -1,
-      -1,    -1,    -1,    -1,    -1,   312,    -1,    -1,   162
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,   162,
+     162,   165,   162,    26,   165,    26,    98,   165,    36,   165,
+     163,   136,    36,   126,    36,    26,   165,    98,    26,    98,
+      26,    98,    98,   162,   131,    26,   160,    26,   164,   158,
+     160,   158,    98,    98,    96,    97,   126,   158,   158,   158,
+      98,   143,   165,    91,   162,   162,    98,   162,   162,   158,
+     162,   113,   114,   115,   116,   165,   162,   162,   120,   162,
+      98,   123,   124,   162,   165,   165,   162,    26,   162,   162,
+      36,   162,    26,   162,   162,   162,   162,   162,   158,   162,
+     162,   143,    26,    26,   146,   147,   148,   162,   150,   151,
+     152,   153,   154,   155,   156,   157,   163,    26,    26,   163,
+      26,   163,   164,    28,   166,   167,    26,    26,    26,   163,
+      26,   162,    26,   162,    26,    32,   162,   162,   162,    72,
+      26,    26,    26,   160,   163,   160,   162,    84,   162,   133,
+     163,   162,    71,   160,   160,   160,    70,    36,    98,   126,
+     160,   158,    92,   162,   162,   160,   160,   163,    26,   162,
+      26,    33,   162,    28,   137,   162,    71,   162,    22,   162,
+     162,    26,   162,    26,   162,   158,   163,   162,   158,   163,
+     162,   136,   163,   137,   163,   163,    36,   162,   160,   160,
+      72,   137,   137,   162,   162,   137,   137,   162,   137,   137,
+     162,   162,   162,   162,   162,   162,    36,   861,   974,   162,
+     162,   162,   941,    37,    -1,    -1,   317,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   298
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -2029,107 +2076,107 @@ static const yytype_uint8 yystos[] =
 {
        0,     1,    12,    24,    25,    26,    28,    30,    31,    32,
       33,    34,    35,    36,    37,    38,    39,    40,    41,    42,
-      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
-      56,    57,    58,    59,    60,    96,    97,   113,   114,   115,
-     116,   120,   123,   124,   143,   146,   147,   148,   150,   151,
-     152,   153,   154,   155,   156,   157,   163,   164,   166,   167,
-     176,   177,   178,   179,   198,   206,   207,   208,   209,   210,
-     213,   163,    63,    70,   163,   168,   169,   214,   219,   220,
-     221,    89,    94,    95,    98,    99,   103,   104,    98,   100,
-     101,   102,   105,   212,    98,    98,    98,    98,    98,    26,
-      26,   220,   220,   163,   220,   163,   220,   220,   214,   218,
-     220,   163,   218,   220,   163,   163,   164,   199,   164,   199,
-     164,   199,   164,   199,   163,   164,   164,    98,   212,   163,
-     163,   163,   163,   163,   163,    26,   179,   163,   163,    28,
-      64,    26,    26,    83,   212,     0,    78,   161,    98,   103,
-     104,    98,    26,    36,    70,    77,    86,    87,    88,    90,
-     179,   206,   211,   220,   179,   211,   211,   163,   180,    26,
-     221,   221,   221,    65,    66,    67,    68,    70,    71,    72,
-      73,    91,    92,    26,   220,    26,   220,    26,   220,     5,
-       6,     7,     8,    10,    11,    13,    14,    15,    16,    17,
-      18,    26,    28,    29,    34,    36,    63,    70,    75,    76,
-      77,    85,    86,    87,    90,   123,   124,   163,   164,   179,
-     195,   200,   211,   220,    26,    26,   220,    26,   220,    26,
-     149,   179,    28,   149,   143,   166,    36,    36,    36,    36,
-      16,    19,    21,    23,    26,    28,    36,    86,    87,   124,
-     163,   179,   211,   220,   220,    26,    26,    27,   173,    26,
-      27,    26,    26,    26,    26,    26,    26,    26,    26,    26,
-      28,    26,    26,    26,    26,    26,    26,    36,    26,    26,
-      57,    28,   158,   160,    70,    71,    83,    84,   202,   205,
-      26,    28,   178,   179,    26,   163,    72,   179,   179,   179,
-     179,   163,   179,    91,    92,    93,   163,   220,   163,   196,
-     135,   136,   158,   160,   162,   221,   221,   221,   221,   221,
-     221,   221,   221,   221,   221,   163,   163,   163,   163,   163,
-     163,   163,   163,   163,    65,    66,    68,    71,    79,    80,
-      81,    82,    91,    92,    93,   201,   202,   163,   187,    71,
-     187,    26,    26,    26,    26,    26,    26,    26,   164,   164,
-      26,   179,   206,   207,   208,   210,    26,    71,   163,   163,
-     180,   163,   188,   163,   106,   107,   112,   163,   106,   107,
-     112,   163,   163,   163,    26,    26,    36,   179,   163,   202,
-      98,    91,    92,    93,    98,   202,    36,    36,   164,   208,
-     210,   180,   158,    98,   162,    71,   174,   162,    71,   158,
-     158,    84,   165,   165,   165,   165,   162,    84,   202,   205,
-      84,   202,   205,   158,   158,   158,   158,   158,   158,   158,
-     162,    98,   220,    26,    57,    26,   220,    26,   220,   165,
-     165,    78,   161,   196,    26,    36,   158,   158,   159,   159,
-     179,   159,   220,   220,   220,   126,   136,   158,   162,   158,
-     162,    26,    36,   209,   220,    26,    26,    26,    26,    26,
-      36,    26,    26,    26,    26,    26,    26,   163,   220,   220,
-     220,    26,    26,   133,   134,    35,   163,   189,   163,   190,
-     159,   159,   159,   159,    26,    26,    71,   104,   179,   162,
-      84,   202,   205,   179,    26,    26,   158,   133,   134,   132,
-      26,   220,    26,   220,    26,   220,    26,   179,   179,   179,
-      26,    26,    26,    36,   138,    26,    69,    88,   220,   220,
-     220,    22,    36,   159,   159,    26,   179,   162,   158,   220,
-      26,    26,    26,    26,    26,   165,   220,   165,    26,   220,
-     165,   220,   220,   220,    26,   220,   220,   220,    26,   163,
-      98,   220,   162,   158,   162,   165,   165,    98,   178,   160,
-     179,   206,   206,    36,    36,   158,    36,   220,   162,   162,
-     136,   135,    98,    98,   180,   158,   160,   160,   160,   160,
-     158,   158,   158,   158,   158,    26,   189,   190,   189,   158,
-     163,   184,   158,   163,   185,   162,   162,   158,   125,   126,
-     143,   143,    36,    36,    36,    36,   220,   202,   205,    84,
-     202,   205,    26,   162,    26,   214,   216,   217,   220,   165,
-     158,   158,   158,    26,   162,   162,   162,   163,   197,   197,
-     197,   197,   158,   158,   162,   158,   158,   162,   163,   163,
-     163,   163,   191,   191,   163,   185,    36,    36,    84,   205,
-     162,    36,   162,    92,   162,   162,   162,   162,   165,    98,
-     165,   165,    98,   162,   162,   162,   158,   162,   162,   162,
-     131,    26,   163,    98,    26,    98,    98,    98,    26,   161,
-     220,    70,    77,   179,   158,   162,   162,   163,   179,   163,
-      26,   220,   220,   220,   220,    26,    36,    26,    36,    26,
-      91,    26,   126,   127,   128,   182,    26,   125,   126,    26,
-     162,   158,   162,   158,   162,   162,   190,   189,   220,   165,
-      26,   220,   165,   162,   165,   173,   165,    26,    26,    26,
-      98,   136,   220,   220,   163,   181,    36,    36,   141,   142,
-     179,   179,   126,    36,   191,    26,   165,    98,    26,   220,
-      98,    26,    98,    98,    26,    36,   179,   162,   131,     3,
-       4,     9,    20,   160,   164,   199,    26,    26,   158,   162,
-     179,   179,   158,   206,   160,   158,   158,   158,   158,   162,
-     162,   162,   162,   162,   220,    98,   162,    98,   162,   162,
-      98,   143,   126,   165,   187,   165,   165,   187,    91,   170,
-     171,   172,   215,    98,   162,   162,   211,   162,   162,   162,
-     121,   122,   162,   162,   162,   162,   158,   158,   162,   162,
-     165,   211,    98,    26,    36,    26,   162,   162,   163,   163,
-      26,    26,   220,    26,    26,    28,   179,   220,    26,    26,
-      26,    26,   181,   187,   163,   162,    26,    26,    32,   162,
-     162,   187,   187,   187,   220,   179,   190,   180,   162,   162,
-     190,    26,   179,    26,    72,   180,    26,   181,    26,    26,
-     160,   163,   162,   160,   162,   163,   162,   160,   160,   160,
-     160,   133,   201,   202,    71,    70,   162,   158,   162,    36,
-      92,   160,   160,   220,   108,   109,   110,   111,   192,    98,
-     220,   126,   163,   193,   220,   220,   220,   220,   162,    26,
-      26,    33,   179,    28,    71,   220,   220,   220,   193,   162,
-     199,   162,   162,   137,   162,   162,   162,   162,   163,   186,
-     185,   185,   162,    22,   158,   158,   162,   163,   194,   163,
-     203,   203,   163,   204,   121,   122,   182,   183,   163,    26,
-      26,   136,   137,   129,   130,   139,   140,   144,   145,   158,
-     162,   158,   162,    36,   160,   160,   158,   162,   158,   162,
-     158,   162,   158,   162,   158,   162,   158,   162,   158,   162,
-     158,   162,   183,   182,   162,   220,   220,   137,   136,   137,
-     137,   137,   137,   137,   137,   162,   162,    72,   162,   162,
-     162,   162,   162,   162,   162,   162,   162,   162,    36,   193,
-     193
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    55,    56,    57,    58,    59,    60,    96,    97,
+     113,   114,   115,   116,   120,   123,   124,   143,   146,   147,
+     148,   150,   151,   152,   153,   154,   155,   156,   157,   163,
+     164,   166,   167,   176,   177,   178,   179,   198,   206,   207,
+     208,   209,   210,   213,   163,    63,    70,   163,   168,   169,
+     214,   219,   220,   221,    89,    94,    95,    98,    99,   103,
+     104,    98,   100,   101,   102,   105,   212,    98,    98,    98,
+      98,    98,    26,    26,   220,   220,   163,   220,   220,   220,
+     163,   220,   220,   214,   218,   220,   163,   218,   220,   163,
+     163,   164,   199,   164,   199,   164,   199,   164,   199,   163,
+     164,   164,    98,   212,   163,   163,   163,   163,   163,   163,
+      26,   179,   163,   163,    28,    64,    26,    26,    83,   212,
+       0,    78,   161,    98,   103,   104,    98,    26,    36,    70,
+      77,    86,    87,    88,    90,   179,   206,   211,   220,   179,
+     211,   211,   163,   180,    26,   221,   221,   221,    65,    66,
+      67,    68,    70,    71,    72,    73,    91,    92,    26,   220,
+      26,   220,    26,   220,     5,     6,     7,     8,    10,    11,
+      13,    14,    15,    16,    17,    18,    26,    28,    29,    34,
+      36,    63,    70,    75,    76,    77,    85,    86,    87,    90,
+     123,   124,   163,   164,   179,   195,   200,   211,   220,    26,
+      26,   220,    26,   220,    26,   149,   179,    28,   149,   143,
+     166,    36,    36,    36,    36,    16,    19,    21,    23,    26,
+      28,    36,    86,    87,   124,   163,   179,   211,   220,   220,
+      26,    26,    27,   173,    26,    27,    26,    26,    26,    26,
+      26,    26,    26,    26,    26,    28,    26,    26,    26,    26,
+      26,    26,    36,    26,    26,    57,    28,   158,   160,    70,
+      71,    83,    84,   202,   205,    26,    28,   178,   179,    26,
+     163,    72,   179,   179,   179,   179,   163,   179,    91,    92,
+      93,   163,   220,   163,   196,   135,   136,   158,   160,   162,
+     221,   221,   221,   221,   221,   221,   221,   221,   221,   221,
+     163,   163,   163,   163,   163,   163,   163,   163,   163,    65,
+      66,    68,    71,    79,    80,    81,    82,    91,    92,    93,
+     201,   202,   163,   187,    71,   187,    26,    26,    26,    26,
+      26,    26,    26,   164,   164,    26,   179,   206,   207,   208,
+     210,    26,    71,   163,   163,   180,   163,   188,   163,   106,
+     107,   112,   163,   106,   107,   112,   163,   163,   163,    26,
+      26,    36,   179,   163,   202,    98,    91,    92,    93,    98,
+     202,    36,    36,   164,   208,   210,   180,   158,    98,   162,
+      71,   174,   162,    71,   158,   158,    84,   165,   165,   165,
+     165,   162,    84,   202,   205,    84,   202,   205,   158,   158,
+     158,   158,   158,   158,   158,   162,    98,   220,    26,    57,
+      26,   220,    26,   220,   165,   165,    78,   161,   196,    26,
+      36,   158,   158,   159,   159,   179,   159,   220,   220,   220,
+     126,   136,   158,   162,   158,   162,    26,    36,   209,   220,
+      26,    26,    26,    26,    26,    36,    26,    26,    26,    26,
+      26,    26,   163,   220,   220,   220,    26,    26,   133,   134,
+      35,   163,   189,   163,   190,   159,   159,   159,   159,    26,
+      26,    71,   104,   179,   162,    84,   202,   205,   179,    26,
+      26,   158,   133,   134,   132,    26,   220,    26,   220,    26,
+     220,    26,   179,   179,   179,    26,    26,    26,    36,   138,
+      26,    69,    88,   220,   220,   220,    22,    36,   159,   159,
+      26,   179,   162,   158,   220,    26,    26,    26,    26,    26,
+     165,   220,   165,    26,   220,   165,   220,   220,   220,    26,
+     220,   220,   220,    26,   163,    98,   220,   162,   158,   162,
+     165,   165,    98,   178,   160,   179,   206,   206,    36,    36,
+     158,    36,   220,   162,   162,   136,   135,    98,    98,   180,
+     158,   160,   160,   160,   160,   158,   158,   158,   158,   158,
+      26,   189,   190,   189,   158,   163,   184,   158,   163,   185,
+     162,   162,   158,   125,   126,   143,   143,    36,    36,    36,
+      36,   220,   202,   205,    84,   202,   205,    26,   162,    26,
+     214,   216,   217,   220,   165,   158,   158,   158,    26,   162,
+     162,   162,   163,   197,   197,   197,   197,   158,   158,   162,
+     158,   158,   162,   163,   163,   163,   163,   191,   191,   163,
+     185,    36,    36,    84,   205,   162,    36,   162,    92,   162,
+     162,   162,   162,   165,    98,   165,   165,    98,   162,   162,
+     162,   158,   162,   162,   162,   131,    26,   163,    98,    26,
+      98,    98,    98,    26,   161,   220,    70,    77,   179,   158,
+     162,   162,   163,   179,   163,    26,   220,   220,   220,   220,
+      26,    36,    26,    36,    26,    91,    26,   126,   127,   128,
+     182,    26,   125,   126,    26,   162,   158,   162,   158,   162,
+     162,   190,   189,   220,   165,    26,   220,   165,   162,   165,
+     173,   165,    26,    26,    26,    98,   136,   220,   220,   163,
+     181,    36,    36,   141,   142,   179,   179,   126,    36,   191,
+      26,   165,    98,    26,   220,    98,    26,    98,    98,    26,
+      36,   179,   162,   131,     3,     4,     9,    20,   160,   164,
+     199,    26,    26,   158,   162,   179,   179,   158,   206,   160,
+     158,   158,   158,   158,   162,   162,   162,   162,   162,   220,
+      98,   162,    98,   162,   162,    98,   143,   126,   165,   187,
+     165,   165,   187,    91,   170,   171,   172,   215,    98,   162,
+     162,   211,   162,   162,   162,   121,   122,   162,   162,   162,
+     162,   158,   158,   162,   162,   165,   211,    98,    26,    36,
+      26,   162,   162,   163,   163,    26,    26,   220,    26,    26,
+      28,   179,   220,    26,    26,    26,    26,   181,   187,   163,
+     162,    26,    26,    32,   162,   162,   187,   187,   187,   220,
+     179,   190,   180,   162,   162,   190,    26,   179,    26,    72,
+     180,    26,   181,    26,    26,   160,   163,   162,   160,   162,
+     163,   162,   160,   160,   160,   160,   133,   201,   202,    71,
+      70,   162,   158,   162,    36,    92,   160,   160,   220,   108,
+     109,   110,   111,   192,    98,   220,   126,   163,   193,   220,
+     220,   220,   220,   162,    26,    26,    33,   179,    28,    71,
+     220,   220,   220,   193,   162,   199,   162,   162,   137,   162,
+     162,   162,   162,   163,   186,   185,   185,   162,    22,   158,
+     158,   162,   163,   194,   163,   203,   203,   163,   204,   121,
+     122,   182,   183,   163,    26,    26,   136,   137,   129,   130,
+     139,   140,   144,   145,   158,   162,   158,   162,    36,   160,
+     160,   158,   162,   158,   162,   158,   162,   158,   162,   158,
+     162,   158,   162,   158,   162,   158,   162,   183,   182,   162,
+     220,   220,   137,   136,   137,   137,   137,   137,   137,   137,
+     162,   162,    72,   162,   162,   162,   162,   162,   162,   162,
+     162,   162,   162,    36,   193,   193
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -2203,7 +2250,7 @@ while (YYID (0))
    we won't break user code: when these are the locations we know.  */
 
 #ifndef YY_LOCATION_PRINT
-# if YYLTYPE_IS_TRIVIAL
+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
 #  define YY_LOCATION_PRINT(File, Loc)                 \
      fprintf (File, "%d.%d-%d.%d",                     \
              (Loc).first_line, (Loc).first_column,     \
@@ -2944,7 +2991,7 @@ yyreduce:
   switch (yyn)
     {
         case 3:
-#line 569 "bfin-parse.y"
+#line 610 "bfin-parse.y"
     {
          insn = (yyvsp[(1) - (1)].instr);
          if (insn == (INSTR_T) 0)
@@ -2957,32 +3004,32 @@ yyreduce:
     break;
 
   case 5:
-#line 583 "bfin-parse.y"
+#line 624 "bfin-parse.y"
     {
          if (((yyvsp[(1) - (6)].instr)->value & 0xf800) == 0xc000)
            {
              if (is_group1 ((yyvsp[(3) - (6)].instr)) && is_group2 ((yyvsp[(5) - (6)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(1) - (6)].instr), (yyvsp[(3) - (6)].instr), (yyvsp[(5) - (6)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(1) - (6)].instr), (yyvsp[(3) - (6)].instr), (yyvsp[(5) - (6)].instr));
              else if (is_group2 ((yyvsp[(3) - (6)].instr)) && is_group1 ((yyvsp[(5) - (6)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(1) - (6)].instr), (yyvsp[(5) - (6)].instr), (yyvsp[(3) - (6)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(1) - (6)].instr), (yyvsp[(5) - (6)].instr), (yyvsp[(3) - (6)].instr));
              else
                return yyerror ("Wrong 16 bit instructions groups, slot 2 and slot 3 must be 16-bit instrution group");
            }
          else if (((yyvsp[(3) - (6)].instr)->value & 0xf800) == 0xc000)
            {
              if (is_group1 ((yyvsp[(1) - (6)].instr)) && is_group2 ((yyvsp[(5) - (6)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(3) - (6)].instr), (yyvsp[(1) - (6)].instr), (yyvsp[(5) - (6)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(3) - (6)].instr), (yyvsp[(1) - (6)].instr), (yyvsp[(5) - (6)].instr));
              else if (is_group2 ((yyvsp[(1) - (6)].instr)) && is_group1 ((yyvsp[(5) - (6)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(3) - (6)].instr), (yyvsp[(5) - (6)].instr), (yyvsp[(1) - (6)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(3) - (6)].instr), (yyvsp[(5) - (6)].instr), (yyvsp[(1) - (6)].instr));
              else
                return yyerror ("Wrong 16 bit instructions groups, slot 1 and slot 3 must be 16-bit instrution group");
            }
          else if (((yyvsp[(5) - (6)].instr)->value & 0xf800) == 0xc000)
            {
              if (is_group1 ((yyvsp[(1) - (6)].instr)) && is_group2 ((yyvsp[(3) - (6)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(5) - (6)].instr), (yyvsp[(1) - (6)].instr), (yyvsp[(3) - (6)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(5) - (6)].instr), (yyvsp[(1) - (6)].instr), (yyvsp[(3) - (6)].instr));
              else if (is_group2 ((yyvsp[(1) - (6)].instr)) && is_group1 ((yyvsp[(3) - (6)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(5) - (6)].instr), (yyvsp[(3) - (6)].instr), (yyvsp[(1) - (6)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(5) - (6)].instr), (yyvsp[(3) - (6)].instr), (yyvsp[(1) - (6)].instr));
              else
                return yyerror ("Wrong 16 bit instructions groups, slot 1 and slot 2 must be 16-bit instrution group");
            }
@@ -2992,37 +3039,37 @@ yyreduce:
     break;
 
   case 6:
-#line 616 "bfin-parse.y"
+#line 657 "bfin-parse.y"
     {
          if (((yyvsp[(1) - (4)].instr)->value & 0xf800) == 0xc000)
            {
              if (is_group1 ((yyvsp[(3) - (4)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(1) - (4)].instr), (yyvsp[(3) - (4)].instr), 0);
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(1) - (4)].instr), (yyvsp[(3) - (4)].instr), 0);
              else if (is_group2 ((yyvsp[(3) - (4)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(1) - (4)].instr), 0, (yyvsp[(3) - (4)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(1) - (4)].instr), 0, (yyvsp[(3) - (4)].instr));
              else
                return yyerror ("Wrong 16 bit instructions groups, slot 2 must be the 16-bit instruction group");
            }
          else if (((yyvsp[(3) - (4)].instr)->value & 0xf800) == 0xc000)
            {
              if (is_group1 ((yyvsp[(1) - (4)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(3) - (4)].instr), (yyvsp[(1) - (4)].instr), 0);
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(3) - (4)].instr), (yyvsp[(1) - (4)].instr), 0);
              else if (is_group2 ((yyvsp[(1) - (4)].instr)))
-               (yyval.instr) = bfin_gen_multi_instr ((yyvsp[(3) - (4)].instr), 0, (yyvsp[(1) - (4)].instr));
+               (yyval.instr) = gen_multi_instr_1 ((yyvsp[(3) - (4)].instr), 0, (yyvsp[(1) - (4)].instr));
              else
                return yyerror ("Wrong 16 bit instructions groups, slot 1 must be the 16-bit instruction group");
            }
          else if (is_group1 ((yyvsp[(1) - (4)].instr)) && is_group2 ((yyvsp[(3) - (4)].instr)))
-             (yyval.instr) = bfin_gen_multi_instr (0, (yyvsp[(1) - (4)].instr), (yyvsp[(3) - (4)].instr));
+             (yyval.instr) = gen_multi_instr_1 (0, (yyvsp[(1) - (4)].instr), (yyvsp[(3) - (4)].instr));
          else if (is_group2 ((yyvsp[(1) - (4)].instr)) && is_group1 ((yyvsp[(3) - (4)].instr)))
-           (yyval.instr) = bfin_gen_multi_instr (0, (yyvsp[(3) - (4)].instr), (yyvsp[(1) - (4)].instr));
+           (yyval.instr) = gen_multi_instr_1 (0, (yyvsp[(3) - (4)].instr), (yyvsp[(1) - (4)].instr));
          else
            return yyerror ("Wrong 16 bit instructions groups, slot 1 and slot 2 must be the 16-bit instruction group");
        }
     break;
 
   case 7:
-#line 643 "bfin-parse.y"
+#line 684 "bfin-parse.y"
     {
        (yyval.instr) = 0;
        yyerror ("");
@@ -3031,19 +3078,22 @@ yyreduce:
     break;
 
   case 8:
-#line 654 "bfin-parse.y"
+#line 695 "bfin-parse.y"
     {
          (yyval.instr) = DSP32MAC (3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0);
        }
     break;
 
   case 9:
-#line 658 "bfin-parse.y"
+#line 699 "bfin-parse.y"
     {
          int op0, op1;
          int w0 = 0, w1 = 0;
          int h00, h10, h01, h11;
 
+         if (check_macfunc_option (&(yyvsp[(1) - (2)].macfunc), &(yyvsp[(2) - (2)].mod)) < 0)
+           return yyerror ("bad option");
+
          if ((yyvsp[(1) - (2)].macfunc).n == 0)
            {
              if ((yyvsp[(2) - (2)].mod).MM) 
@@ -3072,7 +3122,7 @@ yyreduce:
     break;
 
   case 10:
-#line 693 "bfin-parse.y"
+#line 737 "bfin-parse.y"
     {
          Register *dst;
 
@@ -3092,7 +3142,7 @@ yyreduce:
     break;
 
   case 11:
-#line 713 "bfin-parse.y"
+#line 757 "bfin-parse.y"
     {
          notethat ("dsp32alu: DISALGNEXCPT\n");
          (yyval.instr) = DSP32ALU (18, 0, 0, 0, 0, 0, 0, 0, 3);
@@ -3100,7 +3150,7 @@ yyreduce:
     break;
 
   case 12:
-#line 718 "bfin-parse.y"
+#line 762 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && !IS_A1 ((yyvsp[(4) - (6)].reg)) && IS_A1 ((yyvsp[(5) - (6)].reg)))
            {
@@ -3113,7 +3163,7 @@ yyreduce:
     break;
 
   case 13:
-#line 728 "bfin-parse.y"
+#line 772 "bfin-parse.y"
     {
          if (!IS_A1 ((yyvsp[(4) - (6)].reg)) && IS_A1 ((yyvsp[(5) - (6)].reg)))
            {
@@ -3126,7 +3176,7 @@ yyreduce:
     break;
 
   case 14:
-#line 738 "bfin-parse.y"
+#line 782 "bfin-parse.y"
     {
          notethat ("dsp32alu: A_ZERO_DOT_H = dregs_hi\n");
          (yyval.instr) = DSP32ALU (9, IS_H ((yyvsp[(3) - (3)].reg)), 0, 0, &(yyvsp[(3) - (3)].reg), 0, 0, 0, 0);
@@ -3134,7 +3184,7 @@ yyreduce:
     break;
 
   case 15:
-#line 743 "bfin-parse.y"
+#line 787 "bfin-parse.y"
     {
          notethat ("dsp32alu: A_ZERO_DOT_H = dregs_hi\n");
          (yyval.instr) = DSP32ALU (9, IS_H ((yyvsp[(3) - (3)].reg)), 0, 0, &(yyvsp[(3) - (3)].reg), 0, 0, 0, 2);
@@ -3142,7 +3192,7 @@ yyreduce:
     break;
 
   case 16:
-#line 749 "bfin-parse.y"
+#line 793 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(2) - (17)].reg)) || !IS_DREG ((yyvsp[(4) - (17)].reg)))
            return yyerror ("Dregs expected");
@@ -3159,9 +3209,9 @@ yyreduce:
     break;
 
   case 17:
-#line 765 "bfin-parse.y"
+#line 809 "bfin-parse.y"
     {
-         if (!IS_DREG ((yyvsp[(2) - (17)].reg)) || !IS_DREG((yyvsp[(4) - (17)].reg)))
+         if (!IS_DREG ((yyvsp[(2) - (17)].reg)) || !IS_DREG ((yyvsp[(4) - (17)].reg)))
            return yyerror ("Dregs expected");
          else if (!valid_dreg_pair (&(yyvsp[(9) - (17)].reg), (yyvsp[(11) - (17)].expr)))
            return yyerror ("Bad dreg pair");
@@ -3176,7 +3226,7 @@ yyreduce:
     break;
 
   case 18:
-#line 780 "bfin-parse.y"
+#line 824 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(2) - (11)].reg)) || !IS_DREG ((yyvsp[(4) - (11)].reg)))
            return yyerror ("Dregs expected");
@@ -3191,7 +3241,7 @@ yyreduce:
     break;
 
   case 19:
-#line 792 "bfin-parse.y"
+#line 836 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(2) - (11)].reg)) && IS_DREG ((yyvsp[(4) - (11)].reg)) && IS_DREG ((yyvsp[(8) - (11)].reg)))
            {
@@ -3204,7 +3254,7 @@ yyreduce:
     break;
 
   case 20:
-#line 803 "bfin-parse.y"
+#line 847 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (11)].reg)) && IS_DREG ((yyvsp[(7) - (11)].reg)))
            {
@@ -3217,7 +3267,7 @@ yyreduce:
     break;
 
   case 21:
-#line 815 "bfin-parse.y"
+#line 859 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (12)].reg)) && IS_DREG ((yyvsp[(7) - (12)].reg)) && !REG_SAME ((yyvsp[(3) - (12)].reg), (yyvsp[(5) - (12)].reg))
              && IS_A1 ((yyvsp[(9) - (12)].reg)) && !IS_A1 ((yyvsp[(11) - (12)].reg)))
@@ -3238,7 +3288,7 @@ yyreduce:
     break;
 
   case 22:
-#line 834 "bfin-parse.y"
+#line 878 "bfin-parse.y"
     {
          if ((yyvsp[(4) - (12)].r0).r0 == (yyvsp[(10) - (12)].r0).r0) 
            return yyerror ("Operators must differ");
@@ -3256,7 +3306,7 @@ yyreduce:
     break;
 
   case 23:
-#line 852 "bfin-parse.y"
+#line 896 "bfin-parse.y"
     {
          if (!REG_SAME ((yyvsp[(3) - (12)].reg), (yyvsp[(9) - (12)].reg)) || !REG_SAME ((yyvsp[(5) - (12)].reg), (yyvsp[(11) - (12)].reg)))
            return yyerror ("Differing source registers");
@@ -3281,7 +3331,7 @@ yyreduce:
     break;
 
   case 24:
-#line 875 "bfin-parse.y"
+#line 919 "bfin-parse.y"
     {
          int op;
 
@@ -3306,7 +3356,7 @@ yyreduce:
     break;
 
   case 25:
-#line 897 "bfin-parse.y"
+#line 941 "bfin-parse.y"
     {
          notethat ("dsp32alu: Ax = ABS Ax\n");
          (yyval.instr) = DSP32ALU (16, IS_A1 ((yyvsp[(1) - (3)].reg)), 0, 0, 0, 0, 0, 0, IS_A1 ((yyvsp[(3) - (3)].reg)));
@@ -3314,7 +3364,7 @@ yyreduce:
     break;
 
   case 26:
-#line 902 "bfin-parse.y"
+#line 946 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(3) - (3)].reg)))
            {
@@ -3327,7 +3377,7 @@ yyreduce:
     break;
 
   case 27:
-#line 912 "bfin-parse.y"
+#line 956 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(3) - (3)].reg)))
            {
@@ -3340,7 +3390,7 @@ yyreduce:
     break;
 
   case 28:
-#line 923 "bfin-parse.y"
+#line 967 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (8)].reg)) && IS_DREG ((yyvsp[(5) - (8)].reg)) && IS_DREG ((yyvsp[(7) - (8)].reg)))
            {
@@ -3353,7 +3403,7 @@ yyreduce:
     break;
 
   case 29:
-#line 934 "bfin-parse.y"
+#line 978 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (13)].reg)))
            return yyerror ("Dregs expected");
@@ -3370,7 +3420,7 @@ yyreduce:
     break;
 
   case 30:
-#line 948 "bfin-parse.y"
+#line 992 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (12)].reg)))
            return yyerror ("Dregs expected");
@@ -3387,7 +3437,7 @@ yyreduce:
     break;
 
   case 31:
-#line 964 "bfin-parse.y"
+#line 1008 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (13)].reg)))
            return yyerror ("Dregs expected");
@@ -3404,7 +3454,7 @@ yyreduce:
     break;
 
   case 32:
-#line 980 "bfin-parse.y"
+#line 1024 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (13)].reg)))
            return yyerror ("Dregs expected");
@@ -3421,7 +3471,7 @@ yyreduce:
     break;
 
   case 33:
-#line 996 "bfin-parse.y"
+#line 1040 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (13)].reg)))
            return yyerror ("Dregs expected");
@@ -3438,7 +3488,7 @@ yyreduce:
     break;
 
   case 34:
-#line 1011 "bfin-parse.y"
+#line 1055 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (8)].reg)) && IS_DREG ((yyvsp[(5) - (8)].reg)) && IS_DREG ((yyvsp[(7) - (8)].reg)))
            {
@@ -3451,7 +3501,7 @@ yyreduce:
     break;
 
   case 35:
-#line 1023 "bfin-parse.y"
+#line 1067 "bfin-parse.y"
     {
          if (IS_HCOMPL ((yyvsp[(1) - (17)].reg), (yyvsp[(3) - (17)].reg)) && IS_HCOMPL ((yyvsp[(7) - (17)].reg), (yyvsp[(14) - (17)].reg)) && IS_HCOMPL ((yyvsp[(10) - (17)].reg), (yyvsp[(17) - (17)].reg)))
            {
@@ -3467,7 +3517,7 @@ yyreduce:
     break;
 
   case 36:
-#line 1036 "bfin-parse.y"
+#line 1080 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_DREG ((yyvsp[(5) - (6)].reg)))
            {
@@ -3496,7 +3546,7 @@ yyreduce:
     break;
 
   case 37:
-#line 1062 "bfin-parse.y"
+#line 1106 "bfin-parse.y"
     {
          int op;
 
@@ -3516,7 +3566,7 @@ yyreduce:
     break;
 
   case 38:
-#line 1080 "bfin-parse.y"
+#line 1124 "bfin-parse.y"
     {
          notethat ("dsp32alu: Ax = - Ax\n");
          (yyval.instr) = DSP32ALU (14, IS_A1 ((yyvsp[(1) - (3)].reg)), 0, 0, 0, 0, 0, 0, IS_A1 ((yyvsp[(3) - (3)].reg)));
@@ -3524,7 +3574,7 @@ yyreduce:
     break;
 
   case 39:
-#line 1085 "bfin-parse.y"
+#line 1129 "bfin-parse.y"
     {
          notethat ("dsp32alu: dregs_lo = dregs_lo +- dregs_lo (amod1)\n");
          (yyval.instr) = DSP32ALU (2 | (yyvsp[(4) - (6)].r0).r0, IS_H ((yyvsp[(1) - (6)].reg)), 0, &(yyvsp[(1) - (6)].reg), &(yyvsp[(3) - (6)].reg), &(yyvsp[(5) - (6)].reg),
@@ -3533,7 +3583,7 @@ yyreduce:
     break;
 
   case 40:
-#line 1091 "bfin-parse.y"
+#line 1135 "bfin-parse.y"
     {
          if (EXPR_VALUE ((yyvsp[(3) - (3)].expr)) == 0 && !REG_SAME ((yyvsp[(1) - (3)].reg), (yyvsp[(2) - (3)].reg)))
            {
@@ -3546,7 +3596,7 @@ yyreduce:
     break;
 
   case 41:
-#line 1103 "bfin-parse.y"
+#line 1147 "bfin-parse.y"
     {
          if (REG_SAME ((yyvsp[(1) - (5)].reg), (yyvsp[(2) - (5)].reg)))
            {
@@ -3559,7 +3609,7 @@ yyreduce:
     break;
 
   case 42:
-#line 1114 "bfin-parse.y"
+#line 1158 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (6)].reg)))
            {
@@ -3572,7 +3622,7 @@ yyreduce:
     break;
 
   case 43:
-#line 1125 "bfin-parse.y"
+#line 1169 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (8)].reg)) && IS_DREG ((yyvsp[(5) - (8)].reg)))
            {
@@ -3585,7 +3635,7 @@ yyreduce:
     break;
 
   case 44:
-#line 1136 "bfin-parse.y"
+#line 1180 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (8)].reg)) && IS_DREG ((yyvsp[(5) - (8)].reg)))
            {
@@ -3598,7 +3648,7 @@ yyreduce:
     break;
 
   case 45:
-#line 1147 "bfin-parse.y"
+#line 1191 "bfin-parse.y"
     {
          if (!REG_SAME ((yyvsp[(1) - (2)].reg), (yyvsp[(2) - (2)].reg)))
            {
@@ -3611,7 +3661,7 @@ yyreduce:
     break;
 
   case 46:
-#line 1158 "bfin-parse.y"
+#line 1202 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(2) - (2)].reg)))
            {
@@ -3624,7 +3674,7 @@ yyreduce:
     break;
 
   case 47:
-#line 1169 "bfin-parse.y"
+#line 1213 "bfin-parse.y"
     {
          if (!IS_H ((yyvsp[(3) - (4)].reg)))
            {
@@ -3652,7 +3702,7 @@ yyreduce:
     break;
 
   case 48:
-#line 1195 "bfin-parse.y"
+#line 1239 "bfin-parse.y"
     {
          notethat ("LDIMMhalf: pregs_half = imm16\n");
 
@@ -3668,7 +3718,7 @@ yyreduce:
     break;
 
   case 49:
-#line 1209 "bfin-parse.y"
+#line 1253 "bfin-parse.y"
     {
          notethat ("dsp32alu: An = 0\n");
 
@@ -3680,7 +3730,7 @@ yyreduce:
     break;
 
   case 50:
-#line 1219 "bfin-parse.y"
+#line 1263 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (4)].reg)) && !IS_PREG ((yyvsp[(1) - (4)].reg)) && !IS_IREG ((yyvsp[(1) - (4)].reg))
              && !IS_MREG ((yyvsp[(1) - (4)].reg)) && !IS_BREG ((yyvsp[(1) - (4)].reg)) && !IS_LREG ((yyvsp[(1) - (4)].reg)))
@@ -3727,7 +3777,7 @@ yyreduce:
     break;
 
   case 51:
-#line 1264 "bfin-parse.y"
+#line 1308 "bfin-parse.y"
     {
          if (IS_H ((yyvsp[(1) - (3)].reg)))
            return yyerror ("Low reg expected");
@@ -3748,7 +3798,7 @@ yyreduce:
     break;
 
   case 52:
-#line 1283 "bfin-parse.y"
+#line 1327 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_DREG ((yyvsp[(5) - (6)].reg)))
            {
@@ -3761,7 +3811,7 @@ yyreduce:
     break;
 
   case 53:
-#line 1294 "bfin-parse.y"
+#line 1338 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (4)].reg)) && IS_DREG ((yyvsp[(3) - (4)].reg)))
            {
@@ -3774,7 +3824,7 @@ yyreduce:
     break;
 
   case 54:
-#line 1305 "bfin-parse.y"
+#line 1349 "bfin-parse.y"
     {
          if (REG_SAME ((yyvsp[(1) - (7)].reg), (yyvsp[(3) - (7)].reg)) && REG_SAME ((yyvsp[(5) - (7)].reg), (yyvsp[(7) - (7)].reg)) && !REG_SAME ((yyvsp[(1) - (7)].reg), (yyvsp[(5) - (7)].reg)))
            {
@@ -3787,7 +3837,7 @@ yyreduce:
     break;
 
   case 55:
-#line 1316 "bfin-parse.y"
+#line 1360 "bfin-parse.y"
     {
          if (REG_SAME ((yyvsp[(1) - (7)].reg), (yyvsp[(3) - (7)].reg)) && REG_SAME ((yyvsp[(5) - (7)].reg), (yyvsp[(7) - (7)].reg)) && !REG_SAME ((yyvsp[(1) - (7)].reg), (yyvsp[(5) - (7)].reg)))
            {
@@ -3800,7 +3850,7 @@ yyreduce:
     break;
 
   case 56:
-#line 1327 "bfin-parse.y"
+#line 1371 "bfin-parse.y"
     {
          if (!IS_A1 ((yyvsp[(1) - (3)].reg)) && IS_A1 ((yyvsp[(2) - (3)].reg)))
            {
@@ -3813,7 +3863,7 @@ yyreduce:
     break;
 
   case 57:
-#line 1338 "bfin-parse.y"
+#line 1382 "bfin-parse.y"
     {
          if (IS_IREG ((yyvsp[(1) - (3)].reg)) && EXPR_VALUE ((yyvsp[(3) - (3)].expr)) == 4)
            {
@@ -3831,7 +3881,7 @@ yyreduce:
     break;
 
   case 58:
-#line 1354 "bfin-parse.y"
+#line 1398 "bfin-parse.y"
     {
          if (IS_IREG ((yyvsp[(1) - (6)].reg)) && IS_MREG ((yyvsp[(3) - (6)].reg)))
            {
@@ -3850,7 +3900,7 @@ yyreduce:
     break;
 
   case 59:
-#line 1371 "bfin-parse.y"
+#line 1415 "bfin-parse.y"
     {
          if (IS_IREG ((yyvsp[(1) - (3)].reg)) && IS_MREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -3868,7 +3918,7 @@ yyreduce:
     break;
 
   case 60:
-#line 1387 "bfin-parse.y"
+#line 1431 "bfin-parse.y"
     {
          if (!IS_A1 ((yyvsp[(1) - (4)].reg)) && IS_A1 ((yyvsp[(3) - (4)].reg)))
            {
@@ -3881,7 +3931,7 @@ yyreduce:
     break;
 
   case 61:
-#line 1398 "bfin-parse.y"
+#line 1442 "bfin-parse.y"
     {
          if (IS_IREG ((yyvsp[(1) - (3)].reg)) && IS_MREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -3894,7 +3944,7 @@ yyreduce:
     break;
 
   case 62:
-#line 1409 "bfin-parse.y"
+#line 1453 "bfin-parse.y"
     {
          if (IS_IREG ((yyvsp[(1) - (3)].reg)))
            {
@@ -3921,13 +3971,15 @@ yyreduce:
              notethat ("COMPI2opD: dregs += imm7\n");
              (yyval.instr) = COMPI2OPD (&(yyvsp[(1) - (3)].reg), imm7 ((yyvsp[(3) - (3)].expr)), 1);
            }
+         else if ((IS_DREG ((yyvsp[(1) - (3)].reg)) || IS_PREG ((yyvsp[(1) - (3)].reg))) && IS_CONST ((yyvsp[(3) - (3)].expr)))
+           return yyerror ("Immediate value out of range");
          else
            return yyerror ("Register mismatch");
        }
     break;
 
   case 63:
-#line 1440 "bfin-parse.y"
+#line 1486 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_DREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -3940,7 +3992,7 @@ yyreduce:
     break;
 
   case 64:
-#line 1451 "bfin-parse.y"
+#line 1497 "bfin-parse.y"
     {
          if (!valid_dreg_pair (&(yyvsp[(3) - (11)].reg), (yyvsp[(5) - (11)].expr)))
            return yyerror ("Bad dreg pair");
@@ -3955,7 +4007,7 @@ yyreduce:
     break;
 
   case 65:
-#line 1464 "bfin-parse.y"
+#line 1510 "bfin-parse.y"
     {
          if (REG_SAME ((yyvsp[(1) - (11)].reg), (yyvsp[(2) - (11)].reg)) && REG_SAME ((yyvsp[(7) - (11)].reg), (yyvsp[(8) - (11)].reg)) && !REG_SAME ((yyvsp[(1) - (11)].reg), (yyvsp[(7) - (11)].reg)))
            {
@@ -3968,7 +4020,7 @@ yyreduce:
     break;
 
   case 66:
-#line 1475 "bfin-parse.y"
+#line 1521 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (9)].reg)) && IS_DREG ((yyvsp[(4) - (9)].reg)) && IS_DREG ((yyvsp[(6) - (9)].reg))
              && REG_SAME ((yyvsp[(1) - (9)].reg), (yyvsp[(4) - (9)].reg)))
@@ -4008,7 +4060,7 @@ yyreduce:
     break;
 
   case 67:
-#line 1514 "bfin-parse.y"
+#line 1560 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (5)].reg)) && IS_DREG ((yyvsp[(3) - (5)].reg)) && IS_DREG ((yyvsp[(5) - (5)].reg)))
            {
@@ -4021,7 +4073,7 @@ yyreduce:
     break;
 
   case 68:
-#line 1524 "bfin-parse.y"
+#line 1570 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (5)].reg)) && IS_DREG ((yyvsp[(3) - (5)].reg)) && IS_DREG ((yyvsp[(5) - (5)].reg)))
            {
@@ -4034,7 +4086,7 @@ yyreduce:
     break;
 
   case 69:
-#line 1534 "bfin-parse.y"
+#line 1580 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(1) - (9)].reg)) && IS_PREG ((yyvsp[(3) - (9)].reg)) && IS_PREG ((yyvsp[(6) - (9)].reg)))
            {
@@ -4057,47 +4109,51 @@ yyreduce:
     break;
 
   case 70:
-#line 1554 "bfin-parse.y"
+#line 1600 "bfin-parse.y"
     {
-         if (!REG_SAME ((yyvsp[(3) - (5)].reg), (yyvsp[(5) - (5)].reg)))
+         if ((yyvsp[(3) - (5)].reg).regno == REG_A0 && (yyvsp[(5) - (5)].reg).regno == REG_A1)
            {
              notethat ("CCflag: CC = A0 == A1\n");
              (yyval.instr) = CCFLAG (0, 0, 5, 0, 0);
            }
          else
-           return yyerror ("CC register expected");
+           return yyerror ("AREGs are in bad order or same");
        }
     break;
 
   case 71:
-#line 1564 "bfin-parse.y"
+#line 1610 "bfin-parse.y"
     {
-         if (!REG_SAME ((yyvsp[(3) - (5)].reg), (yyvsp[(5) - (5)].reg)))
+         if ((yyvsp[(3) - (5)].reg).regno == REG_A0 && (yyvsp[(5) - (5)].reg).regno == REG_A1)
            {
              notethat ("CCflag: CC = A0 < A1\n");
              (yyval.instr) = CCFLAG (0, 0, 6, 0, 0);
            }
          else
-           return yyerror ("Register mismatch");
+           return yyerror ("AREGs are in bad order or same");
        }
     break;
 
   case 72:
-#line 1574 "bfin-parse.y"
+#line 1620 "bfin-parse.y"
     {
-         if (REG_CLASS((yyvsp[(3) - (6)].reg)) == REG_CLASS((yyvsp[(5) - (6)].reg)))
+         if ((IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_DREG ((yyvsp[(5) - (6)].reg)))
+             || (IS_PREG ((yyvsp[(3) - (6)].reg)) && IS_PREG ((yyvsp[(5) - (6)].reg))))
            {
              notethat ("CCflag: CC = dpregs < dpregs\n");
              (yyval.instr) = CCFLAG (&(yyvsp[(3) - (6)].reg), (yyvsp[(5) - (6)].reg).regno & CODE_MASK, (yyvsp[(6) - (6)].r0).r0, 0, IS_PREG ((yyvsp[(3) - (6)].reg)) ? 1 : 0);
            }
          else
-           return yyerror ("Compare only of same register class");
+           return yyerror ("Bad register in comparison");
        }
     break;
 
   case 73:
-#line 1584 "bfin-parse.y"
+#line 1631 "bfin-parse.y"
     {
+         if (!IS_DREG ((yyvsp[(3) - (6)].reg)) && !IS_PREG ((yyvsp[(3) - (6)].reg)))
+           return yyerror ("Bad register in comparison");
+
          if (((yyvsp[(6) - (6)].r0).r0 == 1 && IS_IMM ((yyvsp[(5) - (6)].expr), 3))
              || ((yyvsp[(6) - (6)].r0).r0 == 3 && IS_UIMM ((yyvsp[(5) - (6)].expr), 3)))
            {
@@ -4110,19 +4166,25 @@ yyreduce:
     break;
 
   case 74:
-#line 1595 "bfin-parse.y"
+#line 1645 "bfin-parse.y"
     {
-         if (REG_CLASS((yyvsp[(3) - (5)].reg)) == REG_CLASS((yyvsp[(5) - (5)].reg)))
+         if ((IS_DREG ((yyvsp[(3) - (5)].reg)) && IS_DREG ((yyvsp[(5) - (5)].reg)))
+             || (IS_PREG ((yyvsp[(3) - (5)].reg)) && IS_PREG ((yyvsp[(5) - (5)].reg))))
            {
              notethat ("CCflag: CC = dpregs == dpregs\n");
              (yyval.instr) = CCFLAG (&(yyvsp[(3) - (5)].reg), (yyvsp[(5) - (5)].reg).regno & CODE_MASK, 0, 0, IS_PREG ((yyvsp[(3) - (5)].reg)) ? 1 : 0);
-           } 
+           }
+         else
+           return yyerror ("Bad register in comparison");
        }
     break;
 
   case 75:
-#line 1603 "bfin-parse.y"
+#line 1656 "bfin-parse.y"
     {
+         if (!IS_DREG ((yyvsp[(3) - (5)].reg)) && !IS_PREG ((yyvsp[(3) - (5)].reg)))
+           return yyerror ("Bad register in comparison");
+
          if (IS_IMM ((yyvsp[(5) - (5)].expr), 3))
            {
              notethat ("CCflag: CC = dpregs == imm3\n");
@@ -4134,52 +4196,44 @@ yyreduce:
     break;
 
   case 76:
-#line 1613 "bfin-parse.y"
+#line 1669 "bfin-parse.y"
     {
-         if (!REG_SAME ((yyvsp[(3) - (5)].reg), (yyvsp[(5) - (5)].reg)))
+         if ((yyvsp[(3) - (5)].reg).regno == REG_A0 && (yyvsp[(5) - (5)].reg).regno == REG_A1)
            {
              notethat ("CCflag: CC = A0 <= A1\n");
              (yyval.instr) = CCFLAG (0, 0, 7, 0, 0);
            }
          else
-           return yyerror ("CC register expected");
+           return yyerror ("AREGs are in bad order or same");
        }
     break;
 
   case 77:
-#line 1623 "bfin-parse.y"
+#line 1679 "bfin-parse.y"
     {
-         if (REG_CLASS((yyvsp[(3) - (6)].reg)) == REG_CLASS((yyvsp[(5) - (6)].reg)))
+         if ((IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_DREG ((yyvsp[(5) - (6)].reg)))
+             || (IS_PREG ((yyvsp[(3) - (6)].reg)) && IS_PREG ((yyvsp[(5) - (6)].reg))))
            {
-             notethat ("CCflag: CC = pregs <= pregs (..)\n");
+             notethat ("CCflag: CC = dpregs <= dpregs (..)\n");
              (yyval.instr) = CCFLAG (&(yyvsp[(3) - (6)].reg), (yyvsp[(5) - (6)].reg).regno & CODE_MASK,
                           1 + (yyvsp[(6) - (6)].r0).r0, 0, IS_PREG ((yyvsp[(3) - (6)].reg)) ? 1 : 0);
            }
          else
-           return yyerror ("Compare only of same register class");
+           return yyerror ("Bad register in comparison");
        }
     break;
 
   case 78:
-#line 1634 "bfin-parse.y"
+#line 1691 "bfin-parse.y"
     {
+         if (!IS_DREG ((yyvsp[(3) - (6)].reg)) && !IS_PREG ((yyvsp[(3) - (6)].reg)))
+           return yyerror ("Bad register in comparison");
+
          if (((yyvsp[(6) - (6)].r0).r0 == 1 && IS_IMM ((yyvsp[(5) - (6)].expr), 3))
              || ((yyvsp[(6) - (6)].r0).r0 == 3 && IS_UIMM ((yyvsp[(5) - (6)].expr), 3)))
            {
-             if (IS_DREG ((yyvsp[(3) - (6)].reg)))
-               {
-                 notethat ("CCflag: CC = dregs <= (u)imm3\n");
-                 /*    x       y     opc     I     G   */
-                 (yyval.instr) = CCFLAG (&(yyvsp[(3) - (6)].reg), imm3 ((yyvsp[(5) - (6)].expr)), 1 + (yyvsp[(6) - (6)].r0).r0, 1, 0);
-               }
-             else if (IS_PREG ((yyvsp[(3) - (6)].reg)))
-               {
-                 notethat ("CCflag: CC = pregs <= (u)imm3\n");
-                 /*    x       y     opc     I     G   */
-                 (yyval.instr) = CCFLAG (&(yyvsp[(3) - (6)].reg), imm3 ((yyvsp[(5) - (6)].expr)), 1 + (yyvsp[(6) - (6)].r0).r0, 1, 1);
-               }
-             else
-               return yyerror ("Dreg or Preg expected");
+             notethat ("CCflag: CC = dpregs <= (u)imm3\n");
+             (yyval.instr) = CCFLAG (&(yyvsp[(3) - (6)].reg), imm3 ((yyvsp[(5) - (6)].expr)), 1 + (yyvsp[(6) - (6)].r0).r0, 1, IS_PREG ((yyvsp[(3) - (6)].reg)) ? 1 : 0);
            }
          else
            return yyerror ("Bad constant value");
@@ -4187,7 +4241,7 @@ yyreduce:
     break;
 
   case 79:
-#line 1658 "bfin-parse.y"
+#line 1706 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (5)].reg)) && IS_DREG ((yyvsp[(3) - (5)].reg)) && IS_DREG ((yyvsp[(5) - (5)].reg)))
            {
@@ -4200,7 +4254,7 @@ yyreduce:
     break;
 
   case 80:
-#line 1669 "bfin-parse.y"
+#line 1717 "bfin-parse.y"
     {
          notethat ("CC2stat operation\n");
          (yyval.instr) = bfin_gen_cc2stat ((yyvsp[(1) - (1)].modcodes).r0, (yyvsp[(1) - (1)].modcodes).x0, (yyvsp[(1) - (1)].modcodes).s0);
@@ -4208,11 +4262,20 @@ yyreduce:
     break;
 
   case 81:
-#line 1675 "bfin-parse.y"
-    {
-         if (IS_ALLREG ((yyvsp[(1) - (3)].reg)) && IS_ALLREG ((yyvsp[(3) - (3)].reg)))
+#line 1723 "bfin-parse.y"
+    {
+         if ((IS_GENREG ((yyvsp[(1) - (3)].reg)) && IS_GENREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_GENREG ((yyvsp[(1) - (3)].reg)) && IS_DAGREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_DAGREG ((yyvsp[(1) - (3)].reg)) && IS_GENREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_DAGREG ((yyvsp[(1) - (3)].reg)) && IS_DAGREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_GENREG ((yyvsp[(1) - (3)].reg)) && (yyvsp[(3) - (3)].reg).regno == REG_USP)
+             || ((yyvsp[(1) - (3)].reg).regno == REG_USP && IS_GENREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_SYSREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_PREG ((yyvsp[(1) - (3)].reg)) && IS_SYSREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_SYSREG ((yyvsp[(1) - (3)].reg)) && IS_DREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_SYSREG ((yyvsp[(1) - (3)].reg)) && IS_PREG ((yyvsp[(3) - (3)].reg)))
+             || (IS_SYSREG ((yyvsp[(1) - (3)].reg)) && (yyvsp[(3) - (3)].reg).regno == REG_USP))
            {
-             notethat ("REGMV: allregs = allregs\n");
              (yyval.instr) = bfin_gen_regmv (&(yyvsp[(3) - (3)].reg), &(yyvsp[(1) - (3)].reg));
            }
          else
@@ -4221,7 +4284,7 @@ yyreduce:
     break;
 
   case 82:
-#line 1686 "bfin-parse.y"
+#line 1743 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -4234,7 +4297,7 @@ yyreduce:
     break;
 
   case 83:
-#line 1697 "bfin-parse.y"
+#line 1754 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)))
            {
@@ -4247,7 +4310,7 @@ yyreduce:
     break;
 
   case 84:
-#line 1708 "bfin-parse.y"
+#line 1765 "bfin-parse.y"
     {
          notethat ("CC2dreg: CC =! CC\n");
          (yyval.instr) = bfin_gen_cc2dreg (3, 0);
@@ -4255,13 +4318,18 @@ yyreduce:
     break;
 
   case 85:
-#line 1716 "bfin-parse.y"
+#line 1773 "bfin-parse.y"
     {
          notethat ("dsp32mult: dregs_half = multiply_halfregs (opt_mode)\n");
 
          if (!IS_H ((yyvsp[(1) - (4)].reg)) && (yyvsp[(4) - (4)].mod).MM)
            return yyerror ("(M) not allowed with MAC0");
 
+         if ((yyvsp[(4) - (4)].mod).mod != 0 && (yyvsp[(4) - (4)].mod).mod != M_FU && (yyvsp[(4) - (4)].mod).mod != M_IS
+             && (yyvsp[(4) - (4)].mod).mod != M_IU && (yyvsp[(4) - (4)].mod).mod != M_T && (yyvsp[(4) - (4)].mod).mod != M_TFU
+             && (yyvsp[(4) - (4)].mod).mod != M_S2RND && (yyvsp[(4) - (4)].mod).mod != M_ISS2 && (yyvsp[(4) - (4)].mod).mod != M_IH)
+           return yyerror ("bad option.");
+
          if (IS_H ((yyvsp[(1) - (4)].reg)))
            {
              (yyval.instr) = DSP32MULT (0, (yyvsp[(4) - (4)].mod).MM, (yyvsp[(4) - (4)].mod).mod, 1, 0,
@@ -4278,7 +4346,7 @@ yyreduce:
     break;
 
   case 86:
-#line 1737 "bfin-parse.y"
+#line 1799 "bfin-parse.y"
     {
          /* Odd registers can use (M).  */
          if (!IS_DREG ((yyvsp[(1) - (4)].reg)))
@@ -4287,6 +4355,10 @@ yyreduce:
          if (IS_EVEN ((yyvsp[(1) - (4)].reg)) && (yyvsp[(4) - (4)].mod).MM)
            return yyerror ("(M) not allowed with MAC0");
 
+         if ((yyvsp[(4) - (4)].mod).mod != 0 && (yyvsp[(4) - (4)].mod).mod != M_FU && (yyvsp[(4) - (4)].mod).mod != M_IS
+             && (yyvsp[(4) - (4)].mod).mod != M_S2RND && (yyvsp[(4) - (4)].mod).mod != M_ISS2)
+           return yyerror ("bad option");
+
          if (!IS_EVEN ((yyvsp[(1) - (4)].reg)))
            {
              notethat ("dsp32mult: dregs = multiply_halfregs (opt_mode)\n");
@@ -4306,7 +4378,7 @@ yyreduce:
     break;
 
   case 87:
-#line 1764 "bfin-parse.y"
+#line 1830 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (9)].reg)) || !IS_DREG ((yyvsp[(6) - (9)].reg))) 
            return yyerror ("Dregs expected");
@@ -4336,7 +4408,7 @@ yyreduce:
     break;
 
   case 88:
-#line 1792 "bfin-parse.y"
+#line 1858 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(1) - (9)].reg)) || !IS_DREG ((yyvsp[(6) - (9)].reg))) 
            return yyerror ("Dregs expected");
@@ -4367,7 +4439,7 @@ yyreduce:
     break;
 
   case 89:
-#line 1823 "bfin-parse.y"
+#line 1889 "bfin-parse.y"
     {
          if (!REG_SAME ((yyvsp[(1) - (5)].reg), (yyvsp[(3) - (5)].reg)))
            return yyerror ("Aregs must be same");
@@ -4383,7 +4455,7 @@ yyreduce:
     break;
 
   case 90:
-#line 1837 "bfin-parse.y"
+#line 1903 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(6) - (7)].reg)) && !IS_H ((yyvsp[(6) - (7)].reg)))
            {
@@ -4396,7 +4468,7 @@ yyreduce:
     break;
 
   case 91:
-#line 1848 "bfin-parse.y"
+#line 1914 "bfin-parse.y"
     {
          if (!REG_SAME ((yyvsp[(1) - (4)].reg), (yyvsp[(2) - (4)].reg)))
            return yyerror ("Aregs must be same");
@@ -4412,7 +4484,7 @@ yyreduce:
     break;
 
   case 92:
-#line 1862 "bfin-parse.y"
+#line 1928 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_UIMM ((yyvsp[(5) - (6)].expr), 5))
            {
@@ -4449,33 +4521,28 @@ yyreduce:
     break;
 
   case 93:
-#line 1896 "bfin-parse.y"
-    {
-         if (IS_UIMM ((yyvsp[(5) - (5)].expr), 4))
-           {
-             notethat ("dsp32shiftimm: dregs_half = dregs_half << uimm4\n");
-             (yyval.instr) = DSP32SHIFTIMM (0x0, &(yyvsp[(1) - (5)].reg), imm5 ((yyvsp[(5) - (5)].expr)), &(yyvsp[(3) - (5)].reg), 2, HL2 ((yyvsp[(1) - (5)].reg), (yyvsp[(3) - (5)].reg)));
-           }
-         else
-           return yyerror ("Bad shift value");
-       }
-    break;
-
-  case 94:
-#line 1906 "bfin-parse.y"
+#line 1962 "bfin-parse.y"
     {
          if (IS_UIMM ((yyvsp[(5) - (6)].expr), 4))
            {
-             notethat ("dsp32shiftimm: dregs_half = dregs_half << uimm4\n");
-             (yyval.instr) = DSP32SHIFTIMM (0x0, &(yyvsp[(1) - (6)].reg), imm5 ((yyvsp[(5) - (6)].expr)), &(yyvsp[(3) - (6)].reg), (yyvsp[(6) - (6)].modcodes).s0, HL2 ((yyvsp[(1) - (6)].reg), (yyvsp[(3) - (6)].reg)));
+             if ((yyvsp[(6) - (6)].modcodes).s0)
+               {
+                 notethat ("dsp32shiftimm: dregs_half = dregs_half << uimm4 (S)\n");
+                 (yyval.instr) = DSP32SHIFTIMM (0x0, &(yyvsp[(1) - (6)].reg), imm5 ((yyvsp[(5) - (6)].expr)), &(yyvsp[(3) - (6)].reg), (yyvsp[(6) - (6)].modcodes).s0, HL2 ((yyvsp[(1) - (6)].reg), (yyvsp[(3) - (6)].reg)));
+               }
+             else
+               {
+                 notethat ("dsp32shiftimm: dregs_half = dregs_half << uimm4\n");
+                 (yyval.instr) = DSP32SHIFTIMM (0x0, &(yyvsp[(1) - (6)].reg), imm5 ((yyvsp[(5) - (6)].expr)), &(yyvsp[(3) - (6)].reg), 2, HL2 ((yyvsp[(1) - (6)].reg), (yyvsp[(3) - (6)].reg)));
+               }
            }
          else
            return yyerror ("Bad shift value");
        }
     break;
 
-  case 95:
-#line 1916 "bfin-parse.y"
+  case 94:
+#line 1980 "bfin-parse.y"
     {
          int op;
 
@@ -4500,8 +4567,8 @@ yyreduce:
        }
     break;
 
-  case 96:
-#line 1941 "bfin-parse.y"
+  case 95:
+#line 2005 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(1) - (9)].reg)) && IS_DREG_L ((yyvsp[(5) - (9)].reg)) && IS_DREG_L ((yyvsp[(7) - (9)].reg)))
            {
@@ -4513,8 +4580,8 @@ yyreduce:
        }
     break;
 
-  case 97:
-#line 1953 "bfin-parse.y"
+  case 96:
+#line 2017 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(1) - (8)].reg)) && IS_DREG_L ((yyvsp[(5) - (8)].reg)) && IS_DREG_L ((yyvsp[(7) - (8)].reg)))
            {
@@ -4531,8 +4598,8 @@ yyreduce:
        }
     break;
 
-  case 98:
-#line 1971 "bfin-parse.y"
+  case 97:
+#line 2035 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (8)].reg)) && IS_DREG ((yyvsp[(5) - (8)].reg)) && IS_DREG ((yyvsp[(7) - (8)].reg)))
            {
@@ -4544,8 +4611,8 @@ yyreduce:
        }
     break;
 
-  case 99:
-#line 1982 "bfin-parse.y"
+  case 98:
+#line 2046 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (11)].reg)) && IS_DREG ((yyvsp[(5) - (11)].reg)) && IS_DREG ((yyvsp[(7) - (11)].reg)))
            {
@@ -4557,8 +4624,8 @@ yyreduce:
        }
     break;
 
-  case 100:
-#line 1993 "bfin-parse.y"
+  case 99:
+#line 2057 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (9)].reg)) && IS_DREG ((yyvsp[(5) - (9)].reg)) && IS_DREG_L ((yyvsp[(7) - (9)].reg)))
            {
@@ -4570,8 +4637,8 @@ yyreduce:
        }
     break;
 
-  case 101:
-#line 2004 "bfin-parse.y"
+  case 100:
+#line 2068 "bfin-parse.y"
     {
          if (!REG_SAME ((yyvsp[(1) - (4)].reg), (yyvsp[(2) - (4)].reg)))
            return yyerror ("Aregs must be same");
@@ -4586,8 +4653,8 @@ yyreduce:
        }
     break;
 
-  case 102:
-#line 2017 "bfin-parse.y"
+  case 101:
+#line 2081 "bfin-parse.y"
     {
          if (REG_SAME ((yyvsp[(1) - (5)].reg), (yyvsp[(3) - (5)].reg)) && IS_DREG_L ((yyvsp[(5) - (5)].reg)))
            {
@@ -4599,8 +4666,8 @@ yyreduce:
        }
     break;
 
-  case 103:
-#line 2028 "bfin-parse.y"
+  case 102:
+#line 2092 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(4) - (6)].reg)) && IS_DREG_L ((yyvsp[(6) - (6)].reg)))
            {
@@ -4612,8 +4679,8 @@ yyreduce:
        }
     break;
 
-  case 104:
-#line 2039 "bfin-parse.y"
+  case 103:
+#line 2103 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (7)].reg)) && IS_DREG ((yyvsp[(4) - (7)].reg)) && IS_DREG_L ((yyvsp[(6) - (7)].reg)))
            {
@@ -4625,8 +4692,8 @@ yyreduce:
        }
     break;
 
-  case 105:
-#line 2050 "bfin-parse.y"
+  case 104:
+#line 2114 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(4) - (6)].reg)) && IS_DREG_L ((yyvsp[(6) - (6)].reg)))
            {
@@ -4638,8 +4705,8 @@ yyreduce:
        }
     break;
 
-  case 106:
-#line 2061 "bfin-parse.y"
+  case 105:
+#line 2125 "bfin-parse.y"
     {
          if (REG_SAME ((yyvsp[(1) - (4)].reg), (yyvsp[(2) - (4)].reg)) && IS_IMM ((yyvsp[(4) - (4)].expr), 6) >= 0)
            {
@@ -4651,8 +4718,8 @@ yyreduce:
        }
     break;
 
-  case 107:
-#line 2072 "bfin-parse.y"
+  case 106:
+#line 2136 "bfin-parse.y"
     {
          if ((yyvsp[(6) - (6)].r0).r0 == 1)
            {
@@ -4687,8 +4754,8 @@ yyreduce:
        }
     break;
 
-  case 108:
-#line 2105 "bfin-parse.y"
+  case 107:
+#line 2169 "bfin-parse.y"
     {
          if (IS_UIMM ((yyvsp[(5) - (5)].expr), 5))
            {
@@ -4700,8 +4767,8 @@ yyreduce:
        }
     break;
 
-  case 109:
-#line 2115 "bfin-parse.y"
+  case 108:
+#line 2179 "bfin-parse.y"
     {
          if (IS_UIMM ((yyvsp[(5) - (6)].expr), 5))
            {
@@ -4714,8 +4781,8 @@ yyreduce:
        }
     break;
 
-  case 110:
-#line 2128 "bfin-parse.y"
+  case 109:
+#line 2192 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_UIMM ((yyvsp[(5) - (6)].expr), 5))
            {
@@ -4736,8 +4803,8 @@ yyreduce:
        }
     break;
 
-  case 111:
-#line 2148 "bfin-parse.y"
+  case 110:
+#line 2212 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(1) - (4)].reg)) && IS_DREG ((yyvsp[(4) - (4)].reg)))
            {
@@ -4749,8 +4816,8 @@ yyreduce:
        }
     break;
 
-  case 112:
-#line 2159 "bfin-parse.y"
+  case 111:
+#line 2223 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (8)].reg)) && IS_DREG ((yyvsp[(5) - (8)].reg)) && IS_DREG ((yyvsp[(7) - (8)].reg)))
            {
@@ -4762,8 +4829,8 @@ yyreduce:
        }
     break;
 
-  case 113:
-#line 2170 "bfin-parse.y"
+  case 112:
+#line 2234 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (10)].reg))
              && (yyvsp[(7) - (10)].reg).regno == REG_A0
@@ -4777,8 +4844,8 @@ yyreduce:
        }
     break;
 
-  case 114:
-#line 2183 "bfin-parse.y"
+  case 113:
+#line 2247 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (10)].reg))
              && (yyvsp[(7) - (10)].reg).regno == REG_A0
@@ -4792,8 +4859,8 @@ yyreduce:
        }
     break;
 
-  case 115:
-#line 2196 "bfin-parse.y"
+  case 114:
+#line 2260 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (12)].reg)) && !IS_H ((yyvsp[(1) - (12)].reg)) && !REG_SAME ((yyvsp[(7) - (12)].reg), (yyvsp[(9) - (12)].reg)))
            {
@@ -4805,8 +4872,8 @@ yyreduce:
        }
     break;
 
-  case 116:
-#line 2207 "bfin-parse.y"
+  case 115:
+#line 2271 "bfin-parse.y"
     {
          if (REG_SAME ((yyvsp[(1) - (5)].reg), (yyvsp[(3) - (5)].reg)) && IS_DREG_L ((yyvsp[(5) - (5)].reg)))
            {
@@ -4818,8 +4885,8 @@ yyreduce:
        }
     break;
 
-  case 117:
-#line 2218 "bfin-parse.y"
+  case 116:
+#line 2282 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(4) - (6)].reg)) && IS_DREG_L ((yyvsp[(6) - (6)].reg)))
            {
@@ -4831,8 +4898,8 @@ yyreduce:
        }
     break;
 
-  case 118:
-#line 2229 "bfin-parse.y"
+  case 117:
+#line 2293 "bfin-parse.y"
     {
          if (IS_IMM ((yyvsp[(5) - (5)].expr), 6))
            {
@@ -4844,8 +4911,8 @@ yyreduce:
        }
     break;
 
-  case 119:
-#line 2240 "bfin-parse.y"
+  case 118:
+#line 2304 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_DREG ((yyvsp[(4) - (6)].reg)) && IS_IMM ((yyvsp[(6) - (6)].expr), 6))
            {
@@ -4856,8 +4923,8 @@ yyreduce:
        }
     break;
 
-  case 120:
-#line 2250 "bfin-parse.y"
+  case 119:
+#line 2314 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(1) - (4)].reg)))
            {
@@ -4869,8 +4936,8 @@ yyreduce:
        }
     break;
 
-  case 121:
-#line 2261 "bfin-parse.y"
+  case 120:
+#line 2325 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(1) - (4)].reg)) && IS_DREG ((yyvsp[(4) - (4)].reg)))
            {
@@ -4882,8 +4949,8 @@ yyreduce:
        }
     break;
 
-  case 122:
-#line 2272 "bfin-parse.y"
+  case 121:
+#line 2336 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(1) - (4)].reg)))
            {
@@ -4895,8 +4962,8 @@ yyreduce:
        }
     break;
 
-  case 123:
-#line 2284 "bfin-parse.y"
+  case 122:
+#line 2348 "bfin-parse.y"
     {
          if (IS_DREG_L ((yyvsp[(1) - (7)].reg)) && IS_DREG ((yyvsp[(5) - (7)].reg)))
            {
@@ -4908,8 +4975,8 @@ yyreduce:
        }
     break;
 
-  case 124:
-#line 2295 "bfin-parse.y"
+  case 123:
+#line 2359 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (9)].reg)) && IS_DREG ((yyvsp[(5) - (9)].reg)) && IS_DREG ((yyvsp[(7) - (9)].reg)))
            {
@@ -4921,8 +4988,8 @@ yyreduce:
        }
     break;
 
-  case 125:
-#line 2306 "bfin-parse.y"
+  case 124:
+#line 2370 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (9)].reg)) && IS_DREG ((yyvsp[(5) - (9)].reg)) && !IS_A1 ((yyvsp[(7) - (9)].reg)))
            {
@@ -4934,8 +5001,8 @@ yyreduce:
        }
     break;
 
-  case 126:
-#line 2317 "bfin-parse.y"
+  case 125:
+#line 2381 "bfin-parse.y"
     {
          if (!IS_A1 ((yyvsp[(1) - (9)].reg)) && !IS_A1 ((yyvsp[(4) - (9)].reg)) && IS_A1 ((yyvsp[(6) - (9)].reg)))
            {
@@ -4947,8 +5014,8 @@ yyreduce:
        }
     break;
 
-  case 127:
-#line 2330 "bfin-parse.y"
+  case 126:
+#line 2394 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_UIMM ((yyvsp[(5) - (6)].expr), 5))
            {
@@ -4960,8 +5027,8 @@ yyreduce:
        }
     break;
 
-  case 128:
-#line 2342 "bfin-parse.y"
+  case 127:
+#line 2406 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_UIMM ((yyvsp[(5) - (6)].expr), 5))
            {
@@ -4973,8 +5040,8 @@ yyreduce:
        }
     break;
 
-  case 129:
-#line 2354 "bfin-parse.y"
+  case 128:
+#line 2418 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_UIMM ((yyvsp[(5) - (6)].expr), 5))
            {
@@ -4986,8 +5053,8 @@ yyreduce:
        }
     break;
 
-  case 130:
-#line 2365 "bfin-parse.y"
+  case 129:
+#line 2429 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(5) - (8)].reg)) && IS_UIMM ((yyvsp[(7) - (8)].expr), 5))
            {
@@ -4999,8 +5066,8 @@ yyreduce:
        }
     break;
 
-  case 131:
-#line 2376 "bfin-parse.y"
+  case 130:
+#line 2440 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(5) - (8)].reg)) && IS_UIMM ((yyvsp[(7) - (8)].expr), 5))
            {
@@ -5012,8 +5079,8 @@ yyreduce:
        }
     break;
 
-  case 132:
-#line 2387 "bfin-parse.y"
+  case 131:
+#line 2451 "bfin-parse.y"
     {
          if ((IS_DREG ((yyvsp[(4) - (6)].reg)) || IS_PREG ((yyvsp[(4) - (6)].reg)))
              && (IS_DREG ((yyvsp[(6) - (6)].reg)) || IS_PREG ((yyvsp[(6) - (6)].reg))))
@@ -5026,8 +5093,8 @@ yyreduce:
        }
     break;
 
-  case 133:
-#line 2399 "bfin-parse.y"
+  case 132:
+#line 2463 "bfin-parse.y"
     {
          if ((IS_DREG ((yyvsp[(5) - (5)].reg)) || IS_PREG ((yyvsp[(5) - (5)].reg)))
              && (IS_DREG ((yyvsp[(3) - (5)].reg)) || IS_PREG ((yyvsp[(3) - (5)].reg))))
@@ -5040,8 +5107,8 @@ yyreduce:
        }
     break;
 
-  case 134:
-#line 2411 "bfin-parse.y"
+  case 133:
+#line 2475 "bfin-parse.y"
     {
          if (IS_PCREL10 ((yyvsp[(5) - (5)].expr)))
            {
@@ -5053,8 +5120,8 @@ yyreduce:
        }
     break;
 
-  case 135:
-#line 2422 "bfin-parse.y"
+  case 134:
+#line 2486 "bfin-parse.y"
     {
          if (IS_PCREL10 ((yyvsp[(5) - (8)].expr)))
            {
@@ -5066,8 +5133,8 @@ yyreduce:
        }
     break;
 
-  case 136:
-#line 2433 "bfin-parse.y"
+  case 135:
+#line 2497 "bfin-parse.y"
     {
          if (IS_PCREL10 ((yyvsp[(4) - (4)].expr)))
            {
@@ -5079,8 +5146,8 @@ yyreduce:
        }
     break;
 
-  case 137:
-#line 2444 "bfin-parse.y"
+  case 136:
+#line 2508 "bfin-parse.y"
     {
          if (IS_PCREL10 ((yyvsp[(4) - (7)].expr)))
            {
@@ -5092,88 +5159,88 @@ yyreduce:
        }
     break;
 
-  case 138:
-#line 2454 "bfin-parse.y"
+  case 137:
+#line 2518 "bfin-parse.y"
     {
          notethat ("ProgCtrl: NOP\n");
          (yyval.instr) = PROGCTRL (0, 0);
        }
     break;
 
-  case 139:
-#line 2460 "bfin-parse.y"
+  case 138:
+#line 2524 "bfin-parse.y"
     {
          notethat ("ProgCtrl: RTS\n");
          (yyval.instr) = PROGCTRL (1, 0);
        }
     break;
 
-  case 140:
-#line 2466 "bfin-parse.y"
+  case 139:
+#line 2530 "bfin-parse.y"
     {
          notethat ("ProgCtrl: RTI\n");
          (yyval.instr) = PROGCTRL (1, 1);
        }
     break;
 
-  case 141:
-#line 2472 "bfin-parse.y"
+  case 140:
+#line 2536 "bfin-parse.y"
     {
          notethat ("ProgCtrl: RTX\n");
          (yyval.instr) = PROGCTRL (1, 2);
        }
     break;
 
-  case 142:
-#line 2478 "bfin-parse.y"
+  case 141:
+#line 2542 "bfin-parse.y"
     {
          notethat ("ProgCtrl: RTN\n");
          (yyval.instr) = PROGCTRL (1, 3);
        }
     break;
 
-  case 143:
-#line 2484 "bfin-parse.y"
+  case 142:
+#line 2548 "bfin-parse.y"
     {
          notethat ("ProgCtrl: RTE\n");
          (yyval.instr) = PROGCTRL (1, 4);
        }
     break;
 
-  case 144:
-#line 2490 "bfin-parse.y"
+  case 143:
+#line 2554 "bfin-parse.y"
     {
          notethat ("ProgCtrl: IDLE\n");
          (yyval.instr) = PROGCTRL (2, 0);
        }
     break;
 
-  case 145:
-#line 2496 "bfin-parse.y"
+  case 144:
+#line 2560 "bfin-parse.y"
     {
          notethat ("ProgCtrl: CSYNC\n");
          (yyval.instr) = PROGCTRL (2, 3);
        }
     break;
 
-  case 146:
-#line 2502 "bfin-parse.y"
+  case 145:
+#line 2566 "bfin-parse.y"
     {
          notethat ("ProgCtrl: SSYNC\n");
          (yyval.instr) = PROGCTRL (2, 4);
        }
     break;
 
-  case 147:
-#line 2508 "bfin-parse.y"
+  case 146:
+#line 2572 "bfin-parse.y"
     {
          notethat ("ProgCtrl: EMUEXCPT\n");
          (yyval.instr) = PROGCTRL (2, 5);
        }
     break;
 
-  case 148:
-#line 2514 "bfin-parse.y"
+  case 147:
+#line 2578 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(2) - (2)].reg)))
            {
@@ -5185,8 +5252,8 @@ yyreduce:
        }
     break;
 
-  case 149:
-#line 2525 "bfin-parse.y"
+  case 148:
+#line 2589 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(2) - (2)].reg)))
            {
@@ -5198,8 +5265,8 @@ yyreduce:
        }
     break;
 
-  case 150:
-#line 2536 "bfin-parse.y"
+  case 149:
+#line 2600 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(3) - (4)].reg)))
            {
@@ -5211,8 +5278,8 @@ yyreduce:
        }
     break;
 
-  case 151:
-#line 2547 "bfin-parse.y"
+  case 150:
+#line 2611 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(3) - (4)].reg)))
            {
@@ -5224,8 +5291,8 @@ yyreduce:
        }
     break;
 
-  case 152:
-#line 2558 "bfin-parse.y"
+  case 151:
+#line 2622 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(5) - (6)].reg)))
            {
@@ -5237,8 +5304,8 @@ yyreduce:
        }
     break;
 
-  case 153:
-#line 2569 "bfin-parse.y"
+  case 152:
+#line 2633 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(5) - (6)].reg)))
            {
@@ -5250,8 +5317,8 @@ yyreduce:
        }
     break;
 
-  case 154:
-#line 2580 "bfin-parse.y"
+  case 153:
+#line 2644 "bfin-parse.y"
     {
          if (IS_UIMM ((yyvsp[(2) - (2)].expr), 4))
            {
@@ -5263,16 +5330,16 @@ yyreduce:
        }
     break;
 
-  case 155:
-#line 2591 "bfin-parse.y"
+  case 154:
+#line 2655 "bfin-parse.y"
     {
                notethat ("ProgCtrl: EMUEXCPT\n");
                (yyval.instr) = PROGCTRL (10, uimm4 ((yyvsp[(2) - (2)].expr)));
        }
     break;
 
-  case 156:
-#line 2597 "bfin-parse.y"
+  case 155:
+#line 2661 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(3) - (4)].reg)))
            {
@@ -5284,8 +5351,8 @@ yyreduce:
        }
     break;
 
-  case 157:
-#line 2608 "bfin-parse.y"
+  case 156:
+#line 2672 "bfin-parse.y"
     {
          if (IS_PCREL12 ((yyvsp[(2) - (2)].expr)))
            {
@@ -5297,8 +5364,8 @@ yyreduce:
        }
     break;
 
-  case 158:
-#line 2619 "bfin-parse.y"
+  case 157:
+#line 2683 "bfin-parse.y"
     {
          if (IS_PCREL12 ((yyvsp[(2) - (2)].expr)))
            {
@@ -5310,8 +5377,8 @@ yyreduce:
        }
     break;
 
-  case 159:
-#line 2630 "bfin-parse.y"
+  case 158:
+#line 2694 "bfin-parse.y"
     {
          if (IS_PCREL24 ((yyvsp[(2) - (2)].expr)))
            {
@@ -5323,8 +5390,8 @@ yyreduce:
        }
     break;
 
-  case 160:
-#line 2641 "bfin-parse.y"
+  case 159:
+#line 2705 "bfin-parse.y"
     {
          if (IS_PCREL24 ((yyvsp[(2) - (2)].expr)))
            {
@@ -5336,8 +5403,8 @@ yyreduce:
        }
     break;
 
-  case 161:
-#line 2652 "bfin-parse.y"
+  case 160:
+#line 2716 "bfin-parse.y"
     {
          if (IS_PCREL24 ((yyvsp[(2) - (2)].expr)))
            {
@@ -5349,8 +5416,8 @@ yyreduce:
        }
     break;
 
-  case 162:
-#line 2662 "bfin-parse.y"
+  case 161:
+#line 2726 "bfin-parse.y"
     {
          if (IS_PCREL24 ((yyvsp[(2) - (2)].expr)))
            {
@@ -5362,8 +5429,8 @@ yyreduce:
        }
     break;
 
-  case 163:
-#line 2675 "bfin-parse.y"
+  case 162:
+#line 2739 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_DREG ((yyvsp[(5) - (6)].reg)))
            (yyval.instr) = ALU2OP (&(yyvsp[(3) - (6)].reg), &(yyvsp[(5) - (6)].reg), 8);
@@ -5372,8 +5439,8 @@ yyreduce:
        }
     break;
 
-  case 164:
-#line 2683 "bfin-parse.y"
+  case 163:
+#line 2747 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(3) - (6)].reg)) && IS_DREG ((yyvsp[(5) - (6)].reg)))
            (yyval.instr) = ALU2OP (&(yyvsp[(3) - (6)].reg), &(yyvsp[(5) - (6)].reg), 9);
@@ -5382,8 +5449,8 @@ yyreduce:
        }
     break;
 
-  case 165:
-#line 2691 "bfin-parse.y"
+  case 164:
+#line 2755 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (5)].reg)) && IS_DREG ((yyvsp[(4) - (5)].reg)))
            {
@@ -5408,8 +5475,8 @@ yyreduce:
        }
     break;
 
-  case 166:
-#line 2715 "bfin-parse.y"
+  case 165:
+#line 2779 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (4)].reg)) && IS_DREG ((yyvsp[(4) - (4)].reg)))
            {
@@ -5421,8 +5488,8 @@ yyreduce:
        }
     break;
 
-  case 167:
-#line 2726 "bfin-parse.y"
+  case 166:
+#line 2790 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_DREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -5434,8 +5501,8 @@ yyreduce:
        }
     break;
 
-  case 168:
-#line 2737 "bfin-parse.y"
+  case 167:
+#line 2801 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_UIMM ((yyvsp[(3) - (3)].expr), 5))
            {
@@ -5447,8 +5514,8 @@ yyreduce:
        }
     break;
 
-  case 169:
-#line 2748 "bfin-parse.y"
+  case 168:
+#line 2812 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_DREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -5460,8 +5527,8 @@ yyreduce:
        }
     break;
 
-  case 170:
-#line 2759 "bfin-parse.y"
+  case 169:
+#line 2823 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_DREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -5473,8 +5540,8 @@ yyreduce:
        }
     break;
 
-  case 171:
-#line 2770 "bfin-parse.y"
+  case 170:
+#line 2834 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_UIMM ((yyvsp[(3) - (3)].expr), 5))
            {
@@ -5486,8 +5553,8 @@ yyreduce:
        }
     break;
 
-  case 172:
-#line 2782 "bfin-parse.y"
+  case 171:
+#line 2846 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_UIMM ((yyvsp[(3) - (3)].expr), 5))
            {
@@ -5499,8 +5566,8 @@ yyreduce:
        }
     break;
 
-  case 173:
-#line 2795 "bfin-parse.y"
+  case 172:
+#line 2859 "bfin-parse.y"
     {
          notethat ("CaCTRL: FLUSH [ pregs ]\n");
          if (IS_PREG ((yyvsp[(3) - (4)].reg)))
@@ -5510,8 +5577,8 @@ yyreduce:
        }
     break;
 
-  case 174:
-#line 2804 "bfin-parse.y"
+  case 173:
+#line 2868 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(2) - (2)].reg)))
            {
@@ -5523,8 +5590,8 @@ yyreduce:
        }
     break;
 
-  case 175:
-#line 2815 "bfin-parse.y"
+  case 174:
+#line 2879 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(3) - (4)].reg)))
            {
@@ -5536,8 +5603,8 @@ yyreduce:
        }
     break;
 
-  case 176:
-#line 2826 "bfin-parse.y"
+  case 175:
+#line 2890 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(2) - (2)].reg)))
            {
@@ -5549,8 +5616,8 @@ yyreduce:
        }
     break;
 
-  case 177:
-#line 2838 "bfin-parse.y"
+  case 176:
+#line 2902 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(3) - (4)].reg)))
            {
@@ -5562,8 +5629,8 @@ yyreduce:
        }
     break;
 
-  case 178:
-#line 2849 "bfin-parse.y"
+  case 177:
+#line 2913 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(2) - (2)].reg)))
            {
@@ -5575,8 +5642,8 @@ yyreduce:
        }
     break;
 
-  case 179:
-#line 2860 "bfin-parse.y"
+  case 178:
+#line 2924 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(3) - (4)].reg)))
            {
@@ -5588,8 +5655,8 @@ yyreduce:
        }
     break;
 
-  case 180:
-#line 2871 "bfin-parse.y"
+  case 179:
+#line 2935 "bfin-parse.y"
     {
          if (IS_PREG ((yyvsp[(2) - (2)].reg)))
            {
@@ -5601,101 +5668,133 @@ yyreduce:
        }
     break;
 
-  case 181:
-#line 2885 "bfin-parse.y"
+  case 180:
+#line 2949 "bfin-parse.y"
     {
-         if (IS_PREG ((yyvsp[(3) - (7)].reg)) && IS_DREG ((yyvsp[(7) - (7)].reg)))
-           {
-             notethat ("LDST: B [ pregs <post_op> ] = dregs\n");
-             (yyval.instr) = LDST (&(yyvsp[(3) - (7)].reg), &(yyvsp[(7) - (7)].reg), (yyvsp[(4) - (7)].modcodes).x0, 2, 0, 1);
-           }
-         else
-           return yyerror ("Register mismatch");
+         if (!IS_DREG ((yyvsp[(7) - (7)].reg)))
+           return yyerror ("Dreg expected for source operand");
+         if (!IS_PREG ((yyvsp[(3) - (7)].reg)))
+           return yyerror ("Preg expected in address");
+
+         notethat ("LDST: B [ pregs <post_op> ] = dregs\n");
+         (yyval.instr) = LDST (&(yyvsp[(3) - (7)].reg), &(yyvsp[(7) - (7)].reg), (yyvsp[(4) - (7)].modcodes).x0, 2, 0, 1);
        }
     break;
 
-  case 182:
-#line 2897 "bfin-parse.y"
+  case 181:
+#line 2961 "bfin-parse.y"
     {
-         if (IS_PREG ((yyvsp[(3) - (8)].reg)) && IS_RANGE(16, (yyvsp[(5) - (8)].expr), (yyvsp[(4) - (8)].r0).r0, 1) && IS_DREG ((yyvsp[(8) - (8)].reg)))
+         Expr_Node *tmp = (yyvsp[(5) - (8)].expr);
+
+         if (!IS_DREG ((yyvsp[(8) - (8)].reg)))
+           return yyerror ("Dreg expected for source operand");
+         if (!IS_PREG ((yyvsp[(3) - (8)].reg)))
+           return yyerror ("Preg expected in address");
+
+         if (IS_RELOC ((yyvsp[(5) - (8)].expr)))
+           return yyerror ("Plain symbol used as offset");
+
+         if ((yyvsp[(4) - (8)].r0).r0)
+           tmp = unary (Expr_Op_Type_NEG, tmp);
+           
+         if (in_range_p (tmp, -32768, 32767, 0))
            {
              notethat ("LDST: B [ pregs + imm16 ] = dregs\n");
-             if ((yyvsp[(4) - (8)].r0).r0)
-               neg_value ((yyvsp[(5) - (8)].expr));
              (yyval.instr) = LDSTIDXI (&(yyvsp[(3) - (8)].reg), &(yyvsp[(8) - (8)].reg), 1, 2, 0, (yyvsp[(5) - (8)].expr));
            }
          else
-           return yyerror ("Register mismatch or const size wrong");
+           return yyerror ("Displacement out of range");
        }
     break;
 
-  case 183:
-#line 2912 "bfin-parse.y"
+  case 182:
+#line 2987 "bfin-parse.y"
     {
-         if (IS_PREG ((yyvsp[(3) - (8)].reg)) && IS_URANGE (4, (yyvsp[(5) - (8)].expr), (yyvsp[(4) - (8)].r0).r0, 2) && IS_DREG ((yyvsp[(8) - (8)].reg)))
+         Expr_Node *tmp = (yyvsp[(5) - (8)].expr);
+
+         if (!IS_DREG ((yyvsp[(8) - (8)].reg)))
+           return yyerror ("Dreg expected for source operand");
+         if (!IS_PREG ((yyvsp[(3) - (8)].reg)))
+           return yyerror ("Preg expected in address");
+         
+         if ((yyvsp[(4) - (8)].r0).r0)
+           tmp = unary (Expr_Op_Type_NEG, tmp);
+
+         if (IS_RELOC ((yyvsp[(5) - (8)].expr)))
+           return yyerror ("Plain symbol used as offset");
+
+         if (in_range_p (tmp, 0, 30, 1))
            {
              notethat ("LDSTii: W [ pregs +- uimm5m2 ] = dregs\n");
-             (yyval.instr) = LDSTII (&(yyvsp[(3) - (8)].reg), &(yyvsp[(8) - (8)].reg), (yyvsp[(5) - (8)].expr), 1, 1);
+             (yyval.instr) = LDSTII (&(yyvsp[(3) - (8)].reg), &(yyvsp[(8) - (8)].reg), tmp, 1, 1);
            }
-         else if (IS_PREG ((yyvsp[(3) - (8)].reg)) && IS_RANGE(16, (yyvsp[(5) - (8)].expr), (yyvsp[(4) - (8)].r0).r0, 2) && IS_DREG ((yyvsp[(8) - (8)].reg)))
+         else if (in_range_p (tmp, -65536, 65535, 1))
            {
              notethat ("LDSTidxI: W [ pregs + imm17m2 ] = dregs\n");
-             if ((yyvsp[(4) - (8)].r0).r0)
-               neg_value ((yyvsp[(5) - (8)].expr));
-             (yyval.instr) = LDSTIDXI (&(yyvsp[(3) - (8)].reg), &(yyvsp[(8) - (8)].reg), 1, 1, 0, (yyvsp[(5) - (8)].expr));
+             (yyval.instr) = LDSTIDXI (&(yyvsp[(3) - (8)].reg), &(yyvsp[(8) - (8)].reg), 1, 1, 0, tmp);
            }
          else
-           return yyerror ("Bad register(s) or wrong constant size");
+           return yyerror ("Displacement out of range");
        }
     break;
 
-  case 184:
-#line 2931 "bfin-parse.y"
+  case 183:
+#line 3017 "bfin-parse.y"
     {
-         if (IS_PREG ((yyvsp[(3) - (7)].reg)) && IS_DREG ((yyvsp[(7) - (7)].reg)))
-           {
-             notethat ("LDST: W [ pregs <post_op> ] = dregs\n");
-             (yyval.instr) = LDST (&(yyvsp[(3) - (7)].reg), &(yyvsp[(7) - (7)].reg), (yyvsp[(4) - (7)].modcodes).x0, 1, 0, 1);
-           }
-         else
-           return yyerror ("Bad register(s) for STORE");
+         if (!IS_DREG ((yyvsp[(7) - (7)].reg)))
+           return yyerror ("Dreg expected for source operand");
+         if (!IS_PREG ((yyvsp[(3) - (7)].reg)))
+           return yyerror ("Preg expected in address");
+
+         notethat ("LDST: W [ pregs <post_op> ] = dregs\n");
+         (yyval.instr) = LDST (&(yyvsp[(3) - (7)].reg), &(yyvsp[(7) - (7)].reg), (yyvsp[(4) - (7)].modcodes).x0, 1, 0, 1);
        }
     break;
 
-  case 185:
-#line 2942 "bfin-parse.y"
+  case 184:
+#line 3028 "bfin-parse.y"
     {
+         if (!IS_DREG ((yyvsp[(7) - (7)].reg)))
+           return yyerror ("Dreg expected for source operand");
+         if ((yyvsp[(4) - (7)].modcodes).x0 == 2)
+           {
+             if (!IS_IREG ((yyvsp[(3) - (7)].reg)) && !IS_PREG ((yyvsp[(3) - (7)].reg)))
+               return yyerror ("Ireg or Preg expected in address");
+           }
+         else if (!IS_IREG ((yyvsp[(3) - (7)].reg)))
+           return yyerror ("Ireg expected in address");
+
          if (IS_IREG ((yyvsp[(3) - (7)].reg)))
            {
              notethat ("dspLDST: W [ iregs <post_op> ] = dregs_half\n");
              (yyval.instr) = DSPLDST (&(yyvsp[(3) - (7)].reg), 1 + IS_H ((yyvsp[(7) - (7)].reg)), &(yyvsp[(7) - (7)].reg), (yyvsp[(4) - (7)].modcodes).x0, 1);
            }
-         else if ((yyvsp[(4) - (7)].modcodes).x0 == 2 && IS_PREG ((yyvsp[(3) - (7)].reg)) && IS_DREG ((yyvsp[(7) - (7)].reg)))
+         else
            {
-             notethat ("LDSTpmod: W [ pregs <post_op>] = dregs_half\n");
+             notethat ("LDSTpmod: W [ pregs ] = dregs_half\n");
              (yyval.instr) = LDSTPMOD (&(yyvsp[(3) - (7)].reg), &(yyvsp[(7) - (7)].reg), &(yyvsp[(3) - (7)].reg), 1 + IS_H ((yyvsp[(7) - (7)].reg)), 1);
-             
            }
-         else
-           return yyerror ("Bad register(s) for STORE");
        }
     break;
 
-  case 186:
-#line 2960 "bfin-parse.y"
+  case 185:
+#line 3053 "bfin-parse.y"
     {
          Expr_Node *tmp = (yyvsp[(4) - (7)].expr);
          int ispreg = IS_PREG ((yyvsp[(7) - (7)].reg));
 
          if (!IS_PREG ((yyvsp[(2) - (7)].reg)))
-           return yyerror ("Preg expected for indirect");
+           return yyerror ("Preg expected in address");
 
          if (!IS_DREG ((yyvsp[(7) - (7)].reg)) && !ispreg)
-           return yyerror ("Bad source register for STORE");
+           return yyerror ("Preg expected for source operand");
 
          if ((yyvsp[(3) - (7)].r0).r0)
            tmp = unary (Expr_Op_Type_NEG, tmp);
 
+         if (IS_RELOC ((yyvsp[(4) - (7)].expr)))
+           return yyerror ("Plain symbol used as offset");
+
          if (in_range_p (tmp, 0, 63, 3))
            {
              notethat ("LDSTii: dpregs = [ pregs + uimm6m4 ]\n");
@@ -5710,118 +5809,141 @@ yyreduce:
          else if (in_range_p (tmp, -131072, 131071, 3))
            {
              notethat ("LDSTidxI: [ pregs + imm18m4 ] = dpregs\n");
-             (yyval.instr) = LDSTIDXI (&(yyvsp[(2) - (7)].reg), &(yyvsp[(7) - (7)].reg), 1, 0, ispreg ? 1: 0, tmp);
+             (yyval.instr) = LDSTIDXI (&(yyvsp[(2) - (7)].reg), &(yyvsp[(7) - (7)].reg), 1, 0, ispreg ? 1 : 0, tmp);
            }
          else
-           return yyerror ("Displacement out of range for store");
+           return yyerror ("Displacement out of range");
        }
     break;
 
-  case 187:
-#line 2994 "bfin-parse.y"
+  case 186:
+#line 3090 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (9)].reg)) && IS_PREG ((yyvsp[(5) - (9)].reg)) && IS_URANGE (4, (yyvsp[(7) - (9)].expr), (yyvsp[(6) - (9)].r0).r0, 2))
+         Expr_Node *tmp = (yyvsp[(7) - (9)].expr);
+         if (!IS_DREG ((yyvsp[(1) - (9)].reg)))
+           return yyerror ("Dreg expected for destination operand");
+         if (!IS_PREG ((yyvsp[(5) - (9)].reg)))
+           return yyerror ("Preg expected in address");
+
+         if ((yyvsp[(6) - (9)].r0).r0)
+           tmp = unary (Expr_Op_Type_NEG, tmp);
+
+         if (IS_RELOC ((yyvsp[(7) - (9)].expr)))
+           return yyerror ("Plain symbol used as offset");
+
+         if (in_range_p (tmp, 0, 30, 1))
            {
-             notethat ("LDSTii: dregs = W [ pregs + uimm4s2 ] (.)\n");
-             (yyval.instr) = LDSTII (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), (yyvsp[(7) - (9)].expr), 0, 1 << (yyvsp[(9) - (9)].r0).r0);
+             notethat ("LDSTii: dregs = W [ pregs + uimm5m2 ] (.)\n");
+             (yyval.instr) = LDSTII (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), tmp, 0, 1 << (yyvsp[(9) - (9)].r0).r0);
            }
-         else if (IS_DREG ((yyvsp[(1) - (9)].reg)) && IS_PREG ((yyvsp[(5) - (9)].reg)) && IS_RANGE(16, (yyvsp[(7) - (9)].expr), (yyvsp[(6) - (9)].r0).r0, 2))
+         else if (in_range_p (tmp, -65536, 65535, 1))
            {
              notethat ("LDSTidxI: dregs = W [ pregs + imm17m2 ] (.)\n");
-             if ((yyvsp[(6) - (9)].r0).r0)
-               neg_value ((yyvsp[(7) - (9)].expr));
-             (yyval.instr) = LDSTIDXI (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), 0, 1, (yyvsp[(9) - (9)].r0).r0, (yyvsp[(7) - (9)].expr));
+             (yyval.instr) = LDSTIDXI (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), 0, 1, (yyvsp[(9) - (9)].r0).r0, tmp);
            }
          else
-           return yyerror ("Bad register or constant for LOAD");
+           return yyerror ("Displacement out of range");
        }
     break;
 
-  case 188:
-#line 3012 "bfin-parse.y"
+  case 187:
+#line 3118 "bfin-parse.y"
     {
+         if (!IS_DREG ((yyvsp[(1) - (7)].reg)))
+           return yyerror ("Dreg expected for source operand");
+         if ((yyvsp[(6) - (7)].modcodes).x0 == 2)
+           {
+             if (!IS_IREG ((yyvsp[(5) - (7)].reg)) && !IS_PREG ((yyvsp[(5) - (7)].reg)))
+               return yyerror ("Ireg or Preg expected in address");
+           }
+         else if (!IS_IREG ((yyvsp[(5) - (7)].reg)))
+           return yyerror ("Ireg expected in address");
+
          if (IS_IREG ((yyvsp[(5) - (7)].reg)))
            {
-             notethat ("dspLDST: dregs_half = W [ iregs ]\n");
+             notethat ("dspLDST: dregs_half = W [ iregs <post_op> ]\n");
              (yyval.instr) = DSPLDST(&(yyvsp[(5) - (7)].reg), 1 + IS_H ((yyvsp[(1) - (7)].reg)), &(yyvsp[(1) - (7)].reg), (yyvsp[(6) - (7)].modcodes).x0, 0);
            }
-         else if ((yyvsp[(6) - (7)].modcodes).x0 == 2 && IS_DREG ((yyvsp[(1) - (7)].reg)) && IS_PREG ((yyvsp[(5) - (7)].reg)))
+         else
            {
-             notethat ("LDSTpmod: dregs_half = W [ pregs ]\n");
+             notethat ("LDSTpmod: dregs_half = W [ pregs <post_op> ]\n");
              (yyval.instr) = LDSTPMOD (&(yyvsp[(5) - (7)].reg), &(yyvsp[(1) - (7)].reg), &(yyvsp[(5) - (7)].reg), 1 + IS_H ((yyvsp[(1) - (7)].reg)), 0);
            }
-         else
-           return yyerror ("Bad register or post_op for LOAD");
        }
     break;
 
-  case 189:
-#line 3029 "bfin-parse.y"
+  case 188:
+#line 3143 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (8)].reg)) && IS_PREG ((yyvsp[(5) - (8)].reg)))
-           {
-             notethat ("LDST: dregs = W [ pregs <post_op> ] (.)\n");
-             (yyval.instr) = LDST (&(yyvsp[(5) - (8)].reg), &(yyvsp[(1) - (8)].reg), (yyvsp[(6) - (8)].modcodes).x0, 1, (yyvsp[(8) - (8)].r0).r0, 0);
-           }
-         else
-           return yyerror ("Bad register for LOAD");
+         if (!IS_DREG ((yyvsp[(1) - (8)].reg)))
+           return yyerror ("Dreg expected for destination operand");
+         if (!IS_PREG ((yyvsp[(5) - (8)].reg)))
+           return yyerror ("Preg expected in address");
+
+         notethat ("LDST: dregs = W [ pregs <post_op> ] (.)\n");
+         (yyval.instr) = LDST (&(yyvsp[(5) - (8)].reg), &(yyvsp[(1) - (8)].reg), (yyvsp[(6) - (8)].modcodes).x0, 1, (yyvsp[(8) - (8)].r0).r0, 0);
        }
     break;
 
-  case 190:
-#line 3040 "bfin-parse.y"
+  case 189:
+#line 3154 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (9)].reg)) && IS_PREG ((yyvsp[(5) - (9)].reg)) && IS_PREG ((yyvsp[(7) - (9)].reg)))
-           {
-             notethat ("LDSTpmod: dregs = W [ pregs ++ pregs ] (.)\n");
-             (yyval.instr) = LDSTPMOD (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), &(yyvsp[(7) - (9)].reg), 3, (yyvsp[(9) - (9)].r0).r0);
-           }
-         else
-           return yyerror ("Bad register for LOAD");
+         if (!IS_DREG ((yyvsp[(1) - (9)].reg)))
+           return yyerror ("Dreg expected for destination operand");
+         if (!IS_PREG ((yyvsp[(5) - (9)].reg)) || !IS_PREG ((yyvsp[(7) - (9)].reg)))
+           return yyerror ("Preg expected in address");
+
+         notethat ("LDSTpmod: dregs = W [ pregs ++ pregs ] (.)\n");
+         (yyval.instr) = LDSTPMOD (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), &(yyvsp[(7) - (9)].reg), 3, (yyvsp[(9) - (9)].r0).r0);
        }
     break;
 
-  case 191:
-#line 3051 "bfin-parse.y"
+  case 190:
+#line 3165 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (8)].reg)) && IS_PREG ((yyvsp[(5) - (8)].reg)) && IS_PREG ((yyvsp[(7) - (8)].reg)))
-           {
-             notethat ("LDSTpmod: dregs_half = W [ pregs ++ pregs ]\n");
-             (yyval.instr) = LDSTPMOD (&(yyvsp[(5) - (8)].reg), &(yyvsp[(1) - (8)].reg), &(yyvsp[(7) - (8)].reg), 1 + IS_H ((yyvsp[(1) - (8)].reg)), 0);
-           }
-         else
-           return yyerror ("Bad register for LOAD");
+         if (!IS_DREG ((yyvsp[(1) - (8)].reg)))
+           return yyerror ("Dreg expected for destination operand");
+         if (!IS_PREG ((yyvsp[(5) - (8)].reg)) || !IS_PREG ((yyvsp[(7) - (8)].reg)))
+           return yyerror ("Preg expected in address");
+
+         notethat ("LDSTpmod: dregs_half = W [ pregs ++ pregs ]\n");
+         (yyval.instr) = LDSTPMOD (&(yyvsp[(5) - (8)].reg), &(yyvsp[(1) - (8)].reg), &(yyvsp[(7) - (8)].reg), 1 + IS_H ((yyvsp[(1) - (8)].reg)), 0);
        }
     break;
 
-  case 192:
-#line 3062 "bfin-parse.y"
+  case 191:
+#line 3176 "bfin-parse.y"
     {
-         if (IS_IREG ((yyvsp[(2) - (6)].reg)) && IS_DREG ((yyvsp[(6) - (6)].reg)))
+         if (!IS_IREG ((yyvsp[(2) - (6)].reg)) && !IS_PREG ((yyvsp[(2) - (6)].reg)))
+           return yyerror ("Ireg or Preg expected in address");
+         else if (IS_IREG ((yyvsp[(2) - (6)].reg)) && !IS_DREG ((yyvsp[(6) - (6)].reg)))
+           return yyerror ("Dreg expected for source operand");
+         else if (IS_PREG ((yyvsp[(2) - (6)].reg)) && !IS_DREG ((yyvsp[(6) - (6)].reg)) && !IS_PREG ((yyvsp[(6) - (6)].reg)))
+           return yyerror ("Dreg or Preg expected for source operand");
+
+         if (IS_IREG ((yyvsp[(2) - (6)].reg)))
            {
              notethat ("dspLDST: [ iregs <post_op> ] = dregs\n");
              (yyval.instr) = DSPLDST(&(yyvsp[(2) - (6)].reg), 0, &(yyvsp[(6) - (6)].reg), (yyvsp[(3) - (6)].modcodes).x0, 1);
            }
-         else if (IS_PREG ((yyvsp[(2) - (6)].reg)) && IS_DREG ((yyvsp[(6) - (6)].reg)))
+         else if (IS_DREG ((yyvsp[(6) - (6)].reg)))
            {
              notethat ("LDST: [ pregs <post_op> ] = dregs\n");
              (yyval.instr) = LDST (&(yyvsp[(2) - (6)].reg), &(yyvsp[(6) - (6)].reg), (yyvsp[(3) - (6)].modcodes).x0, 0, 0, 1);
            }
-         else if (IS_PREG ((yyvsp[(2) - (6)].reg)) && IS_PREG ((yyvsp[(6) - (6)].reg)))
+         else
            {
              notethat ("LDST: [ pregs <post_op> ] = pregs\n");
              (yyval.instr) = LDST (&(yyvsp[(2) - (6)].reg), &(yyvsp[(6) - (6)].reg), (yyvsp[(3) - (6)].modcodes).x0, 0, 1, 1);
            }
-         else
-           return yyerror ("Bad register for STORE");
        }
     break;
 
-  case 193:
-#line 3083 "bfin-parse.y"
+  case 192:
+#line 3202 "bfin-parse.y"
     {
-         if (! IS_DREG ((yyvsp[(7) - (7)].reg)))
-           return yyerror ("Expected Dreg for last argument");
+         if (!IS_DREG ((yyvsp[(7) - (7)].reg)))
+           return yyerror ("Dreg expected for source operand");
 
          if (IS_IREG ((yyvsp[(2) - (7)].reg)) && IS_MREG ((yyvsp[(4) - (7)].reg)))
            {
@@ -5834,93 +5956,113 @@ yyreduce:
              (yyval.instr) = LDSTPMOD (&(yyvsp[(2) - (7)].reg), &(yyvsp[(7) - (7)].reg), &(yyvsp[(4) - (7)].reg), 0, 1);
            }
          else
-           return yyerror ("Bad register for STORE");
+           return yyerror ("Preg ++ Preg or Ireg ++ Mreg expected in address");
        }
     break;
 
-  case 194:
-#line 3102 "bfin-parse.y"
+  case 193:
+#line 3221 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(8) - (8)].reg)))
-           return yyerror ("Expect Dreg as last argument");
+           return yyerror ("Dreg expected for source operand");
+
          if (IS_PREG ((yyvsp[(3) - (8)].reg)) && IS_PREG ((yyvsp[(5) - (8)].reg)))
            {
              notethat ("LDSTpmod: W [ pregs ++ pregs ] = dregs_half\n");
              (yyval.instr) = LDSTPMOD (&(yyvsp[(3) - (8)].reg), &(yyvsp[(8) - (8)].reg), &(yyvsp[(5) - (8)].reg), 1 + IS_H ((yyvsp[(8) - (8)].reg)), 1);
            }
          else
-           return yyerror ("Bad register for STORE");
+           return yyerror ("Preg ++ Preg expected in address");
        }
     break;
 
-  case 195:
-#line 3115 "bfin-parse.y"
+  case 194:
+#line 3235 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (9)].reg)) && IS_PREG ((yyvsp[(5) - (9)].reg)) && IS_RANGE(16, (yyvsp[(7) - (9)].expr), (yyvsp[(6) - (9)].r0).r0, 1))
+         Expr_Node *tmp = (yyvsp[(7) - (9)].expr);
+         if (!IS_DREG ((yyvsp[(1) - (9)].reg)))
+           return yyerror ("Dreg expected for destination operand");
+         if (!IS_PREG ((yyvsp[(5) - (9)].reg)))
+           return yyerror ("Preg expected in address");
+
+         if ((yyvsp[(6) - (9)].r0).r0)
+           tmp = unary (Expr_Op_Type_NEG, tmp);
+
+         if (IS_RELOC ((yyvsp[(7) - (9)].expr)))
+           return yyerror ("Plain symbol used as offset");
+
+         if (in_range_p (tmp, -32768, 32767, 0))
            {
              notethat ("LDSTidxI: dregs = B [ pregs + imm16 ] (%c)\n",
                       (yyvsp[(9) - (9)].r0).r0 ? 'X' : 'Z');
-             if ((yyvsp[(6) - (9)].r0).r0)
-               neg_value ((yyvsp[(7) - (9)].expr));
-             (yyval.instr) = LDSTIDXI (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), 0, 2, (yyvsp[(9) - (9)].r0).r0, (yyvsp[(7) - (9)].expr));
+             (yyval.instr) = LDSTIDXI (&(yyvsp[(5) - (9)].reg), &(yyvsp[(1) - (9)].reg), 0, 2, (yyvsp[(9) - (9)].r0).r0, tmp);
            }
          else
-           return yyerror ("Bad register or value for LOAD");
+           return yyerror ("Displacement out of range");
        }
     break;
 
-  case 196:
-#line 3129 "bfin-parse.y"
+  case 195:
+#line 3259 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (8)].reg)) && IS_PREG ((yyvsp[(5) - (8)].reg)))
-           {
-             notethat ("LDST: dregs = B [ pregs <post_op> ] (%c)\n",
-                      (yyvsp[(8) - (8)].r0).r0 ? 'X' : 'Z');
-             (yyval.instr) = LDST (&(yyvsp[(5) - (8)].reg), &(yyvsp[(1) - (8)].reg), (yyvsp[(6) - (8)].modcodes).x0, 2, (yyvsp[(8) - (8)].r0).r0, 0);
-           }
-         else
-           return yyerror ("Bad register for LOAD");
+         if (!IS_DREG ((yyvsp[(1) - (8)].reg)))
+           return yyerror ("Dreg expected for destination operand");
+         if (!IS_PREG ((yyvsp[(5) - (8)].reg)))
+           return yyerror ("Preg expected in address");
+
+         notethat ("LDST: dregs = B [ pregs <post_op> ] (%c)\n",
+                   (yyvsp[(8) - (8)].r0).r0 ? 'X' : 'Z');
+         (yyval.instr) = LDST (&(yyvsp[(5) - (8)].reg), &(yyvsp[(1) - (8)].reg), (yyvsp[(6) - (8)].modcodes).x0, 2, (yyvsp[(8) - (8)].r0).r0, 0);
        }
     break;
 
-  case 197:
-#line 3141 "bfin-parse.y"
+  case 196:
+#line 3271 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (7)].reg)) && IS_IREG ((yyvsp[(4) - (7)].reg)) && IS_MREG ((yyvsp[(6) - (7)].reg)))
+         if (!IS_DREG ((yyvsp[(1) - (7)].reg)))
+           return yyerror ("Dreg expected for destination operand");
+
+         if (IS_IREG ((yyvsp[(4) - (7)].reg)) && IS_MREG ((yyvsp[(6) - (7)].reg)))
            {
              notethat ("dspLDST: dregs = [ iregs ++ mregs ]\n");
              (yyval.instr) = DSPLDST(&(yyvsp[(4) - (7)].reg), (yyvsp[(6) - (7)].reg).regno & CODE_MASK, &(yyvsp[(1) - (7)].reg), 3, 0);
            }
-         else if (IS_DREG ((yyvsp[(1) - (7)].reg)) && IS_PREG ((yyvsp[(4) - (7)].reg)) && IS_PREG ((yyvsp[(6) - (7)].reg)))
+         else if (IS_PREG ((yyvsp[(4) - (7)].reg)) && IS_PREG ((yyvsp[(6) - (7)].reg)))
            {
              notethat ("LDSTpmod: dregs = [ pregs ++ pregs ]\n");
              (yyval.instr) = LDSTPMOD (&(yyvsp[(4) - (7)].reg), &(yyvsp[(1) - (7)].reg), &(yyvsp[(6) - (7)].reg), 0, 0);
            }
          else
-           return yyerror ("Bad register for LOAD");
+           return yyerror ("Preg ++ Preg or Ireg ++ Mreg expected in address");
        }
     break;
 
-  case 198:
-#line 3157 "bfin-parse.y"
+  case 197:
+#line 3290 "bfin-parse.y"
     {
          Expr_Node *tmp = (yyvsp[(6) - (7)].expr);
          int ispreg = IS_PREG ((yyvsp[(1) - (7)].reg));
          int isgot = IS_RELOC((yyvsp[(6) - (7)].expr));
 
          if (!IS_PREG ((yyvsp[(4) - (7)].reg)))
-           return yyerror ("Preg expected for indirect");
+           return yyerror ("Preg expected in address");
 
          if (!IS_DREG ((yyvsp[(1) - (7)].reg)) && !ispreg)
-           return yyerror ("Bad destination register for LOAD");
+           return yyerror ("Dreg or Preg expected for destination operand");
+
+         if (tmp->type == Expr_Node_Reloc
+             && strcmp (tmp->value.s_value,
+                        "_current_shared_library_p5_offset_") != 0)
+           return yyerror ("Plain symbol used as offset");
 
          if ((yyvsp[(5) - (7)].r0).r0)
            tmp = unary (Expr_Op_Type_NEG, tmp);
 
-         if(isgot){
+         if (isgot)
+           {
              notethat ("LDSTidxI: dpregs = [ pregs + sym@got ]\n");
-             (yyval.instr) = LDSTIDXI (&(yyvsp[(4) - (7)].reg), &(yyvsp[(1) - (7)].reg), 0, 0, ispreg ? 1: 0, tmp);
-         }
+             (yyval.instr) = LDSTIDXI (&(yyvsp[(4) - (7)].reg), &(yyvsp[(1) - (7)].reg), 0, 0, ispreg ? 1 : 0, tmp);
+           }
          else if (in_range_p (tmp, 0, 63, 3))
            {
              notethat ("LDSTii: dpregs = [ pregs + uimm7m4 ]\n");
@@ -5935,28 +6077,36 @@ yyreduce:
          else if (in_range_p (tmp, -131072, 131071, 3))
            {
              notethat ("LDSTidxI: dpregs = [ pregs + imm18m4 ]\n");
-             (yyval.instr) = LDSTIDXI (&(yyvsp[(4) - (7)].reg), &(yyvsp[(1) - (7)].reg), 0, 0, ispreg ? 1: 0, tmp);
+             (yyval.instr) = LDSTIDXI (&(yyvsp[(4) - (7)].reg), &(yyvsp[(1) - (7)].reg), 0, 0, ispreg ? 1 : 0, tmp);
              
            }
          else
-           return yyerror ("Displacement out of range for load");
+           return yyerror ("Displacement out of range");
        }
     break;
 
-  case 199:
-#line 3197 "bfin-parse.y"
+  case 198:
+#line 3336 "bfin-parse.y"
     {
-         if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_IREG ((yyvsp[(4) - (6)].reg)))
+         if (!IS_IREG ((yyvsp[(4) - (6)].reg)) && !IS_PREG ((yyvsp[(4) - (6)].reg)))
+           return yyerror ("Ireg or Preg expected in address");
+         else if (IS_IREG ((yyvsp[(4) - (6)].reg)) && !IS_DREG ((yyvsp[(1) - (6)].reg)))
+           return yyerror ("Dreg expected in destination operand");
+         else if (IS_PREG ((yyvsp[(4) - (6)].reg)) && !IS_DREG ((yyvsp[(1) - (6)].reg)) && !IS_PREG ((yyvsp[(1) - (6)].reg))
+                  && ((yyvsp[(4) - (6)].reg).regno != REG_SP || !IS_ALLREG ((yyvsp[(1) - (6)].reg)) || (yyvsp[(5) - (6)].modcodes).x0 != 0))
+           return yyerror ("Dreg or Preg expected in destination operand");
+
+         if (IS_IREG ((yyvsp[(4) - (6)].reg)))
            {
              notethat ("dspLDST: dregs = [ iregs <post_op> ]\n");
              (yyval.instr) = DSPLDST (&(yyvsp[(4) - (6)].reg), 0, &(yyvsp[(1) - (6)].reg), (yyvsp[(5) - (6)].modcodes).x0, 0);
            }
-         else if (IS_DREG ((yyvsp[(1) - (6)].reg)) && IS_PREG ((yyvsp[(4) - (6)].reg)))
+         else if (IS_DREG ((yyvsp[(1) - (6)].reg)))
            {
              notethat ("LDST: dregs = [ pregs <post_op> ]\n");
              (yyval.instr) = LDST (&(yyvsp[(4) - (6)].reg), &(yyvsp[(1) - (6)].reg), (yyvsp[(5) - (6)].modcodes).x0, 0, 0, 0);
            }
-         else if (IS_PREG ((yyvsp[(1) - (6)].reg)) && IS_PREG ((yyvsp[(4) - (6)].reg)))
+         else if (IS_PREG ((yyvsp[(1) - (6)].reg)))
            {
              if (REG_SAME ((yyvsp[(1) - (6)].reg), (yyvsp[(4) - (6)].reg)) && (yyvsp[(5) - (6)].modcodes).x0 != 2)
                return yyerror ("Pregs can't be same");
@@ -5964,18 +6114,16 @@ yyreduce:
              notethat ("LDST: pregs = [ pregs <post_op> ]\n");
              (yyval.instr) = LDST (&(yyvsp[(4) - (6)].reg), &(yyvsp[(1) - (6)].reg), (yyvsp[(5) - (6)].modcodes).x0, 0, 1, 0);
            }
-         else if ((yyvsp[(4) - (6)].reg).regno == REG_SP && IS_ALLREG ((yyvsp[(1) - (6)].reg)) && (yyvsp[(5) - (6)].modcodes).x0 == 0)
+         else
            {
              notethat ("PushPopReg: allregs = [ SP ++ ]\n");
              (yyval.instr) = PUSHPOPREG (&(yyvsp[(1) - (6)].reg), 0);
            }
-         else
-           return yyerror ("Bad register or value");
        }
     break;
 
-  case 200:
-#line 3228 "bfin-parse.y"
+  case 199:
+#line 3373 "bfin-parse.y"
     {
          if ((yyvsp[(1) - (11)].reg).regno != REG_SP)
            yyerror ("Stack Pointer expected");
@@ -5992,8 +6140,8 @@ yyreduce:
        }
     break;
 
-  case 201:
-#line 3244 "bfin-parse.y"
+  case 200:
+#line 3389 "bfin-parse.y"
     {
          if ((yyvsp[(1) - (7)].reg).regno != REG_SP)
            yyerror ("Stack Pointer expected");
@@ -6013,8 +6161,8 @@ yyreduce:
        }
     break;
 
-  case 202:
-#line 3263 "bfin-parse.y"
+  case 201:
+#line 3408 "bfin-parse.y"
     {
          if ((yyvsp[(11) - (11)].reg).regno != REG_SP)
            yyerror ("Stack Pointer expected");
@@ -6029,8 +6177,8 @@ yyreduce:
        }
     break;
 
-  case 203:
-#line 3277 "bfin-parse.y"
+  case 202:
+#line 3422 "bfin-parse.y"
     {
          if ((yyvsp[(7) - (7)].reg).regno != REG_SP)
            yyerror ("Stack Pointer expected");
@@ -6050,8 +6198,8 @@ yyreduce:
        }
     break;
 
-  case 204:
-#line 3296 "bfin-parse.y"
+  case 203:
+#line 3441 "bfin-parse.y"
     {
          if ((yyvsp[(1) - (3)].reg).regno != REG_SP)
            yyerror ("Stack Pointer expected");
@@ -6066,8 +6214,8 @@ yyreduce:
        }
     break;
 
-  case 205:
-#line 3312 "bfin-parse.y"
+  case 204:
+#line 3457 "bfin-parse.y"
     {
          if (IS_URANGE (16, (yyvsp[(2) - (2)].expr), 0, 4))
            (yyval.instr) = LINKAGE (0, uimm16s4 ((yyvsp[(2) - (2)].expr)));
@@ -6076,16 +6224,16 @@ yyreduce:
        }
     break;
 
-  case 206:
-#line 3320 "bfin-parse.y"
+  case 205:
+#line 3465 "bfin-parse.y"
     {
                notethat ("linkage: UNLINK\n");
                (yyval.instr) = LINKAGE (1, 0);
        }
     break;
 
-  case 207:
-#line 3329 "bfin-parse.y"
+  case 206:
+#line 3474 "bfin-parse.y"
     {
          if (IS_PCREL4 ((yyvsp[(3) - (7)].expr)) && IS_LPPCREL10 ((yyvsp[(5) - (7)].expr)) && IS_CREG ((yyvsp[(7) - (7)].reg)))
            {
@@ -6098,8 +6246,8 @@ yyreduce:
        }
     break;
 
-  case 208:
-#line 3340 "bfin-parse.y"
+  case 207:
+#line 3485 "bfin-parse.y"
     {
          if (IS_PCREL4 ((yyvsp[(3) - (9)].expr)) && IS_LPPCREL10 ((yyvsp[(5) - (9)].expr))
              && IS_PREG ((yyvsp[(9) - (9)].reg)) && IS_CREG ((yyvsp[(7) - (9)].reg)))
@@ -6112,8 +6260,8 @@ yyreduce:
        }
     break;
 
-  case 209:
-#line 3352 "bfin-parse.y"
+  case 208:
+#line 3497 "bfin-parse.y"
     {
          if (IS_PCREL4 ((yyvsp[(3) - (11)].expr)) && IS_LPPCREL10 ((yyvsp[(5) - (11)].expr))
              && IS_PREG ((yyvsp[(9) - (11)].reg)) && IS_CREG ((yyvsp[(7) - (11)].reg)) 
@@ -6127,8 +6275,8 @@ yyreduce:
        }
     break;
 
-  case 210:
-#line 3366 "bfin-parse.y"
+  case 209:
+#line 3511 "bfin-parse.y"
     {
          if (!IS_RELOC ((yyvsp[(2) - (3)].expr)))
            return yyerror ("Invalid expression in loop statement");
@@ -6138,8 +6286,8 @@ yyreduce:
        }
     break;
 
-  case 211:
-#line 3374 "bfin-parse.y"
+  case 210:
+#line 3519 "bfin-parse.y"
     {
          if (IS_RELOC ((yyvsp[(2) - (5)].expr)) && IS_PREG ((yyvsp[(5) - (5)].reg)) && IS_CREG ((yyvsp[(3) - (5)].reg)))
            {
@@ -6151,8 +6299,8 @@ yyreduce:
        }
     break;
 
-  case 212:
-#line 3384 "bfin-parse.y"
+  case 211:
+#line 3529 "bfin-parse.y"
     {
          if (IS_RELOC ((yyvsp[(2) - (7)].expr)) && IS_PREG ((yyvsp[(5) - (7)].reg)) && IS_CREG ((yyvsp[(3) - (7)].reg)) && EXPR_VALUE ((yyvsp[(7) - (7)].expr)) == 1)
            {
@@ -6164,32 +6312,54 @@ yyreduce:
        }
     break;
 
+  case 212:
+#line 3541 "bfin-parse.y"
+    {
+         if (!IS_RELOC ((yyvsp[(2) - (2)].expr)))
+           return yyerror ("Invalid expression in LOOP_BEGIN statement");
+
+         bfin_loop_beginend ((yyvsp[(2) - (2)].expr), 1);
+         (yyval.instr) = 0;
+       }
+    break;
+
   case 213:
-#line 3396 "bfin-parse.y"
+#line 3551 "bfin-parse.y"
+    {
+         if (!IS_RELOC ((yyvsp[(2) - (2)].expr)))
+           return yyerror ("Invalid expression in LOOP_END statement");
+
+         bfin_loop_beginend ((yyvsp[(2) - (2)].expr), 0);
+         (yyval.instr) = 0;
+       }
+    break;
+
+  case 214:
+#line 3562 "bfin-parse.y"
     {
          notethat ("pseudoDEBUG: DBG\n");
          (yyval.instr) = bfin_gen_pseudodbg (3, 7, 0);
        }
     break;
 
-  case 214:
-#line 3401 "bfin-parse.y"
+  case 215:
+#line 3567 "bfin-parse.y"
     {
          notethat ("pseudoDEBUG: DBG REG_A\n");
          (yyval.instr) = bfin_gen_pseudodbg (3, IS_A1 ((yyvsp[(2) - (2)].reg)), 0);
        }
     break;
 
-  case 215:
-#line 3406 "bfin-parse.y"
+  case 216:
+#line 3572 "bfin-parse.y"
     {
          notethat ("pseudoDEBUG: DBG allregs\n");
          (yyval.instr) = bfin_gen_pseudodbg (0, (yyvsp[(2) - (2)].reg).regno & CODE_MASK, (yyvsp[(2) - (2)].reg).regno & CLASS_MASK);
        }
     break;
 
-  case 216:
-#line 3412 "bfin-parse.y"
+  case 217:
+#line 3578 "bfin-parse.y"
     {
          if (!IS_DREG ((yyvsp[(3) - (4)].reg)))
            return yyerror ("Dregs expected");
@@ -6198,170 +6368,178 @@ yyreduce:
        }
     break;
 
-  case 217:
-#line 3420 "bfin-parse.y"
+  case 218:
+#line 3586 "bfin-parse.y"
     {
          notethat ("psedoDEBUG: DBGHALT\n");
          (yyval.instr) = bfin_gen_pseudodbg (3, 5, 0);
        }
     break;
 
-  case 218:
-#line 3426 "bfin-parse.y"
+  case 219:
+#line 3592 "bfin-parse.y"
     {
-         notethat ("pseudodbg_assert: DBGA (dregs_lo , uimm16 )\n");
+         notethat ("psedoDEBUG: HLT\n");
+         (yyval.instr) = bfin_gen_pseudodbg (3, 4, 0);
+       }
+    break;
+
+  case 220:
+#line 3598 "bfin-parse.y"
+    {
+         notethat ("pseudodbg_assert: DBGA (regs_lo/hi , uimm16 )\n");
          (yyval.instr) = bfin_gen_pseudodbg_assert (IS_H ((yyvsp[(3) - (6)].reg)), &(yyvsp[(3) - (6)].reg), uimm16 ((yyvsp[(5) - (6)].expr)));
        }
     break;
 
-  case 219:
-#line 3432 "bfin-parse.y"
+  case 221:
+#line 3604 "bfin-parse.y"
     {
-         notethat ("pseudodbg_assert: DBGAH (dregs , uimm16 )\n");
+         notethat ("pseudodbg_assert: DBGAH (regs , uimm16 )\n");
          (yyval.instr) = bfin_gen_pseudodbg_assert (3, &(yyvsp[(3) - (6)].reg), uimm16 ((yyvsp[(5) - (6)].expr)));
        }
     break;
 
-  case 220:
-#line 3438 "bfin-parse.y"
+  case 222:
+#line 3610 "bfin-parse.y"
     {
-         notethat ("psedodbg_assert: DBGAL (dregs , uimm16 )\n");
+         notethat ("psedodbg_assert: DBGAL (regs , uimm16 )\n");
          (yyval.instr) = bfin_gen_pseudodbg_assert (2, &(yyvsp[(3) - (6)].reg), uimm16 ((yyvsp[(5) - (6)].expr)));
        }
     break;
 
-  case 221:
-#line 3451 "bfin-parse.y"
+  case 223:
+#line 3623 "bfin-parse.y"
     {
        (yyval.reg) = (yyvsp[(1) - (1)].reg);
        }
     break;
 
-  case 222:
-#line 3455 "bfin-parse.y"
+  case 224:
+#line 3627 "bfin-parse.y"
     {
        (yyval.reg) = (yyvsp[(1) - (1)].reg);
        }
     break;
 
-  case 223:
-#line 3464 "bfin-parse.y"
+  case 225:
+#line 3636 "bfin-parse.y"
     {
        (yyval.mod).MM = 0;
        (yyval.mod).mod = 0;
        }
     break;
 
-  case 224:
-#line 3469 "bfin-parse.y"
+  case 226:
+#line 3641 "bfin-parse.y"
     {
        (yyval.mod).MM = 1;
        (yyval.mod).mod = (yyvsp[(4) - (5)].value);
        }
     break;
 
-  case 225:
-#line 3474 "bfin-parse.y"
+  case 227:
+#line 3646 "bfin-parse.y"
     {
        (yyval.mod).MM = 1;
        (yyval.mod).mod = (yyvsp[(2) - (5)].value);
        }
     break;
 
-  case 226:
-#line 3479 "bfin-parse.y"
+  case 228:
+#line 3651 "bfin-parse.y"
     {
        (yyval.mod).MM = 0;
        (yyval.mod).mod = (yyvsp[(2) - (3)].value);
        }
     break;
 
-  case 227:
-#line 3484 "bfin-parse.y"
+  case 229:
+#line 3656 "bfin-parse.y"
     {
        (yyval.mod).MM = 1;
        (yyval.mod).mod = 0;
        }
     break;
 
-  case 228:
-#line 3491 "bfin-parse.y"
+  case 230:
+#line 3663 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 229:
-#line 3495 "bfin-parse.y"
+  case 231:
+#line 3667 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 230:
-#line 3501 "bfin-parse.y"
+  case 232:
+#line 3673 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 0;
        (yyval.modcodes).x0 = 0;
        }
     break;
 
-  case 231:
-#line 3506 "bfin-parse.y"
+  case 233:
+#line 3678 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 1;
        (yyval.modcodes).x0 = 0;
        }
     break;
 
-  case 232:
-#line 3511 "bfin-parse.y"
+  case 234:
+#line 3683 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 0;
        (yyval.modcodes).x0 = 1;
        }
     break;
 
-  case 233:
-#line 3516 "bfin-parse.y"
+  case 235:
+#line 3688 "bfin-parse.y"
     {  
        (yyval.modcodes).s0 = 1;
        (yyval.modcodes).x0 = 1;
        }
     break;
 
-  case 234:
-#line 3524 "bfin-parse.y"
+  case 236:
+#line 3696 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 235:
-#line 3528 "bfin-parse.y"
+  case 237:
+#line 3700 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 236:
-#line 3534 "bfin-parse.y"
+  case 238:
+#line 3706 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 0;
        (yyval.modcodes).x0 = 0;
        }
     break;
 
-  case 237:
-#line 3539 "bfin-parse.y"
+  case 239:
+#line 3711 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = (yyvsp[(2) - (3)].modcodes).s0;
        (yyval.modcodes).x0 = (yyvsp[(2) - (3)].modcodes).x0;
        }
     break;
 
-  case 238:
-#line 3546 "bfin-parse.y"
+  case 240:
+#line 3718 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 0;
        (yyval.modcodes).x0 = 0;
@@ -6369,8 +6547,8 @@ yyreduce:
        }
     break;
 
-  case 239:
-#line 3552 "bfin-parse.y"
+  case 241:
+#line 3724 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 0;
        (yyval.modcodes).x0 = 0;
@@ -6378,8 +6556,8 @@ yyreduce:
        }
     break;
 
-  case 240:
-#line 3558 "bfin-parse.y"
+  case 242:
+#line 3730 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 1;
        (yyval.modcodes).x0 = 0;
@@ -6387,8 +6565,8 @@ yyreduce:
        }
     break;
 
-  case 241:
-#line 3566 "bfin-parse.y"
+  case 243:
+#line 3738 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 0;
        (yyval.modcodes).s0 = 0;
@@ -6396,8 +6574,8 @@ yyreduce:
        }
     break;
 
-  case 242:
-#line 3572 "bfin-parse.y"
+  case 244:
+#line 3744 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 2 + (yyvsp[(2) - (3)].r0).r0;
        (yyval.modcodes).s0 = 0;
@@ -6405,8 +6583,8 @@ yyreduce:
        }
     break;
 
-  case 243:
-#line 3578 "bfin-parse.y"
+  case 245:
+#line 3750 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 0;
        (yyval.modcodes).s0 = (yyvsp[(2) - (3)].modcodes).s0;
@@ -6414,8 +6592,8 @@ yyreduce:
        }
     break;
 
-  case 244:
-#line 3584 "bfin-parse.y"
+  case 246:
+#line 3756 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 2 + (yyvsp[(2) - (5)].r0).r0;
        (yyval.modcodes).s0 = (yyvsp[(4) - (5)].modcodes).s0;
@@ -6423,8 +6601,8 @@ yyreduce:
        }
     break;
 
-  case 245:
-#line 3590 "bfin-parse.y"
+  case 247:
+#line 3762 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 2 + (yyvsp[(4) - (5)].r0).r0;
        (yyval.modcodes).s0 = (yyvsp[(2) - (5)].modcodes).s0;
@@ -6432,50 +6610,50 @@ yyreduce:
        }
     break;
 
-  case 246:
-#line 3598 "bfin-parse.y"
+  case 248:
+#line 3770 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 247:
-#line 3602 "bfin-parse.y"
+  case 249:
+#line 3774 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 248:
-#line 3606 "bfin-parse.y"
+  case 250:
+#line 3778 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 249:
-#line 3612 "bfin-parse.y"
+  case 251:
+#line 3784 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 250:
-#line 3616 "bfin-parse.y"
+  case 252:
+#line 3788 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 251:
-#line 3620 "bfin-parse.y"
+  case 253:
+#line 3792 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 252:
-#line 3626 "bfin-parse.y"
+  case 254:
+#line 3798 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 0;
        (yyval.modcodes).s0 = 0;
@@ -6483,8 +6661,8 @@ yyreduce:
        }
     break;
 
-  case 253:
-#line 3632 "bfin-parse.y"
+  case 255:
+#line 3804 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 0;
        (yyval.modcodes).s0 = 0;
@@ -6492,8 +6670,8 @@ yyreduce:
        }
     break;
 
-  case 254:
-#line 3638 "bfin-parse.y"
+  case 256:
+#line 3810 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 0;
        (yyval.modcodes).s0 = 1;
@@ -6501,8 +6679,8 @@ yyreduce:
        }
     break;
 
-  case 255:
-#line 3644 "bfin-parse.y"
+  case 257:
+#line 3816 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 1;
        (yyval.modcodes).s0 = 0;
@@ -6510,102 +6688,102 @@ yyreduce:
        }
     break;
 
-  case 256:
-#line 3650 "bfin-parse.y"
+  case 258:
+#line 3822 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 1;
        (yyval.modcodes).s0 = 1;
        }
     break;
 
-  case 257:
-#line 3655 "bfin-parse.y"
+  case 259:
+#line 3827 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 1;
        (yyval.modcodes).s0 = 1;
        }
     break;
 
-  case 258:
-#line 3662 "bfin-parse.y"
+  case 260:
+#line 3834 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 259:
-#line 3666 "bfin-parse.y"
+  case 261:
+#line 3838 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 260:
-#line 3672 "bfin-parse.y"
+  case 262:
+#line 3844 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 0;
        }
     break;
 
-  case 261:
-#line 3676 "bfin-parse.y"
+  case 263:
+#line 3848 "bfin-parse.y"
     {
        (yyval.modcodes).s0 = 1;
        }
     break;
 
-  case 262:
-#line 3683 "bfin-parse.y"
+  case 264:
+#line 3855 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 263:
-#line 3687 "bfin-parse.y"
+  case 265:
+#line 3859 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 264:
-#line 3691 "bfin-parse.y"
+  case 266:
+#line 3863 "bfin-parse.y"
     {
        (yyval.r0).r0 = 3;
        }
     break;
 
-  case 265:
-#line 3695 "bfin-parse.y"
+  case 267:
+#line 3867 "bfin-parse.y"
     {
        (yyval.r0).r0 = 2;
        }
     break;
 
-  case 266:
-#line 3701 "bfin-parse.y"
+  case 268:
+#line 3873 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 267:
-#line 3705 "bfin-parse.y"
+  case 269:
+#line 3877 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 268:
-#line 3712 "bfin-parse.y"
+  case 270:
+#line 3884 "bfin-parse.y"
     {
        (yyval.modcodes).r0 = 0;
        (yyval.modcodes).s0 = 1;
        }
     break;
 
-  case 269:
-#line 3717 "bfin-parse.y"
+  case 271:
+#line 3889 "bfin-parse.y"
     {
        if ((yyvsp[(2) - (3)].value) != M_T)
          return yyerror ("Bad modifier");
@@ -6614,8 +6792,8 @@ yyreduce:
        }
     break;
 
-  case 270:
-#line 3724 "bfin-parse.y"
+  case 272:
+#line 3896 "bfin-parse.y"
     {
        if ((yyvsp[(2) - (5)].value) != M_T)
          return yyerror ("Bad modifier");
@@ -6624,8 +6802,8 @@ yyreduce:
        }
     break;
 
-  case 271:
-#line 3731 "bfin-parse.y"
+  case 273:
+#line 3903 "bfin-parse.y"
     {
        if ((yyvsp[(4) - (5)].value) != M_T)
          return yyerror ("Bad modifier");
@@ -6634,36 +6812,36 @@ yyreduce:
        }
     break;
 
-  case 272:
-#line 3743 "bfin-parse.y"
+  case 274:
+#line 3915 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 273:
-#line 3747 "bfin-parse.y"
+  case 275:
+#line 3919 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 274:
-#line 3751 "bfin-parse.y"
+  case 276:
+#line 3923 "bfin-parse.y"
     {
        (yyval.r0).r0 = 2;
        }
     break;
 
-  case 275:
-#line 3757 "bfin-parse.y"
+  case 277:
+#line 3929 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 276:
-#line 3761 "bfin-parse.y"
+  case 278:
+#line 3933 "bfin-parse.y"
     {
          if ((yyvsp[(2) - (3)].value) == M_W32)
            (yyval.r0).r0 = 1;
@@ -6672,15 +6850,15 @@ yyreduce:
        }
     break;
 
-  case 277:
-#line 3770 "bfin-parse.y"
+  case 279:
+#line 3942 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 278:
-#line 3774 "bfin-parse.y"
+  case 280:
+#line 3946 "bfin-parse.y"
     {
          if ((yyvsp[(2) - (3)].value) == M_IU)
            (yyval.r0).r0 = 3;
@@ -6689,78 +6867,78 @@ yyreduce:
        }
     break;
 
-  case 279:
-#line 3783 "bfin-parse.y"
+  case 281:
+#line 3955 "bfin-parse.y"
     {
        (yyval.reg) = (yyvsp[(3) - (4)].reg);
        }
     break;
 
-  case 280:
-#line 3789 "bfin-parse.y"
+  case 282:
+#line 3961 "bfin-parse.y"
     {
        (yyval.reg) = (yyvsp[(2) - (4)].reg);
        }
     break;
 
-  case 281:
-#line 3798 "bfin-parse.y"
+  case 283:
+#line 3970 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 282:
-#line 3802 "bfin-parse.y"
+  case 284:
+#line 3974 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 283:
-#line 3809 "bfin-parse.y"
+  case 285:
+#line 3981 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 284:
-#line 3813 "bfin-parse.y"
+  case 286:
+#line 3985 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 285:
-#line 3817 "bfin-parse.y"
+  case 287:
+#line 3989 "bfin-parse.y"
     {
        (yyval.r0).r0 = 2;
        }
     break;
 
-  case 286:
-#line 3821 "bfin-parse.y"
+  case 288:
+#line 3993 "bfin-parse.y"
     {
        (yyval.r0).r0 = 3;
        }
     break;
 
-  case 287:
-#line 3828 "bfin-parse.y"
+  case 289:
+#line 4000 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 288:
-#line 3832 "bfin-parse.y"
+  case 290:
+#line 4004 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 289:
-#line 3839 "bfin-parse.y"
+  case 291:
+#line 4011 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 1;      /* HL.  */
          (yyval.modcodes).s0 = 0;      /* s.  */
@@ -6769,8 +6947,8 @@ yyreduce:
        }
     break;
 
-  case 290:
-#line 3847 "bfin-parse.y"
+  case 292:
+#line 4019 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 1;      /* HL.  */
          (yyval.modcodes).s0 = 0;      /* s.  */
@@ -6779,8 +6957,8 @@ yyreduce:
        }
     break;
 
-  case 291:
-#line 3855 "bfin-parse.y"
+  case 293:
+#line 4027 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 0;      /* HL.  */
          (yyval.modcodes).s0 = 0;      /* s.  */
@@ -6789,8 +6967,8 @@ yyreduce:
        }
     break;
 
-  case 292:
-#line 3863 "bfin-parse.y"
+  case 294:
+#line 4035 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 0;      /* HL.  */
          (yyval.modcodes).s0 = 0;      /* s.  */
@@ -6799,8 +6977,8 @@ yyreduce:
        }
     break;
 
-  case 293:
-#line 3871 "bfin-parse.y"
+  case 295:
+#line 4043 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 1;      /* HL.  */
          (yyval.modcodes).s0 = 1;      /* s.  */
@@ -6809,8 +6987,8 @@ yyreduce:
        }
     break;
 
-  case 294:
-#line 3878 "bfin-parse.y"
+  case 296:
+#line 4050 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 1;      /* HL.  */
          (yyval.modcodes).s0 = 1;      /* s.  */
@@ -6819,8 +6997,8 @@ yyreduce:
        }
     break;
 
-  case 295:
-#line 3885 "bfin-parse.y"
+  case 297:
+#line 4057 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 0;      /* HL.  */
          (yyval.modcodes).s0 = 1;      /* s.  */
@@ -6829,8 +7007,8 @@ yyreduce:
        }
     break;
 
-  case 296:
-#line 3893 "bfin-parse.y"
+  case 298:
+#line 4065 "bfin-parse.y"
     {
          (yyval.modcodes).r0 = 0;      /* HL.  */
          (yyval.modcodes).s0 = 1;      /* s.  */
@@ -6839,83 +7017,88 @@ yyreduce:
        }
     break;
 
-  case 297:
-#line 3903 "bfin-parse.y"
+  case 299:
+#line 4075 "bfin-parse.y"
     {
          (yyval.modcodes).s0 = 0;      /* s.  */
          (yyval.modcodes).x0 = 0;      /* HL.  */
        }
     break;
 
-  case 298:
-#line 3908 "bfin-parse.y"
+  case 300:
+#line 4080 "bfin-parse.y"
     {
          (yyval.modcodes).s0 = 0;      /* s.  */
          (yyval.modcodes).x0 = 1;      /* HL.  */
        }
     break;
 
-  case 299:
-#line 3913 "bfin-parse.y"
+  case 301:
+#line 4085 "bfin-parse.y"
     {
          (yyval.modcodes).s0 = 1;      /* s.  */
          (yyval.modcodes).x0 = 0;      /* HL.  */
        }
     break;
 
-  case 300:
-#line 3918 "bfin-parse.y"
+  case 302:
+#line 4090 "bfin-parse.y"
     {
          (yyval.modcodes).s0 = 1;      /* s.  */
          (yyval.modcodes).x0 = 1;      /* HL.  */
        }
     break;
 
-  case 301:
-#line 3925 "bfin-parse.y"
+  case 303:
+#line 4097 "bfin-parse.y"
     {
        (yyval.modcodes).x0 = 2;
        }
     break;
 
-  case 302:
-#line 3929 "bfin-parse.y"
+  case 304:
+#line 4101 "bfin-parse.y"
     {
        (yyval.modcodes).x0 = 0;
        }
     break;
 
-  case 303:
-#line 3933 "bfin-parse.y"
+  case 305:
+#line 4105 "bfin-parse.y"
     {
        (yyval.modcodes).x0 = 1;
        }
     break;
 
-  case 304:
-#line 3942 "bfin-parse.y"
+  case 306:
+#line 4114 "bfin-parse.y"
     {
        (yyval.reg) = (yyvsp[(1) - (2)].reg);
        }
     break;
 
-  case 305:
-#line 3949 "bfin-parse.y"
+  case 307:
+#line 4121 "bfin-parse.y"
     {
        (yyval.reg) = (yyvsp[(1) - (2)].reg);
        }
     break;
 
-  case 306:
-#line 3956 "bfin-parse.y"
+  case 308:
+#line 4128 "bfin-parse.y"
     {
        (yyval.reg) = (yyvsp[(1) - (2)].reg);
        }
     break;
 
-  case 307:
-#line 3963 "bfin-parse.y"
+  case 309:
+#line 4135 "bfin-parse.y"
     {
+         if (IS_A1 ((yyvsp[(3) - (3)].reg)) && IS_EVEN ((yyvsp[(1) - (3)].reg)))
+           return yyerror ("Cannot move A1 to even register");
+         else if (!IS_A1 ((yyvsp[(3) - (3)].reg)) && !IS_EVEN ((yyvsp[(1) - (3)].reg)))
+           return yyerror ("Cannot move A0 to odd register");
+
          (yyval.macfunc).w = 1;
           (yyval.macfunc).P = 1;
           (yyval.macfunc).n = IS_A1 ((yyvsp[(3) - (3)].reg));
@@ -6923,16 +7106,11 @@ yyreduce:
           (yyval.macfunc).dst = (yyvsp[(1) - (3)].reg);
          (yyval.macfunc).s0.regno = 0;
           (yyval.macfunc).s1.regno = 0;
-
-         if (IS_A1 ((yyvsp[(3) - (3)].reg)) && IS_EVEN ((yyvsp[(1) - (3)].reg)))
-           return yyerror ("Cannot move A1 to even register");
-         else if (!IS_A1 ((yyvsp[(3) - (3)].reg)) && !IS_EVEN ((yyvsp[(1) - (3)].reg)))
-           return yyerror ("Cannot move A0 to odd register");
        }
     break;
 
-  case 308:
-#line 3978 "bfin-parse.y"
+  case 310:
+#line 4150 "bfin-parse.y"
     {
          (yyval.macfunc) = (yyvsp[(1) - (1)].macfunc);
          (yyval.macfunc).w = 0; (yyval.macfunc).P = 0;
@@ -6940,9 +7118,14 @@ yyreduce:
        }
     break;
 
-  case 309:
-#line 3984 "bfin-parse.y"
+  case 311:
+#line 4156 "bfin-parse.y"
     {
+         if ((yyvsp[(4) - (5)].macfunc).n && IS_EVEN ((yyvsp[(1) - (5)].reg)))
+           return yyerror ("Cannot move A1 to even register");
+         else if (!(yyvsp[(4) - (5)].macfunc).n && !IS_EVEN ((yyvsp[(1) - (5)].reg)))
+           return yyerror ("Cannot move A0 to odd register");
+
          (yyval.macfunc) = (yyvsp[(4) - (5)].macfunc);
          (yyval.macfunc).w = 1;
           (yyval.macfunc).P = 1;
@@ -6950,9 +7133,14 @@ yyreduce:
        }
     break;
 
-  case 310:
-#line 3992 "bfin-parse.y"
+  case 312:
+#line 4169 "bfin-parse.y"
     {
+         if ((yyvsp[(4) - (5)].macfunc).n && !IS_H ((yyvsp[(1) - (5)].reg)))
+           return yyerror ("Cannot move A1 to low half of register");
+         else if (!(yyvsp[(4) - (5)].macfunc).n && IS_H ((yyvsp[(1) - (5)].reg)))
+           return yyerror ("Cannot move A0 to high half of register");
+
          (yyval.macfunc) = (yyvsp[(4) - (5)].macfunc);
          (yyval.macfunc).w = 1;
          (yyval.macfunc).P = 0;
@@ -6960,9 +7148,14 @@ yyreduce:
        }
     break;
 
-  case 311:
-#line 4000 "bfin-parse.y"
+  case 313:
+#line 4182 "bfin-parse.y"
     {
+         if (IS_A1 ((yyvsp[(3) - (3)].reg)) && !IS_H ((yyvsp[(1) - (3)].reg)))
+           return yyerror ("Cannot move A1 to low half of register");
+         else if (!IS_A1 ((yyvsp[(3) - (3)].reg)) && IS_H ((yyvsp[(1) - (3)].reg)))
+           return yyerror ("Cannot move A0 to high half of register");
+
          (yyval.macfunc).w = 1;
          (yyval.macfunc).P = 0;
          (yyval.macfunc).n = IS_A1 ((yyvsp[(3) - (3)].reg));
@@ -6970,16 +7163,11 @@ yyreduce:
           (yyval.macfunc).dst = (yyvsp[(1) - (3)].reg);
          (yyval.macfunc).s0.regno = 0;
           (yyval.macfunc).s1.regno = 0;
-
-         if (IS_A1 ((yyvsp[(3) - (3)].reg)) && !IS_H ((yyvsp[(1) - (3)].reg)))
-           return yyerror ("Cannot move A1 to low half of register");
-         else if (!IS_A1 ((yyvsp[(3) - (3)].reg)) && IS_H ((yyvsp[(1) - (3)].reg)))
-           return yyerror ("Cannot move A0 to high half of register");
        }
     break;
 
-  case 312:
-#line 4018 "bfin-parse.y"
+  case 314:
+#line 4200 "bfin-parse.y"
     {
          (yyval.macfunc).n = IS_A1 ((yyvsp[(1) - (2)].reg));
          (yyval.macfunc).op = 0;
@@ -6988,8 +7176,8 @@ yyreduce:
        }
     break;
 
-  case 313:
-#line 4025 "bfin-parse.y"
+  case 315:
+#line 4207 "bfin-parse.y"
     {
          (yyval.macfunc).n = IS_A1 ((yyvsp[(1) - (2)].reg));
          (yyval.macfunc).op = 1;
@@ -6998,8 +7186,8 @@ yyreduce:
        }
     break;
 
-  case 314:
-#line 4032 "bfin-parse.y"
+  case 316:
+#line 4214 "bfin-parse.y"
     {
          (yyval.macfunc).n = IS_A1 ((yyvsp[(1) - (2)].reg));
          (yyval.macfunc).op = 2;
@@ -7008,8 +7196,8 @@ yyreduce:
        }
     break;
 
-  case 315:
-#line 4042 "bfin-parse.y"
+  case 317:
+#line 4224 "bfin-parse.y"
     {
          if (IS_DREG ((yyvsp[(1) - (3)].reg)) && IS_DREG ((yyvsp[(3) - (3)].reg)))
            {
@@ -7021,72 +7209,72 @@ yyreduce:
        }
     break;
 
-  case 316:
-#line 4055 "bfin-parse.y"
+  case 318:
+#line 4237 "bfin-parse.y"
     {
        (yyval.r0).r0 = 0;
        }
     break;
 
-  case 317:
-#line 4059 "bfin-parse.y"
+  case 319:
+#line 4241 "bfin-parse.y"
     {
        (yyval.r0).r0 = 1;
        }
     break;
 
-  case 318:
-#line 4063 "bfin-parse.y"
+  case 320:
+#line 4245 "bfin-parse.y"
     {
        (yyval.r0).r0 = 2;
        }
     break;
 
-  case 319:
-#line 4067 "bfin-parse.y"
+  case 321:
+#line 4249 "bfin-parse.y"
     {
        (yyval.r0).r0 = 3;
        }
     break;
 
-  case 320:
-#line 4074 "bfin-parse.y"
+  case 322:
+#line 4256 "bfin-parse.y"
     {
-       (yyval.modcodes).r0 = (yyvsp[(3) - (3)].reg).regno;
-       (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
-       (yyval.modcodes).s0 = 0;
+         (yyval.modcodes).r0 = (yyvsp[(3) - (3)].reg).regno;
+         (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
+         (yyval.modcodes).s0 = 0;
        }
     break;
 
-  case 321:
-#line 4080 "bfin-parse.y"
+  case 323:
+#line 4262 "bfin-parse.y"
     {
-       (yyval.modcodes).r0 = 0x18;
-       (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
-       (yyval.modcodes).s0 = 0;
+         (yyval.modcodes).r0 = 0x18;
+         (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
+         (yyval.modcodes).s0 = 0;
        }
     break;
 
-  case 322:
-#line 4086 "bfin-parse.y"
+  case 324:
+#line 4268 "bfin-parse.y"
     {
-       (yyval.modcodes).r0 = (yyvsp[(1) - (3)].reg).regno;
-       (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
-       (yyval.modcodes).s0 = 1;
+         (yyval.modcodes).r0 = (yyvsp[(1) - (3)].reg).regno;
+         (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
+         (yyval.modcodes).s0 = 1;
        }
     break;
 
-  case 323:
-#line 4092 "bfin-parse.y"
+  case 325:
+#line 4274 "bfin-parse.y"
     {
-       (yyval.modcodes).r0 = 0x18;
-       (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
-       (yyval.modcodes).s0 = 1;
+         (yyval.modcodes).r0 = 0x18;
+         (yyval.modcodes).x0 = (yyvsp[(2) - (3)].r0).r0;
+         (yyval.modcodes).s0 = 1;
        }
     break;
 
-  case 324:
-#line 4102 "bfin-parse.y"
+  case 326:
+#line 4284 "bfin-parse.y"
     {
        Expr_Node_Value val;
        val.s_value = S_GET_NAME((yyvsp[(1) - (1)].symbol));
@@ -7094,23 +7282,23 @@ yyreduce:
        }
     break;
 
-  case 325:
-#line 4111 "bfin-parse.y"
+  case 327:
+#line 4293 "bfin-parse.y"
     { (yyval.value) = BFD_RELOC_BFIN_GOT; }
     break;
 
-  case 326:
-#line 4113 "bfin-parse.y"
+  case 328:
+#line 4295 "bfin-parse.y"
     { (yyval.value) = BFD_RELOC_BFIN_GOT17M4; }
     break;
 
-  case 327:
-#line 4115 "bfin-parse.y"
+  case 329:
+#line 4297 "bfin-parse.y"
     { (yyval.value) = BFD_RELOC_BFIN_FUNCDESC_GOT17M4; }
     break;
 
-  case 328:
-#line 4119 "bfin-parse.y"
+  case 330:
+#line 4301 "bfin-parse.y"
     {
        Expr_Node_Value val;
        val.i_value = (yyvsp[(3) - (3)].value);
@@ -7118,29 +7306,29 @@ yyreduce:
        }
     break;
 
-  case 329:
-#line 4127 "bfin-parse.y"
+  case 331:
+#line 4309 "bfin-parse.y"
     {
        (yyval.expr) = (yyvsp[(1) - (1)].expr);
        }
     break;
 
-  case 330:
-#line 4131 "bfin-parse.y"
+  case 332:
+#line 4313 "bfin-parse.y"
     {
        (yyval.expr) = (yyvsp[(1) - (1)].expr);
        }
     break;
 
-  case 331:
-#line 4138 "bfin-parse.y"
+  case 333:
+#line 4320 "bfin-parse.y"
     {
        (yyval.expr) = (yyvsp[(1) - (3)].expr);
        }
     break;
 
-  case 332:
-#line 4144 "bfin-parse.y"
+  case 334:
+#line 4326 "bfin-parse.y"
     {
        Expr_Node_Value val;
        val.i_value = (yyvsp[(1) - (1)].value);
@@ -7148,113 +7336,113 @@ yyreduce:
        }
     break;
 
-  case 333:
-#line 4150 "bfin-parse.y"
+  case 335:
+#line 4332 "bfin-parse.y"
     {
        (yyval.expr) = (yyvsp[(1) - (1)].expr);
        }
     break;
 
-  case 334:
-#line 4154 "bfin-parse.y"
+  case 336:
+#line 4336 "bfin-parse.y"
     {
        (yyval.expr) = (yyvsp[(2) - (3)].expr);
        }
     break;
 
-  case 335:
-#line 4158 "bfin-parse.y"
+  case 337:
+#line 4340 "bfin-parse.y"
     {
        (yyval.expr) = unary (Expr_Op_Type_COMP, (yyvsp[(2) - (2)].expr));
        }
     break;
 
-  case 336:
-#line 4162 "bfin-parse.y"
+  case 338:
+#line 4344 "bfin-parse.y"
     {
        (yyval.expr) = unary (Expr_Op_Type_NEG, (yyvsp[(2) - (2)].expr));
        }
     break;
 
-  case 337:
-#line 4168 "bfin-parse.y"
+  case 339:
+#line 4350 "bfin-parse.y"
     {
        (yyval.expr) = (yyvsp[(1) - (1)].expr);
        }
     break;
 
-  case 338:
-#line 4174 "bfin-parse.y"
+  case 340:
+#line 4356 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_Mult, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 339:
-#line 4178 "bfin-parse.y"
+  case 341:
+#line 4360 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_Div, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 340:
-#line 4182 "bfin-parse.y"
+  case 342:
+#line 4364 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_Mod, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 341:
-#line 4186 "bfin-parse.y"
+  case 343:
+#line 4368 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_Add, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 342:
-#line 4190 "bfin-parse.y"
+  case 344:
+#line 4372 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_Sub, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 343:
-#line 4194 "bfin-parse.y"
+  case 345:
+#line 4376 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_Lshift, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));  
        }
     break;
 
-  case 344:
-#line 4198 "bfin-parse.y"
+  case 346:
+#line 4380 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_Rshift, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 345:
-#line 4202 "bfin-parse.y"
+  case 347:
+#line 4384 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_BAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 346:
-#line 4206 "bfin-parse.y"
+  case 348:
+#line 4388 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_LOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 347:
-#line 4210 "bfin-parse.y"
+  case 349:
+#line 4392 "bfin-parse.y"
     {
        (yyval.expr) = binary (Expr_Op_Type_BOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr));
        }
     break;
 
-  case 348:
-#line 4214 "bfin-parse.y"
+  case 350:
+#line 4396 "bfin-parse.y"
     {
        (yyval.expr) = (yyvsp[(1) - (1)].expr);
        }
@@ -7262,7 +7450,7 @@ yyreduce:
 
 
 /* Line 1267 of yacc.c.  */
-#line 7266 "bfin-parse.c"
+#line 7454 "bfin-parse.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -7476,7 +7664,7 @@ yyreturn:
 }
 
 
-#line 4220 "bfin-parse.y"
+#line 4402 "bfin-parse.y"
 
 
 EXPR_T
@@ -7491,11 +7679,11 @@ mkexpr (int x, SYMBOL_T s)
 static int
 value_match (Expr_Node *expr, int sz, int sign, int mul, int issigned)
 {
-  long umax = (1L << sz) - 1;
-  long min = -1L << (sz - 1);
-  long max = (1L << (sz - 1)) - 1;
+  int umax = (1 << sz) - 1;
+  int min = -1 << (sz - 1);
+  int max = (1 << (sz - 1)) - 1;
        
-  long v = EXPR_VALUE (expr);
+  int v = (EXPR_VALUE (expr)) & 0xffffffff;
 
   if ((v % mul) != 0)
     {
@@ -7577,7 +7765,7 @@ binary (Expr_Op_Type op, Expr_Node *x, Expr_Node *y)
          break;
 
        default:
-         error ("%s:%d: Internal compiler error\n", __FILE__, __LINE__); 
+         error ("%s:%d: Internal assembler error\n", __FILE__, __LINE__);
        }
       return x;
     }
@@ -7623,7 +7811,7 @@ unary (Expr_Op_Type op, Expr_Node *x)
          x->value.i_value = ~x->value.i_value;
          break;
        default:
-         error ("%s:%d: Internal compiler error\n", __FILE__, __LINE__); 
+         error ("%s:%d: Internal assembler error\n", __FILE__, __LINE__);
        }
       return x;
     }