develooper Front page | perl.cvs.parrot | Postings from December 2008

[svn:parrot] r33498 - trunk/compilers/pirc/new

From:
kjs
Date:
December 4, 2008 16:05
Subject:
[svn:parrot] r33498 - trunk/compilers/pirc/new
Message ID:
20081205000455.8E50DCB9AF@x12.develooper.com
Author: kjs
Date: Thu Dec  4 16:04:54 2008
New Revision: 33498

Modified:
   trunk/compilers/pirc/new/bcgen.c
   trunk/compilers/pirc/new/bcgen.h
   trunk/compilers/pirc/new/pir.y
   trunk/compilers/pirc/new/pircompiler.h
   trunk/compilers/pirc/new/pircompunit.c
   trunk/compilers/pirc/new/pircompunit.h
   trunk/compilers/pirc/new/piremit.c
   trunk/compilers/pirc/new/pirparser.c

Log:
[pirc] Bytecode: Now we're getting somewhere. 
+ fix the parser, couldn't do i = i + 1; fixed now. 
+ offsets are calculated for subs now.
+ lots of TODOs.
+ simple programs, with a single sub should work properly. 
+ string and num args don't work yet.

Modified: trunk/compilers/pirc/new/bcgen.c
==============================================================================
--- trunk/compilers/pirc/new/bcgen.c	(original)
+++ trunk/compilers/pirc/new/bcgen.c	Thu Dec  4 16:04:54 2008
@@ -69,12 +69,12 @@
 Add a PMC constant to the constants list.
 
 */
-bc_const *
+int
 add_pmc_const(bytecode * const bc, PMC * pmc) {
     bc_const *bcc     = new_const(bc);
     bcc->value->type  = PFC_PMC;
     bcc->value->u.key = pmc;
-    return bcc;
+    return bcc->index;
 }
 
 /*
@@ -82,12 +82,12 @@
 Add a String constant to the constants list.
 
 */
-bc_const *
+int
 add_string_const(bytecode * const bc, char const * const str) {
     bc_const *bcc        = new_const(bc);
     bcc->value->type     = PFC_STRING;
     bcc->value->u.string = string_make(bc->interp, str, strlen(str), "ascii", PObj_constant_FLAG);
-    return bcc;
+    return bcc->index;
 }
 
 /*
@@ -95,12 +95,14 @@
 Add a number constant to the constants list.
 
 */
-bc_const *
-add_num_const(bytecode * const bc, FLOATVAL f) {
+int
+add_num_const(bytecode * const bc, double f) {
+    /* STRING * const str   = string_from_cstring(interp, number_cstring, 0); */
     bc_const *bcc        = new_const(bc);
     bcc->value->type     = PFC_NUMBER;
+    /* bcc->value->u.number = string_to_num(interp, str); */
     bcc->value->u.number = f;
-    return bcc;
+    return bcc->index;
 }
 
 /*
@@ -108,12 +110,29 @@
 Add a key constant to the constants list.
 
 */
-bc_const *
+int
 add_key_const(bytecode * const bc, PMC *key) {
     bc_const *bcc     = new_const(bc);
     bcc->value->type  = PFC_KEY;
     bcc->value->u.key = key;
-    return bcc;
+    return bcc->index;
+}
+
+/*
+
+Get the PackFile_Constant on index C<key>.
+XXX not efficient.
+
+*/
+PackFile_Constant *
+get_const(bytecode * const bc, int key) {
+    bc_const *iter = bc->constants;
+    while (iter) {
+        if (iter->index == key)
+            return iter->value;
+        iter = iter->next;
+    }
+    return NULL;
 }
 
 /*
@@ -200,11 +219,13 @@
 */
 static STRING *
 add_string_const_from_cstring(bytecode * const bc, char const * const str) {
-    bc_const *strconst = add_string_const(bc, str);
-    return strconst->value->u.string;
+    int index = add_string_const(bc, str);
+    return get_const(bc, index)->u.string;
 }
 
 
+
+
 /*
 
 Add a sub PMC to the constant table. This function initializes the sub PMC.
@@ -218,22 +239,22 @@
             int vtable_index,           /* vtable entry index */
             unsigned regs_used[],            /* register usage */
             int startoffset,
-            int endoffset
-            )
+            int endoffset)
 {
     Interp     *interp    = bc->interp;
     PMC        *sub_pmc   = pmc_new(bc->interp, enum_class_Sub);
     Parrot_sub *sub       = PMC_sub(sub_pmc);
-    bc_const   *subconst;
-    bc_const   *subname_const;
+    int   subconst_index;
+    int   subname_index;
 
 
     int i;
 
 
+    PackFile_Constant *subname_const;
 
-    subname_const = add_string_const(bc, subname);
-
+    subname_index = add_string_const(bc, subname);
+    subname_const = get_const(bc, subname_index);
 
     sub->start_offs       = startoffset;
     sub->end_offs         = endoffset;
@@ -245,10 +266,11 @@
     sub->vtable_index     = vtable_index;
     sub->multi_signature  = NULL;
 
+    /* store register usage of this sub. */
     for (i = 0; i < 4; ++i)
         sub->n_regs_used[i] = regs_used[i];
 
-    sub->name = subname_const->value->u.string;
+    sub->name = subname_const->u.string;
 
     /* If there was a :nsentry, add it to the constants table, and set
      * the ns_entry_name attribute to that STRING. Default value is the sub's name.
@@ -256,7 +278,7 @@
     if (nsentry)
         sub->ns_entry_name = add_string_const_from_cstring(bc, nsentry);
     else
-        sub->ns_entry_name = subname_const->value->u.string;
+        sub->ns_entry_name = subname_const->u.string;
 
     /* if there was a :subid, add it to the constants table, and set the subid
      * attribute to that STRING. Default value is the sub's name.
@@ -264,14 +286,14 @@
     if (subid)
         sub->subid = add_string_const_from_cstring(bc, subid);
     else
-        sub->subid = subname_const->value->u.string;
+        sub->subid = subname_const->u.string;
 
 
 
     Parrot_store_sub_in_namespace(bc->interp, sub_pmc);
-    subconst      = add_pmc_const(bc, sub_pmc);
+    subconst_index = add_pmc_const(bc, sub_pmc);
 
-    fprintf(stderr, "subconst index: %d\n", subconst->index);
+    fprintf(stderr, "subconst index: %d\n", subconst_index);
 
     /* doesn't work?? */
 
@@ -287,6 +309,12 @@
 /*
 
 Walk the list of constants and store them in the constants segment of the packfile.
+Instead of updating the constants table one by one, it's neater to add them in one go.
+This prevents memory re-allocations, which are generally not the cheapest operations.
+
+XXX check out if we can count the number of needed constants during the parse; that
+would prevent the linked list thing. OTOH, that makes this API less flexible; client-code
+doesn't want to be so inflexible.
 
 */
 static void

Modified: trunk/compilers/pirc/new/bcgen.h
==============================================================================
--- trunk/compilers/pirc/new/bcgen.h	(original)
+++ trunk/compilers/pirc/new/bcgen.h	Thu Dec  4 16:04:54 2008
@@ -14,9 +14,6 @@
 
 typedef struct bytecode bytecode;
 
-struct bc_const;
-
-
 bytecode *new_bytecode(Interp *interp, char const * const filename, int bytes, int codesize);
 
 /* call this to write the PBC file */
@@ -43,10 +40,10 @@
 void emit_string_arg(bytecode * const bc, int string_const_index);
 */
 
-struct bc_const * add_key_const(bytecode * const bc, PMC *key);
-struct bc_const * add_num_const(bytecode * const bc, FLOATVAL f);
-struct bc_const * add_string_const(bytecode * const bc, char const * const str);
-struct bc_const * add_pmc_const(bytecode * const bc, PMC * pmc) ;
+int add_key_const(bytecode * const bc, PMC *key);
+int add_num_const(bytecode * const bc, double f);
+int add_string_const(bytecode * const bc, char const * const str);
+int add_pmc_const(bytecode * const bc, PMC * pmc) ;
 
 /* for adding constants */
 

Modified: trunk/compilers/pirc/new/pir.y
==============================================================================
--- trunk/compilers/pirc/new/pir.y	(original)
+++ trunk/compilers/pirc/new/pir.y	Thu Dec  4 16:04:54 2008
@@ -1275,12 +1275,15 @@
                           set_instrf(lexer, $3, "%T%E", $1, $4);
                           get_opinfo(yyscanner);
                         }
-                  | target '=' target binop target
+                  | target '=' target binop expression
                         {
                           if (targets_equal($1, $3)) /* $P0 = $P0 + $P1 ==> $P0 += $P1 */
-                              set_instrf(lexer, opnames[$4], "%T%T", $1, $5);
+                              set_instrf(lexer, opnames[$4], "%T%E", $1, $5);
                           else
-                              set_instrf(lexer, opnames[$4], "%T%T%T", $1, $3, $5);
+                              set_instrf(lexer, opnames[$4], "%T%T%E", $1, $3, $5);
+
+                          /* XXX this do_strength_reduction() doesn't work properly yet. */
+                          do_strength_reduction(yyscanner);
 
                           get_opinfo(yyscanner);
                         }

Modified: trunk/compilers/pirc/new/pircompiler.h
==============================================================================
--- trunk/compilers/pirc/new/pircompiler.h	(original)
+++ trunk/compilers/pirc/new/pircompiler.h	Thu Dec  4 16:04:54 2008
@@ -143,7 +143,8 @@
     lsr_allocator            *lsr;
 
     /* bytecode generation */
-    struct bytecode                 *bc;
+    struct bytecode          *bc;
+    unsigned                  codesize;
 
 } lexer_state;
 

Modified: trunk/compilers/pirc/new/pircompunit.c
==============================================================================
--- trunk/compilers/pirc/new/pircompunit.c	(original)
+++ trunk/compilers/pirc/new/pircompunit.c	Thu Dec  4 16:04:54 2008
@@ -56,6 +56,7 @@
 #include "parrot/string_funcs.h"
 #include "parrot/dynext.h"
 
+#include <assert.h>
 
 static unsigned const prime_numbers[] = {113 /* XXX think of more primes */ };
 
@@ -146,7 +147,7 @@
 /*
 
 =item C<void
-set_sub_vtable(lexer_state * const lexer, char *vtablename)>
+set_sub_vtable(lexer_state * const lexer, char const *vtablename)>
 
 Set the :vtable() flag argument to the current subroutine. If C<vtablename>
 is NULL, the name of the current sub is taken to be the vtable method name.
@@ -157,7 +158,7 @@
 
 */
 void
-set_sub_vtable(lexer_state * const lexer, char const *vtablename) {
+set_sub_vtable(lexer_state * const lexer, char const * vtablename) {
     int vtable_index;
 
     if (vtablename == NULL)  /* the sub's name I<is> the vtablename */
@@ -172,10 +173,10 @@
     if (vtable_index == -1)
         yypirerror(lexer->yyscanner, lexer,
                    "'%s' is not a vtable method but was used with :vtable flag", vtablename);
-
-
-    CURRENT_SUB(lexer)->vtable_method = vtablename;
-    SET_FLAG(lexer->subs->flags, SUB_FLAG_VTABLE);
+    else {
+        CURRENT_SUB(lexer)->vtable_index = vtable_index;
+        SET_FLAG(lexer->subs->flags, SUB_FLAG_VTABLE);
+    }
 }
 
 /*
@@ -183,7 +184,7 @@
 =item C<void
 set_sub_subid(lexer_state * const lexer, char * const subid)>
 
-Set the lexical identifier on the current sub.
+Set the name specified in the :subid flag on the sub.
 
 =cut
 
@@ -207,9 +208,9 @@
 */
 void
 set_sub_methodname(lexer_state * const lexer, char const * const methodname) {
-    if (methodname)
+    if (methodname) /* :method("foo") */
         CURRENT_SUB(lexer)->methodname = methodname;
-    else
+    else /* :method without a value defaults to the subname. */
         CURRENT_SUB(lexer)->methodname = CURRENT_SUB(lexer)->sub_name;
 
     SET_FLAG(lexer->subs->flags, SUB_FLAG_METHOD);
@@ -281,21 +282,23 @@
 */
 void
 new_subr(lexer_state * const lexer, char const * const subname) {
-    subroutine *newsub = pir_mem_allocate_zeroed_typed(lexer, subroutine);
+    subroutine *newsub  = pir_mem_allocate_zeroed_typed(lexer, subroutine);
     int index;
 
     /* set the sub fields */
-    newsub->sub_name   = subname;
+    newsub->sub_name    = subname;
 
     /* set default lexid */
-    newsub->subid      = subname;
+    newsub->subid       = subname;
 
     /* take namespace of this sub of the lexer, which keeps track of that */
-    newsub->name_space = lexer->current_ns;
+    newsub->name_space  = lexer->current_ns;
 
-    newsub->parameters = NULL;
-    newsub->statements = NULL;
-    newsub->flags      = 0;
+    newsub->parameters  = NULL;
+    newsub->statements  = NULL;
+    newsub->flags       = 0;
+    newsub->codesize    = 0;
+    newsub->startoffset = lexer->codesize; /* start offset in bytecode */
 
     init_hashtable(lexer, &newsub->symbols, HASHTABLE_SIZE_INIT);
     init_hashtable(lexer, &newsub->labels, HASHTABLE_SIZE_INIT);
@@ -377,7 +380,7 @@
 new_statement(lexer_state * const lexer, char const * const opname) {
     instruction *instr = new_instruction(lexer, opname);
 
-    /* within a subroutine, each instruction has a sequence number to be able to
+    /* Each instruction has a sequence number to be able to
      * calculate offsets for label branches.
      */
     instr->offset = lexer->instr_counter++;
@@ -493,10 +496,8 @@
 target *
 new_target(lexer_state * const lexer) {
     target *t       = pir_mem_allocate_zeroed_typed(lexer, target);
-
     t->key          = NULL;
     t->next         = t; /* circly linked list */
-
     return t;
 }
 
@@ -504,7 +505,11 @@
 =item C<void
 set_target_key(target * const t, key * const k)>
 
-Set the key C<k> on target C<t>.
+Set the key C<k> on target C<t>. For instance:
+
+ $P0[$P1]
+
+[$P1] is the key of $P0.
 
 =cut
 
@@ -543,7 +548,7 @@
 
 Add a new target to the list pointed to by C<list>. C<list> points to
 the last element, C<<last->next>> points to the first. The list is
-circular linked.
+circular linked. The newly added target C<t> is returned.
 
 =cut
 
@@ -604,11 +609,10 @@
      */
     assign_vanilla_register(lexer, sym);
 
+    /* set a pointer from the target to the symbol object */
     targ->s.sym = sym;
 
-
     return targ;
-
 }
 
 /*
@@ -656,10 +660,13 @@
      * Therefore it's safe to reference param->s.sym, without checking for not
      * being a register.
      */
+
+    /* :slurpy can only be set on a PMC parameter */
     if (TEST_FLAG(flag, TARGET_FLAG_SLURPY) && param->s.sym->type != PMC_TYPE)
         yypirerror(lexer->yyscanner, lexer,
                    "cannot set :slurpy flag on non-pmc %s", param->s.sym->name);
 
+    /* :opt_flag can only be set on a int parameter */
     if (TEST_FLAG(flag, TARGET_FLAG_OPT_FLAG) && param->s.sym->type != INT_TYPE)
         yypirerror(lexer->yyscanner, lexer,
                    "cannot set :opt_flag flag on non-int %s", param->s.sym->name);
@@ -1924,6 +1931,9 @@
     new_statement(lexer, opname);
     CURRENT_INSTRUCTION(lexer)->opinfo = &lexer->interp->op_info_table[opcode];
     CURRENT_INSTRUCTION(lexer)->opcode = opcode;
+
+    /* count number of ints needed to store this instruction in bytecode */
+    lexer->codesize += CURRENT_INSTRUCTION(lexer)->opinfo->op_count;
 }
 
 /*
@@ -1939,9 +1949,24 @@
 */
 void
 update_op(NOTNULL(lexer_state * const lexer), NOTNULL(instruction * const instr), int newop) {
+    /* Deduct number of ints needed for the old instruction, if there is one.
+     * This is necessary during strength reduction and other optimizations, once
+     * the opinfo is retrieved, we also update the codesize field in the lexer.
+     */
+    if (instr->opinfo)
+        lexer->codesize -= instr->opinfo->op_count;
+    /*
+    else
+        fprintf(stderr, "instr (%s)had no opinfo yet...\n", instr->opname);
+    */
+
+    /* now get the */
     instr->opinfo = &lexer->interp->op_info_table[newop];
     instr->opname = instr->opinfo->full_name;
     instr->opcode = newop;
+
+    /* add codesize needed for the new instruction. */
+    lexer->codesize += instr->opinfo->op_count;
 }
 
 
@@ -2276,6 +2301,9 @@
 
     /* fix up all local branch labels */
     fixup_local_labels(lexer);
+
+    /* store end offset in bytecode of this subroutine */
+    CURRENT_SUB(lexer)->endoffset = lexer->codesize;
 }
 
 

Modified: trunk/compilers/pirc/new/pircompunit.h
==============================================================================
--- trunk/compilers/pirc/new/pircompunit.h	(original)
+++ trunk/compilers/pirc/new/pircompunit.h	Thu Dec  4 16:04:54 2008
@@ -304,11 +304,16 @@
     char const         *sub_name;      /* this sub's name */
     char const         *outer_sub;     /* this sub's outer subroutine, if any */
     char const         *subid;         /* this sub's subid, if any */
-    char const         *vtable_method; /* name of vtable method that this sub's overriding if any */
+    int                 vtable_index;  /* index of vtable method this sub's overriding, if any */
     char const         *instanceof;    /* XXX document this XXX */
     char const         *nsentry;       /* name by which the sub is stored in the namespace */
     char const         *methodname;    /* name of this sub by which it's stored as a method */
     int                 flags;         /* this sub's flags */
+    unsigned            codesize;      /* total number of integers to store for this sub:
+                                          1 for each op and 1 for each operand.
+                                        */
+    int                 startoffset;   /* start offset in bytecode where this sub starts */
+    int                 endoffset;     /* end offset in bytecode where this sub ends */
 
     /* XXX the whole multi stuff must be implemented */
     char              **multi_types;   /* data types of parameters if this is a multi sub */

Modified: trunk/compilers/pirc/new/piremit.c
==============================================================================
--- trunk/compilers/pirc/new/piremit.c	(original)
+++ trunk/compilers/pirc/new/piremit.c	Thu Dec  4 16:04:54 2008
@@ -3,15 +3,12 @@
  * Copyright (C) 2008, The Perl Foundation.
  */
 
+#include <stdio.h>
 #include "piremit.h"
 #include "pircompunit.h"
 #include "pircompiler.h"
-
-#include <stdio.h>
-
 #include "bcgen.h"
 
-
 /*
 
 =head1 FUNCTIONS
@@ -25,10 +22,6 @@
 */
 
 
-/*
-#define out lexer->outfile
-*/
-
 #define out stdout
 
 /* the order of these letters match with the pir_type enumeration.
@@ -111,6 +104,7 @@
 }
 
 /*
+
 =item C<void
 print_constant(constant *c)>
 
@@ -360,6 +354,65 @@
     }
 }
 
+/*
+
+Emit a constant argument into the bytecode. An integer is emitted
+inline in the bytecode; other types are stored in the constant table,
+and their index in the constant table is emitted into the bytecode.
+
+XXX doesn't work yet for strings and numbers. (pmc prob. neither)
+
+*/
+static void
+emit_pbc_const_arg(lexer_state * const lexer, constant * const c) {
+    switch (c->type) {
+        case INT_TYPE:
+            emit_int_arg(lexer->bc, c->val.ival);
+            break;
+        case NUM_TYPE: {
+            int index = add_num_const(lexer->bc, c->val.nval);
+            emit_int_arg(lexer->bc, index);
+            break;
+        }
+        case STRING_TYPE: {
+            int index = add_string_const(lexer->bc, c->val.sval);
+            fprintf(stderr, "index of string const: %d\n", index);
+            emit_int_arg(lexer->bc, index);
+            break;
+        }
+        case PMC_TYPE:
+        default:
+            break;
+    }
+}
+
+/*
+
+Emit the assigned register of target C<t>. The assigned register is
+stored in the C<color> field, of either the C<pir_reg> or C<symbol>
+structure, depending on whether C<t> is a register or a symbol,
+respectively.
+
+*/
+static void
+emit_pbc_target_arg(lexer_state * const lexer, target * const t) {
+    if (TEST_FLAG(t->flags, TARGET_FLAG_IS_REG))
+        emit_int_arg(lexer->bc, t->s.reg->color);
+    else
+        emit_int_arg(lexer->bc, t->s.sym->color);
+}
+
+/*
+
+XXX TODO: label offsets must be bytecode offsets, so also count arguments.
+
+*/
+static void
+emit_pbc_label_arg(lexer_state * const lexer, label * const l) {
+    emit_int_arg(lexer->bc, l->offset);
+    /* fprintf(stderr, "labeloffset: %d\n", l->offset); */
+}
+
 static void
 emit_pbc_instr(lexer_state * const lexer, instruction * const instr) {
     int i;
@@ -384,13 +437,13 @@
 
                 switch (operand->type) {
                     case EXPR_CONSTANT:
-                        switch (operand->expr.c->type) {
-                            case INT_TYPE:
-                                emit_int_arg(lexer->bc, operand->expr.c->val.ival);
-                                break;
-                            default:
-                                break;
-                        }
+                        emit_pbc_const_arg(lexer, operand->expr.c);
+                        break;
+                    case EXPR_TARGET:
+                        emit_pbc_target_arg(lexer, operand->expr.t);
+                        break;
+                    case EXPR_LABEL:
+                        emit_pbc_label_arg(lexer, operand->expr.l);
                         break;
                     default:
                         break;
@@ -441,8 +494,7 @@
 emit_pbc(lexer_state * const lexer)>
 
 Generate Parrot Byte Code from the abstract syntax tree. This is the top-level
-function; it initializes the data structures (code segment), and then starts
-emitting byte code (by means of helper functions).
+function.
 
 =cut
 
@@ -455,23 +507,25 @@
         return;
 
 
-    /* TEMP HACK */ ++lexer->instr_counter; /* HACK ALERT */
-
-
-    /* XXX fix the numbers here */
     lexer->bc = new_bytecode(lexer->interp, lexer->filename,
-                             lexer->instr_counter * 4, lexer->instr_counter);
-
-    fprintf(stderr, "lexer->instr_counter = %d\n", lexer->instr_counter);
+                             lexer->codesize * 4, lexer->codesize);
 
     subiter = lexer->subs->next;
 
-    /* initialize data structures in which PBC is going to be emitted. */
-
-
     /* iterate over all instructions and emit them */
     do {
-        add_sub_pmc(lexer->bc, subiter->sub_name, NULL, NULL, -1, subiter->regs_used, 0, 3);
+        fprintf(stderr, "%d integers needed for storing this sub\n", subiter->codesize);
+        fprintf(stderr, "start offset of sub '%s' is: %d\tend offest: %d\n",
+                    subiter->sub_name, subiter->startoffset, subiter->endoffset);
+
+        add_sub_pmc(lexer->bc,
+                    subiter->sub_name,
+                    subiter->nsentry,
+                    subiter->subid,
+                    subiter->vtable_index,
+                    subiter->regs_used,
+                    subiter->startoffset,
+                    subiter->endoffset);
 
         emit_pbc_instructions(lexer, subiter);
         subiter = subiter->next;

Modified: trunk/compilers/pirc/new/pirparser.c
==============================================================================
--- trunk/compilers/pirc/new/pirparser.c	(original)
+++ trunk/compilers/pirc/new/pirparser.c	Thu Dec  4 16:04:54 2008
@@ -812,7 +812,7 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  10
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   996
+#define YYLAST   981
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  138
@@ -972,7 +972,7 @@
       -1,   283,    71,    48,    -1,   283,    72,    47,    -1,   283,
       72,    48,    -1,   283,    71,   283,    -1,   283,    72,   283,
       -1,   283,   121,   288,   279,    -1,   283,   121,   283,   289,
-     283,    -1,   287,   208,   121,   279,    -1,    49,   208,   121,
+     279,    -1,   287,   208,   121,   279,    -1,    49,   208,   121,
      279,    -1,    47,   289,   283,    -1,    48,   289,   283,    -1,
       46,   289,   283,    -1,    46,   289,    46,    -1,    47,   289,
       47,    -1,    48,   289,    48,    -1,    47,   289,    48,    -1,
@@ -1056,41 +1056,41 @@
      652,   657,   661,   665,   670,   671,   675,   677,   681,   685,
      691,   695,   699,   700,   703,   704,   707,   709,   711,   713,
      715,   717,   719,   721,   723,   725,   727,   729,   731,   733,
-     737,   738,   739,   742,   762,   763,   767,   771,   776,   777,
-     781,   782,   783,   786,   793,   799,   800,   810,   812,   815,
-     816,   817,   818,   819,   820,   821,   822,   823,   824,   825,
-     826,   827,   828,   829,   835,   838,   843,   844,   849,   850,
-     853,   855,   863,   871,   872,   874,   877,   883,   884,   893,
-     894,   895,   896,   904,   908,   912,   921,   928,   935,   938,
-     939,   942,   951,   958,   961,   962,   965,   966,   969,  1005,
-    1007,  1014,  1016,  1021,  1023,  1027,  1050,  1054,  1056,  1065,
-    1076,  1088,  1098,  1101,  1110,  1119,  1124,  1129,  1150,  1190,
-    1208,  1215,  1220,  1231,  1242,  1253,  1264,  1269,  1274,  1279,
-    1288,  1307,  1341,  1343,  1345,  1347,  1349,  1351,  1353,  1355,
-    1360,  1369,  1371,  1373,  1375,  1377,  1379,  1381,  1383,  1385,
-    1387,  1399,  1404,  1406,  1408,  1410,  1412,  1414,  1416,  1418,
-    1420,  1422,  1424,  1426,  1428,  1459,  1485,  1493,  1502,  1511,
-    1513,  1515,  1517,  1519,  1523,  1528,  1530,  1535,  1536,  1539,
-    1540,  1543,  1544,  1547,  1555,  1559,  1561,  1565,  1569,  1570,
-    1573,  1588,  1592,  1593,  1596,  1609,  1610,  1614,  1616,  1620,
-    1624,  1626,  1628,  1634,  1635,  1640,  1641,  1645,  1647,  1656,
-    1658,  1662,  1666,  1670,  1674,  1680,  1681,  1684,  1712,  1719,
-    1721,  1730,  1747,  1749,  1751,  1755,  1764,  1769,  1774,  1775,
-    1779,  1781,  1785,  1790,  1791,  1795,  1797,  1799,  1801,  1811,
-    1815,  1816,  1817,  1818,  1821,  1826,  1837,  1844,  1849,  1850,
-    1854,  1856,  1860,  1861,  1864,  1868,  1872,  1876,  1885,  1895,
-    1896,  1901,  1903,  1908,  1913,  1914,  1918,  1920,  1924,  1930,
-    1931,  1935,  1937,  1945,  1946,  1950,  1954,  1957,  1958,  1961,
-    1965,  1969,  1971,  1973,  1975,  1983,  1984,  1988,  1989,  1990,
-    1993,  1994,  1995,  1996,  1997,  1998,  2001,  2002,  2003,  2004,
-    2012,  2015,  2016,  2029,  2030,  2031,  2032,  2036,  2037,  2040,
-    2041,  2042,  2043,  2044,  2045,  2046,  2047,  2050,  2051,  2052,
-    2055,  2056,  2057,  2058,  2059,  2060,  2061,  2062,  2063,  2064,
-    2065,  2066,  2067,  2068,  2069,  2070,  2071,  2072,  2073,  2074,
-    2075,  2076,  2077,  2083,  2084,  2085,  2086,  2087,  2088,  2089,
-    2090,  2091,  2092,  2093,  2094,  2106,  2114,  2118,  2119,  2122,
-    2123,  2124,  2125,  2126,  2127,  2130,  2132,  2133,  2136,  2137,
-    2140,  2144,  2149
+     737,   738,   739,   742,   761,   762,   766,   770,   775,   776,
+     780,   781,   782,   785,   792,   798,   799,   809,   811,   814,
+     815,   816,   817,   818,   819,   820,   821,   822,   823,   824,
+     825,   826,   827,   828,   834,   837,   842,   843,   848,   849,
+     852,   854,   862,   870,   871,   873,   876,   882,   883,   892,
+     893,   894,   895,   903,   907,   911,   920,   927,   934,   937,
+     938,   941,   950,   957,   960,   961,   964,   965,   968,  1004,
+    1006,  1013,  1015,  1020,  1022,  1026,  1049,  1053,  1055,  1064,
+    1075,  1087,  1097,  1100,  1109,  1118,  1123,  1128,  1149,  1189,
+    1207,  1214,  1219,  1230,  1241,  1252,  1263,  1268,  1273,  1278,
+    1290,  1309,  1343,  1345,  1347,  1349,  1351,  1353,  1355,  1357,
+    1362,  1371,  1373,  1375,  1377,  1379,  1381,  1383,  1385,  1387,
+    1389,  1401,  1406,  1408,  1410,  1412,  1414,  1416,  1418,  1420,
+    1422,  1424,  1426,  1428,  1430,  1461,  1487,  1495,  1504,  1513,
+    1515,  1517,  1519,  1521,  1525,  1530,  1532,  1537,  1538,  1541,
+    1542,  1545,  1546,  1549,  1557,  1561,  1563,  1567,  1571,  1572,
+    1575,  1590,  1594,  1595,  1598,  1611,  1612,  1616,  1618,  1622,
+    1626,  1628,  1630,  1636,  1637,  1642,  1643,  1647,  1649,  1658,
+    1660,  1664,  1668,  1672,  1676,  1682,  1683,  1686,  1714,  1721,
+    1723,  1732,  1749,  1751,  1753,  1757,  1766,  1771,  1776,  1777,
+    1781,  1783,  1787,  1792,  1793,  1797,  1799,  1801,  1803,  1813,
+    1817,  1818,  1819,  1820,  1823,  1828,  1839,  1846,  1851,  1852,
+    1856,  1858,  1862,  1863,  1866,  1870,  1874,  1878,  1887,  1897,
+    1898,  1903,  1905,  1910,  1915,  1916,  1920,  1922,  1926,  1932,
+    1933,  1937,  1939,  1947,  1948,  1952,  1956,  1959,  1960,  1963,
+    1967,  1971,  1973,  1975,  1977,  1985,  1986,  1990,  1991,  1992,
+    1995,  1996,  1997,  1998,  1999,  2000,  2003,  2004,  2005,  2006,
+    2014,  2017,  2018,  2031,  2032,  2033,  2034,  2038,  2039,  2042,
+    2043,  2044,  2045,  2046,  2047,  2048,  2049,  2052,  2053,  2054,
+    2057,  2058,  2059,  2060,  2061,  2062,  2063,  2064,  2065,  2066,
+    2067,  2068,  2069,  2070,  2071,  2072,  2073,  2074,  2075,  2076,
+    2077,  2078,  2079,  2085,  2086,  2087,  2088,  2089,  2090,  2091,
+    2092,  2093,  2094,  2095,  2096,  2108,  2116,  2120,  2121,  2124,
+    2125,  2126,  2127,  2128,  2129,  2132,  2134,  2135,  2138,  2139,
+    2142,  2146,  2151
 };
 #endif
 
@@ -1382,96 +1382,96 @@
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -578
+#define YYPACT_NINF -569
 static const yytype_int16 yypact[] =
 {
-     -38,     4,     4,    43,  -578,  -578,  -578,    15,  -578,    69,
-    -578,    17,    36,    25,   -33,    73,  -578,   212,    57,    -5,
-    -578,    80,  -578,  -578,    29,    91,   107,  -578,   529,  -578,
-      15,  -578,  -578,    73,  -578,  -578,   103,   119,   122,   603,
-      68,   125,   138,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,    54,  -578,  -578,   134,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,    89,   -44,   146,  -578,   212,  -578,  -578,
-    -578,  -578,  -578,    82,  -578,  -578,  -578,   727,   177,    93,
-    -578,  -578,  -578,  -578,    92,  -578,  -578,    95,  -578,  -578,
-     655,  -578,    97,  -578,  -578,  -578,  -578,   212,   212,   212,
-     212,  -578,    99,    69,  -578,   584,   947,  -578,   100,    96,
-    -578,  -578,    -5,  -578,  -578,  -578,   105,   102,  -578,  -578,
-    -578,   110,   112,  -578,  -578,  -578,    28,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,   529,  -578,  -578,  -578,  -578,  -578,
-    -578,   115,   121,   115,  -578,  -578,  -578,  -578,   115,   115,
-     115,  -578,   169,   116,   124,   126,   139,   184,  -578,  -578,
-    -578,   208,  -578,  -578,   134,  -578,   -14,  -578,   -44,   224,
-     212,  -578,   727,  -578,   216,  -578,  -578,   603,  -578,  -578,
-    -578,  -578,  -578,   217,   215,   219,   131,  -578,  -578,   258,
-    -578,  -578,  -578,    -5,  -578,  -578,  -578,  -578,  -578,    53,
-    -578,  -578,   149,   161,  -578,  -578,  -578,  -578,   260,    94,
-    -578,  -578,    94,   173,   179,    53,  -578,   250,  -578,  -578,
-    -578,  -578,   254,  -578,    94,    68,   172,   172,   256,   272,
-     273,   204,   934,   507,   415,   743,   759,   437,   212,  -578,
-     -78,   437,   288,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,   289,   529,  -578,  -578,   292,  -578,
-     294,   775,  -578,  -578,  -578,  -578,  -578,  -578,  -578,   302,
-    -578,  -578,  -578,   172,   223,   230,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,   317,  -578,  -578,   642,   -85,    92,  -578,
-    -578,  -578,  -578,  -578,   212,   244,  -578,  -578,  -578,  -578,
-    -578,   212,  -578,   791,   319,   321,   337,   338,   328,   325,
-     326,  -578,   327,   333,   242,   255,   249,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,   252,  -578,  -578,   -18,   -18,   -18,
-     -18,   -18,   -18,   -18,   276,   -15,   277,   277,   277,   330,
-     -18,   277,   -18,  -578,  -578,   919,   934,  -578,  -578,  -578,
-    -578,   855,   871,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,   145,   727,   261,   109,  -578,  -578,   -20,  -578,
-     281,   331,   262,   259,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,   727,   360,   337,  -578,   727,   364,   338,  -578,   727,
-      32,   328,  -578,  -578,  -578,  -578,  -578,   727,  -578,   437,
-     -13,   727,  -578,  -578,   212,   212,   212,   212,   212,   212,
-     212,   340,   346,   348,   349,   350,   359,   361,   362,   714,
-     -18,   212,   212,   212,  -578,  -578,  -578,  -578,  -578,  -578,
-     807,   823,   839,   212,   212,   727,   212,  -578,  -578,  -578,
-     172,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,   572,
-     598,   598,   -78,  -578,  -578,  -578,   529,  -578,  -578,   598,
-      92,   727,  -578,   727,  -578,  -578,   115,  -578,  -578,  -578,
-     287,  -578,  -578,  -578,  -578,  -578,   212,  -578,  -578,   727,
-    -578,   791,    46,   373,   374,  -578,   375,   376,  -578,   378,
-     947,   947,   947,   382,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,   212,   212,   212,   212,
-     212,   212,   212,   212,   212,  -578,   212,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,   643,   887,   903,  -578,   298,   299,   437,  -578,  -578,
-    -578,  -578,   303,  -578,  -578,  -578,   115,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,   385,   304,  -578,    24,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,  -578,   529,   529,  -578,  -578,
-     309,  -578,  -578,  -578,   407,   947,  -578,   437,  -578,   396,
-      24,  -578,    93,    93,  -578,   919,  -578,   395,   397,  -578,
-    -578,  -578,  -578
+      37,     4,     4,    50,  -569,  -569,  -569,    15,  -569,    69,
+    -569,    17,    31,    38,   -28,    -1,  -569,   212,    70,   -13,
+    -569,    74,  -569,  -569,    -6,    85,    89,  -569,   529,  -569,
+      15,  -569,  -569,    -1,  -569,  -569,    80,    95,   102,   603,
+     104,   119,   133,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,    51,  -569,  -569,   135,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,    87,   -42,   167,  -569,   212,  -569,  -569,
+    -569,  -569,  -569,    82,  -569,  -569,  -569,   727,   184,   100,
+    -569,  -569,  -569,  -569,   101,  -569,  -569,   106,  -569,  -569,
+     655,  -569,   108,  -569,  -569,  -569,  -569,   212,   212,   212,
+     212,  -569,   110,    69,  -569,   584,   932,  -569,    99,   113,
+    -569,  -569,   -13,  -569,  -569,  -569,   114,   112,  -569,  -569,
+    -569,   120,   121,  -569,  -569,  -569,   -36,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,   529,  -569,  -569,  -569,  -569,  -569,
+    -569,   127,   129,   127,  -569,  -569,  -569,  -569,   127,   127,
+     127,  -569,   213,   141,   142,   143,   144,   214,  -569,  -569,
+    -569,   231,  -569,  -569,   135,  -569,   -15,  -569,   -42,   233,
+     212,  -569,   727,  -569,   234,  -569,  -569,   603,  -569,  -569,
+    -569,  -569,  -569,   236,   237,   235,    68,  -569,  -569,   281,
+    -569,  -569,  -569,   -13,  -569,  -569,  -569,  -569,  -569,    93,
+    -569,  -569,   171,   173,  -569,  -569,  -569,  -569,   260,   139,
+    -569,  -569,   139,   199,   204,    93,  -569,   278,  -569,  -569,
+    -569,  -569,   289,  -569,   139,   104,   209,   209,   296,   297,
+     298,   216,   919,   507,   415,   743,   759,   437,   212,  -569,
+     -51,   437,   300,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,   301,   529,  -569,  -569,   302,  -569,
+     315,   775,  -569,  -569,  -569,  -569,  -569,  -569,  -569,   316,
+    -569,  -569,  -569,   209,   225,   232,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,   319,  -569,  -569,   642,   -74,   101,  -569,
+    -569,  -569,  -569,  -569,   212,   247,  -569,  -569,  -569,  -569,
+    -569,   212,  -569,   791,   322,   323,   339,   340,   330,   327,
+     329,  -569,   333,   334,   250,   254,   255,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,   253,  -569,  -569,   -31,   -31,   -31,
+     -31,   -31,   -31,   -31,   393,   -22,   158,   158,   158,   332,
+     -31,   158,   -31,  -569,  -569,   277,   919,  -569,  -569,  -569,
+    -569,   855,   871,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,   145,   727,   258,   109,  -569,  -569,   -14,  -569,
+     285,   331,   263,   265,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,   727,   360,   339,  -569,   727,   365,   340,  -569,   727,
+      32,   330,  -569,  -569,  -569,  -569,  -569,   727,  -569,   437,
+      61,   727,  -569,  -569,   212,   212,   212,   212,   212,   212,
+     212,   347,   348,   349,   350,   351,   359,   361,   362,   714,
+     -31,   212,   212,   212,  -569,  -569,  -569,  -569,  -569,  -569,
+     807,   823,   839,   212,   212,   727,   212,  -569,  -569,  -569,
+     209,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,   572,
+     598,   598,   -51,  -569,  -569,  -569,   529,  -569,  -569,   598,
+     101,   727,  -569,   727,  -569,  -569,   127,  -569,  -569,  -569,
+     287,  -569,  -569,  -569,  -569,  -569,   212,  -569,  -569,   727,
+    -569,   791,   -57,   373,   374,  -569,   375,   376,  -569,   378,
+     932,   932,   932,   382,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,   212,   212,   212,   212,
+     212,   212,   212,   212,   212,  -569,   212,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,   643,   887,   903,  -569,   299,   304,   727,  -569,  -569,
+    -569,  -569,   303,  -569,  -569,  -569,   127,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,   383,   308,  -569,    18,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,  -569,   529,   529,  -569,  -569,
+     324,  -569,  -569,  -569,   405,   932,  -569,   437,  -569,   395,
+      18,  -569,   100,   100,  -569,   277,  -569,   388,   409,  -569,
+    -569,  -569,  -569
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -578,  -578,  -578,    16,  -578,   318,     8,  -578,  -578,  -578,
-    -578,  -578,   253,  -578,  -578,   209,  -578,  -578,  -578,  -578,
-      -2,  -578,  -578,  -578,    10,  -578,  -578,   263,  -578,  -578,
-    -578,   248,   384,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -578,  -578,  -578,  -578,   197,  -578,  -195,  -108,  -578,
-    -578,   264,  -578,  -578,  -578,  -187,  -578,  -578,  -578,  -578,
-    -578,  -578,  -208,  -578,   178,  -455,  -578,   300,   -21,  -578,
-     -90,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,  -578,
-    -578,  -202,  -578,  -577,  -578,   -40,  -578,  -186,  -578,  -578,
-    -578,  -578,  -578,    47,  -578,  -578,  -578,  -578,  -183,  -578,
-    -578,  -226,  -578,  -578,  -578,  -167,  -114,   210,  -578,  -578,
-    -400,  -578,    60,  -578,  -578,  -578,  -578,  -229,  -578,  -578,
-     -19,  -578,  -275,   -16,  -578,  -578,  -578,  -578,    78,  -578,
-    -578,    98,  -578,  -578,  -148,    40,  -578,  -578,  -184,  -578,
-     275,   -81,   -27,  -194,  -172,  -206,  -578,   -25,   -17,  -205,
-    -578,  -391,  -578,  -578,  -578,  -578,   460,  -578,   458,  -578,
-    -578,    14
+    -569,  -569,  -569,    13,  -569,   335,     8,  -569,  -569,  -569,
+    -569,  -569,   266,  -569,  -569,   220,  -569,  -569,  -569,  -569,
+       0,  -569,  -569,  -569,    10,  -569,  -569,   273,  -569,  -569,
+    -569,   264,   416,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -569,  -569,  -569,  -569,   227,  -569,  -200,   -95,  -569,
+    -569,   293,  -569,  -569,  -569,  -187,  -569,  -569,  -569,  -569,
+    -569,  -569,  -208,  -569,   207,  -443,  -569,   346,     7,  -569,
+     -90,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,  -569,
+    -569,  -203,  -569,  -568,  -569,     5,  -569,  -186,  -569,  -569,
+    -569,  -569,  -569,    92,  -569,  -569,  -569,  -569,  -136,  -569,
+    -569,  -226,  -569,  -569,  -569,  -139,  -114,   256,  -569,  -569,
+    -403,  -569,    88,  -569,  -569,  -569,  -569,  -229,  -569,  -569,
+      19,  -569,  -314,    23,  -569,  -569,  -569,  -569,   122,  -569,
+    -569,   117,  -569,  -569,  -146,   -26,  -569,  -569,  -185,  -569,
+     286,   -82,   -27,  -194,  -175,  -206,  -569,   -25,   -17,  -205,
+    -569,  -359,  -569,  -569,  -569,  -569,   490,  -569,   489,  -569,
+    -569,    33
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -1481,59 +1481,59 @@
 #define YYTABLE_NINF -267
 static const yytype_int16 yytable[] =
 {
-      71,    95,   171,    96,   145,   188,   137,    46,   315,   506,
-     265,    97,   296,   298,   175,   485,   320,    44,     9,    50,
-     628,   202,   106,   257,    11,    12,    13,   412,    14,    61,
-     432,   258,   274,  -265,   294,   265,   234,   296,   298,     4,
-    -266,   322,  -265,    10,    87,   328,   500,    61,   257,  -266,
-     305,    15,    16,   628,   354,   627,   258,   274,   114,   294,
-     134,   501,   311,    54,   502,   351,   122,   123,   124,   572,
-     573,    56,    36,    37,    38,    39,     1,     2,   577,    12,
-      13,   125,    14,    55,   476,   477,    40,   478,   479,    57,
-     163,   164,   165,   166,    73,   221,   203,   204,   205,   172,
-     486,   211,   413,    41,   284,   433,   107,   108,    58,   109,
-      16,    46,   206,    74,   110,    76,   493,    95,    17,    96,
-     496,    44,    18,    50,   499,    19,    78,    97,   284,   284,
-     452,    20,   299,   300,   301,   302,   415,   416,   417,   418,
-     419,   420,    79,   586,   474,   587,   468,    77,   444,   101,
-     446,   181,   182,   441,   442,   455,   458,   445,   222,   223,
-     324,   632,   633,   134,   466,   102,   469,   470,   103,   217,
-     106,   112,    17,   113,   116,   334,    18,    80,    81,    82,
-     117,   130,   244,    63,    64,    65,    66,    67,    68,    69,
-      70,   459,   460,   461,   462,    84,    85,    86,   189,   190,
-     191,   297,   121,   328,  -266,   475,   476,   477,   374,   478,
-     479,   480,   143,   144,    87,   192,   252,  -265,   162,   167,
-     174,   547,   178,   173,   177,   172,   297,   637,   526,   179,
-     197,   323,   180,   184,   534,   538,   542,   193,    95,   187,
-      96,   252,   284,   200,   350,   194,   352,   195,    97,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,   284,   209,
-     196,   232,   212,   215,   214,   216,   219,   233,   230,    11,
+      71,    95,   171,    96,   145,   137,   506,   188,   315,    46,
+     265,    97,   296,   298,   412,     9,   320,    44,   257,    50,
+     202,   485,   106,   432,    11,    12,    13,   175,    14,   628,
+     234,   258,   274,   294,    58,   265,    16,   296,   298,     4,
+     586,   322,   587,   257,  -265,   328,   500,   305,    61,   627,
+      10,    15,    16,  -265,   354,   114,   258,   274,   294,   311,
+     134,   501,   628,    54,   502,   351,    61,  -266,   122,   123,
+     124,    87,    36,    37,    38,    39,  -266,   493,    55,    12,
+      13,   496,    14,   125,    56,   499,    40,   181,   182,   413,
+     163,   164,   165,   166,    57,   203,   204,   205,   433,   172,
+     211,   572,   573,    41,   284,    74,   486,    73,   221,    76,
+     577,   206,    77,    46,    80,    81,    82,    95,    17,    96,
+      78,    44,    18,    50,    79,    19,   101,    97,   284,   284,
+     452,    20,   189,   190,   191,   415,   416,   417,   418,   419,
+     420,   102,   107,   108,   474,   109,   468,   444,   103,   446,
+     110,     1,     2,   441,   442,   455,   458,   445,   476,   477,
+     324,   478,   479,   134,   466,   112,   469,   470,   113,   217,
+     106,   116,    17,   632,   633,   334,    18,   299,   300,   301,
+     302,   117,   244,    63,    64,    65,    66,    67,    68,    69,
+      70,   459,   460,   461,   462,    84,    85,    86,   222,   223,
+     121,   297,   130,   328,  -266,   475,   476,   477,   374,   478,
+     479,   480,   434,   435,   436,   437,   438,   439,   252,   143,
+     144,   547,   173,    87,   637,   172,   297,   526,  -265,   162,
+     167,   323,   178,   177,   534,   538,   542,   174,    95,   179,
+      96,   180,   284,   252,   350,   184,   352,   187,    97,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,   284,   192,
+     197,   232,   193,   194,   195,   196,   200,   233,   209,    11,
       12,    13,   234,   463,   464,   465,   235,    40,   236,   237,
-     231,   306,   238,   307,   239,   309,   240,   376,   241,   310,
-     313,   316,   472,   242,   380,    58,   243,   244,    63,    64,
-      65,    66,   245,   246,   247,   248,   249,   317,   318,   250,
-      84,    85,    86,   421,   422,   423,   424,   425,   426,   427,
-     428,   429,   251,   329,   330,   430,   505,   335,   581,   336,
-     508,   434,   435,   436,   437,   438,   439,   353,   451,   172,
+     212,   216,   238,   214,   239,   215,   240,   376,   241,   219,
+     230,   472,   231,   242,   380,    58,   243,   244,    63,    64,
+      65,    66,   245,   246,   247,   248,   249,   306,   307,   250,
+      84,    85,    86,   309,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,   447,   310,   505,   448,   313,   449,   508,
+     581,   316,   317,   318,   251,   329,   330,   335,   451,   172,
       62,    63,    64,    65,    66,    67,    68,    69,    70,   619,
-     355,   356,   357,   377,   389,   297,   390,   391,   399,   395,
-     403,   404,   405,   407,   545,   609,   612,   615,   406,   409,
-      19,   618,   574,   411,   408,   443,   576,   487,   251,   491,
-     578,   490,   473,   494,   489,   516,   594,   595,   596,   497,
-     579,   517,   580,   518,   519,   520,   431,   509,   510,   511,
+     336,   353,   355,   356,   357,   297,   377,   389,   390,   391,
+     399,   395,   403,   545,   404,   609,   612,   615,   405,   406,
+      19,   407,   574,   408,   411,   409,   576,   443,   251,   473,
+     578,   487,   490,   494,   489,   491,   594,   595,   596,   579,
+     497,   580,   516,   517,   518,   519,   520,   509,   510,   511,
      512,   513,   514,   515,   521,   582,   522,   523,   589,   590,
-     591,   592,   525,   593,   527,   528,   529,   597,   616,   617,
-     624,   328,   635,   638,   625,    87,   543,   544,   634,   546,
-     641,   168,   642,   210,   308,   213,   115,   201,   623,    95,
-     321,    96,   208,   332,   183,   575,   583,   639,   504,    97,
-    -131,   319,  -131,  -131,  -131,  -131,  -131,  -131,  -131,  -131,
-    -131,  -131,  -131,  -131,  -131,  -131,  -131,  -131,   640,   380,
-     507,   495,   585,   584,    62,    63,    64,    65,    66,    67,
+     591,   592,   525,   593,   527,   528,   529,   597,   624,   616,
+     635,   328,   638,   641,   617,    87,   543,   544,   625,   546,
+     421,   422,   423,   424,   425,   426,   427,   428,   429,    95,
+     623,    96,   430,   634,   642,   308,   210,   201,   168,    97,
+    -131,   213,  -131,  -131,  -131,  -131,  -131,  -131,  -131,  -131,
+    -131,  -131,  -131,  -131,  -131,  -131,  -131,  -131,   115,   380,
+     321,   208,   332,   575,    62,    63,    64,    65,    66,    67,
       68,    69,    70,   172,   172,   172,   135,    84,    85,    86,
-      98,    99,   621,     0,     0,   498,     0,     0,     0,   598,
+     183,   583,   621,   504,   639,   618,   640,   319,   507,   598,
      599,   600,   601,   602,   603,   604,   605,   606,   232,   607,
-     312,   636,     0,     0,     0,     0,    11,    12,    13,   234,
-       0,     0,     0,   235,    40,   236,   237,     0,     0,   238,
+     585,   636,   584,   431,   498,   495,    11,    12,    13,   234,
+      98,   312,    99,   235,    40,   236,   237,     0,     0,   238,
        0,   239,     0,   240,     0,   241,     0,  -131,     0,     0,
      242,     0,    58,     0,   244,    63,    64,    65,    66,   245,
      246,   247,   248,   249,     0,     0,   250,    84,    85,    86,
@@ -1577,67 +1577,66 @@
       68,    69,    70,     0,   610,   611,   135,    84,    85,    86,
       62,    63,    64,    65,    66,    67,    68,    69,    70,     0,
      613,   614,   135,    84,    85,    86,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,   447,     0,     0,   448,     0,
-     449,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-     249,     0,     0,   170,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,     0,     0,     0,   170
+      66,    67,    68,    69,    70,   249,     0,     0,   170,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,     0,     0,
+       0,   170
 };
 
 static const yytype_int16 yycheck[] =
 {
-      17,    28,   116,    28,    94,   153,    87,     9,   237,   409,
-     218,    28,   218,   218,   122,    35,   242,     9,     2,     9,
-     597,    35,    39,   218,     9,    10,    11,    45,    13,    15,
-      45,   218,   218,   118,   218,   243,    12,   243,   243,    35,
-     118,   247,   127,     0,   122,   251,    14,    33,   243,   127,
-     222,    36,    37,   630,   283,    31,   243,   243,    42,   243,
-      77,    29,   234,    46,    32,   271,   110,   111,   112,   460,
-     461,    46,     3,     4,     5,     6,   114,   115,   469,    10,
-      11,   125,    13,    47,    97,    98,    17,   100,   101,   122,
-     107,   108,   109,   110,    37,   203,   110,   111,   112,   116,
-     120,   182,   120,    34,   218,   120,    38,    39,    35,    41,
-      37,   113,   126,   118,    46,    35,   391,   144,   103,   144,
-     395,   113,   107,   113,   399,   110,    35,   144,   242,   243,
-     356,   116,    38,    39,    40,    41,   338,   339,   340,   341,
-     342,   343,    35,    97,    35,    99,   372,   118,   350,    46,
-     352,   123,   124,   347,   348,   361,   362,   351,   105,   106,
-     250,   616,   617,   180,   372,    46,   372,   372,    46,   196,
-     187,    46,   103,    35,   120,   265,   107,    46,    47,    48,
-      46,    35,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,   158,   159,
-     160,   218,   113,   409,   122,    96,    97,    98,   298,   100,
-     101,   102,    35,   120,   122,    46,   218,   122,   121,   120,
-     124,   450,   120,   123,   119,   242,   243,   627,   430,   119,
-      46,   248,   120,   118,   440,   441,   442,   121,   265,   118,
-     265,   243,   356,    35,   271,   121,   271,   121,   265,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,   372,    35,
-     121,     1,    46,    48,    47,    46,     8,     7,   119,     9,
+      17,    28,   116,    28,    94,    87,   409,   153,   237,     9,
+     218,    28,   218,   218,    45,     2,   242,     9,   218,     9,
+      35,    35,    39,    45,     9,    10,    11,   122,    13,   597,
+      12,   218,   218,   218,    35,   243,    37,   243,   243,    35,
+      97,   247,    99,   243,   118,   251,    14,   222,    15,    31,
+       0,    36,    37,   127,   283,    42,   243,   243,   243,   234,
+      77,    29,   630,    46,    32,   271,    33,   118,   110,   111,
+     112,   122,     3,     4,     5,     6,   127,   391,    47,    10,
+      11,   395,    13,   125,    46,   399,    17,   123,   124,   120,
+     107,   108,   109,   110,   122,   110,   111,   112,   120,   116,
+     182,   460,   461,    34,   218,   118,   120,    37,   203,    35,
+     469,   126,   118,   113,    46,    47,    48,   144,   103,   144,
+      35,   113,   107,   113,    35,   110,    46,   144,   242,   243,
+     356,   116,   158,   159,   160,   338,   339,   340,   341,   342,
+     343,    46,    38,    39,    35,    41,   372,   350,    46,   352,
+      46,   114,   115,   347,   348,   361,   362,   351,    97,    98,
+     250,   100,   101,   180,   372,    46,   372,   372,    35,   196,
+     187,   120,   103,   616,   617,   265,   107,    38,    39,    40,
+      41,    46,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,   105,   106,
+     113,   218,    35,   409,   122,    96,    97,    98,   298,   100,
+     101,   102,    54,    55,    56,    57,    58,    59,   218,    35,
+     120,   450,   123,   122,   627,   242,   243,   430,   122,   121,
+     120,   248,   120,   119,   440,   441,   442,   124,   265,   119,
+     265,   120,   356,   243,   271,   118,   271,   118,   265,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,   372,    46,
+      46,     1,   121,   121,   121,   121,    35,     7,    35,     9,
       10,    11,    12,   128,   129,   130,    16,    17,    18,    19,
-     119,   108,    22,   104,    24,    35,    26,   304,    28,    35,
-     118,    35,   373,    33,   311,    35,    36,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    35,    35,    49,
-      50,    51,    52,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,   118,    35,    35,    49,   407,    35,   476,    35,
-     411,    54,    55,    56,    57,    58,    59,    35,   355,   356,
+      46,    46,    22,    47,    24,    48,    26,   304,    28,     8,
+     119,   373,   119,    33,   311,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,   108,   104,    49,
+      50,    51,    52,    35,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    35,   407,    49,   118,    51,   411,
+     476,    35,    35,    35,   118,    35,    35,    35,   355,   356,
       37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-     127,   121,    35,   109,    35,   372,    35,    20,    30,    21,
-      35,    35,    35,   121,   445,   571,   572,   573,    35,   120,
-     110,   577,   462,   121,   119,    45,   466,    96,   118,   120,
-     470,   119,   121,    23,    53,    45,   500,   501,   502,    25,
-     471,    45,   473,    45,    45,    45,   120,   414,   415,   416,
+      35,    35,   127,   121,    35,   372,   109,    35,    35,    20,
+      30,    21,    35,   445,    35,   571,   572,   573,    35,    35,
+     110,   121,   462,   119,   121,   120,   466,    45,   118,   121,
+     470,    96,   119,    23,    53,   120,   500,   501,   502,   471,
+      25,   473,    45,    45,    45,    45,    45,   414,   415,   416,
      417,   418,   419,   420,    45,   118,    45,    45,    35,    35,
-      35,    35,   429,    35,   431,   432,   433,    35,   120,   120,
-      35,   627,    15,    27,   120,   122,   443,   444,   119,   446,
-      35,   113,    35,   180,   225,   187,    52,   174,   586,   466,
-     243,   466,   178,   265,   144,   466,   486,   630,   401,   466,
-      35,   241,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,   635,   486,
-     410,   393,   491,   489,    37,    38,    39,    40,    41,    42,
+      35,    35,   429,    35,   431,   432,   433,    35,    35,   120,
+      15,   627,    27,    35,   120,   122,   443,   444,   120,   446,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,   466,
+     586,   466,    49,   119,    35,   225,   180,   174,   113,   466,
+      35,   187,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    52,   486,
+     243,   178,   265,   466,    37,    38,    39,    40,    41,    42,
       43,    44,    45,   500,   501,   502,    49,    50,    51,    52,
-      30,    33,   582,    -1,    -1,   397,    -1,    -1,    -1,   516,
+     144,   486,   582,   401,   630,   577,   635,   241,   410,   516,
      517,   518,   519,   520,   521,   522,   523,   524,     1,   526,
-     235,   625,    -1,    -1,    -1,    -1,     9,    10,    11,    12,
-      -1,    -1,    -1,    16,    17,    18,    19,    -1,    -1,    22,
+     491,   625,   489,   120,   397,   393,     9,    10,    11,    12,
+      30,   235,    33,    16,    17,    18,    19,    -1,    -1,    22,
       -1,    24,    -1,    26,    -1,    28,    -1,   122,    -1,    -1,
       33,    -1,    35,    -1,    37,    38,    39,    40,    41,    42,
       43,    44,    45,    46,    -1,    -1,    49,    50,    51,    52,
@@ -1681,10 +1680,9 @@
       43,    44,    45,    -1,    47,    48,    49,    50,    51,    52,
       37,    38,    39,    40,    41,    42,    43,    44,    45,    -1,
       47,    48,    49,    50,    51,    52,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    -1,    -1,    49,    -1,
-      51,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    -1,    -1,    49,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    -1,    -1,    -1,    49
+      41,    42,    43,    44,    45,    46,    -1,    -1,    49,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    -1,    -1,
+      -1,    49
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1752,7 +1750,7 @@
      279,   272,   118,   223,   261,   258,    97,    99,   271,    35,
       35,    35,    35,    35,   244,   244,   244,    35,   286,   286,
      286,   286,   286,   286,   286,   286,   286,   286,    46,   283,
-      47,    48,   283,    47,    48,   283,   120,   120,   283,    46,
+      47,    48,   283,    47,    48,   283,   120,   120,   279,    46,
      172,   208,   286,   272,    35,   120,   233,    31,   221,   234,
      235,   236,   203,   203,   119,    15,   244,   248,    27,   236,
      243,    35,    35
@@ -2764,7 +2762,6 @@
                            /* if there are parameters, then emit a get_params instruction. */
                            if ((yyvsp[(1) - (1)].ival) > 0) {
 
-                               /* generate_get_params(lexer); */
                                set_instr(lexer, "get_params");
                                /* don't infer the signatured opname from arguments,
                                 * it's always same: get_params_pc
@@ -2779,37 +2776,37 @@
     break;
 
   case 74:
-#line 762 "pir.y"
+#line 761 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 75:
-#line 764 "pir.y"
+#line 763 "pir.y"
     { ++(yyval.ival); /* count number of parameters */ ;}
     break;
 
   case 76:
-#line 768 "pir.y"
+#line 767 "pir.y"
     { set_param_flag(lexer, (yyvsp[(2) - (4)].targ), (yyvsp[(3) - (4)].ival)); ;}
     break;
 
   case 77:
-#line 772 "pir.y"
+#line 771 "pir.y"
     { (yyval.targ) = add_param(lexer, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 78:
-#line 776 "pir.y"
+#line 775 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 79:
-#line 778 "pir.y"
+#line 777 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 83:
-#line 787 "pir.y"
+#line 786 "pir.y"
     { (yyval.ival) = TARGET_FLAG_INVOCANT;
                            /* XXX handle multi_type */
 
@@ -2817,12 +2814,12 @@
     break;
 
   case 84:
-#line 794 "pir.y"
+#line 793 "pir.y"
     { (yyval.ival) = TARGET_FLAG_UNIQUE_REG; ;}
     break;
 
   case 86:
-#line 801 "pir.y"
+#line 800 "pir.y"
     {
                          ++lexer->stmt_counter;
                          /* increment the logical statement counter; a statement can be
@@ -2833,37 +2830,37 @@
     break;
 
   case 87:
-#line 811 "pir.y"
+#line 810 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 105:
-#line 839 "pir.y"
+#line 838 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (3)].mval), (yyvsp[(2) - (3)].pval)); ;}
     break;
 
   case 106:
-#line 843 "pir.y"
+#line 842 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 107:
-#line 845 "pir.y"
+#line 844 "pir.y"
     { (yyval.pval) = (yyvsp[(2) - (3)].pval); ;}
     break;
 
   case 108:
-#line 849 "pir.y"
+#line 848 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 110:
-#line 854 "pir.y"
+#line 853 "pir.y"
     { (yyval.pval) = new_macro_param((yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 111:
-#line 856 "pir.y"
+#line 855 "pir.y"
     {
                           macro_param *param = new_macro_param((yyvsp[(3) - (3)].sval));
                           param->next = (yyvsp[(1) - (3)].pval);
@@ -2872,7 +2869,7 @@
     break;
 
   case 112:
-#line 864 "pir.y"
+#line 863 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                           if (sym == NULL) {
@@ -2883,22 +2880,22 @@
     break;
 
   case 114:
-#line 873 "pir.y"
+#line 872 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 116:
-#line 878 "pir.y"
+#line 877 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 117:
-#line 883 "pir.y"
+#line 882 "pir.y"
     { (yyval.sval) = ""; ;}
     break;
 
   case 118:
-#line 885 "pir.y"
+#line 884 "pir.y"
     { /* XXX cleanup memory stuff */
                           char *newbuff = (char *)mem_sys_allocate((strlen((yyvsp[(1) - (2)].sval)) + strlen((yyvsp[(2) - (2)].sval)) + 2)
                                                                    * sizeof (char));
@@ -2908,17 +2905,17 @@
     break;
 
   case 122:
-#line 897 "pir.y"
+#line 896 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 123:
-#line 905 "pir.y"
+#line 904 "pir.y"
     { set_instr(lexer, NULL); ;}
     break;
 
   case 125:
-#line 913 "pir.y"
+#line 912 "pir.y"
     {
                            if (lexer->parse_errors > MAX_NUM_ERRORS)
                                panic(lexer, "Too many errors. Compilation aborted.\n");
@@ -2928,7 +2925,7 @@
     break;
 
   case 126:
-#line 922 "pir.y"
+#line 921 "pir.y"
     {
                            set_instrf(lexer, "null", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -2936,7 +2933,7 @@
     break;
 
   case 127:
-#line 929 "pir.y"
+#line 928 "pir.y"
     {
                            set_instrf(lexer, "get_results", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -2944,7 +2941,7 @@
     break;
 
   case 131:
-#line 943 "pir.y"
+#line 942 "pir.y"
     { /* at this point, TK_IDENT may in fact be a symbol identifier,
                             * not an op, so don't do any checks like is_parrot_op() just yet.
                             */
@@ -2954,7 +2951,7 @@
     break;
 
   case 132:
-#line 952 "pir.y"
+#line 951 "pir.y"
     { /* when this rule is activated, the initial identifier must
                            * be a parrot op.
                            */
@@ -2964,7 +2961,7 @@
     break;
 
   case 138:
-#line 970 "pir.y"
+#line 969 "pir.y"
     {
                          /* the "instruction" that was set now appears to be
                           * an identifier; get the name, and check its type.
@@ -3001,22 +2998,22 @@
     break;
 
   case 139:
-#line 1006 "pir.y"
+#line 1005 "pir.y"
     { push_operand(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 140:
-#line 1011 "pir.y"
+#line 1010 "pir.y"
     { push_operand(lexer, expr_from_key(lexer, (yyvsp[(1) - (1)].key))); ;}
     break;
 
   case 141:
-#line 1015 "pir.y"
+#line 1014 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 142:
-#line 1017 "pir.y"
+#line 1016 "pir.y"
     { /* this is either a LABEL or a symbol; in the latter case, the type
                             * will be filled in later. */
                            (yyval.expr) = expr_from_ident(lexer, (yyvsp[(1) - (1)].sval));
@@ -3024,17 +3021,17 @@
     break;
 
   case 143:
-#line 1022 "pir.y"
+#line 1021 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 144:
-#line 1024 "pir.y"
+#line 1023 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 145:
-#line 1028 "pir.y"
+#line 1027 "pir.y"
     {
                            /* if $1 is a register, just return that */
                            if (TEST_FLAG((yyvsp[(1) - (2)].targ)->flags, TARGET_FLAG_IS_REG))
@@ -3058,22 +3055,22 @@
     break;
 
   case 146:
-#line 1051 "pir.y"
+#line 1050 "pir.y"
     { (yyval.key) = (yyvsp[(2) - (3)].key); ;}
     break;
 
   case 147:
-#line 1055 "pir.y"
+#line 1054 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 148:
-#line 1057 "pir.y"
+#line 1056 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 149:
-#line 1066 "pir.y"
+#line 1065 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (6)].expr));
@@ -3087,7 +3084,7 @@
     break;
 
   case 150:
-#line 1077 "pir.y"
+#line 1076 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (4)].expr));
@@ -3102,7 +3099,7 @@
     break;
 
   case 151:
-#line 1089 "pir.y"
+#line 1088 "pir.y"
     { /* XXX create a PMC const for $4 */
                           unshift_operand(lexer, expr_from_key(lexer, (yyvsp[(4) - (6)].key)));
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (6)].targ)));
@@ -3113,7 +3110,7 @@
     break;
 
   case 153:
-#line 1102 "pir.y"
+#line 1101 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3125,7 +3122,7 @@
     break;
 
   case 154:
-#line 1111 "pir.y"
+#line 1110 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 0.0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3137,7 +3134,7 @@
     break;
 
   case 155:
-#line 1120 "pir.y"
+#line 1119 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%s", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].sval));
                           get_opinfo(yyscanner);
@@ -3145,7 +3142,7 @@
     break;
 
   case 156:
-#line 1125 "pir.y"
+#line 1124 "pir.y"
     {
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (3)].targ)));
                           get_opinfo(yyscanner);
@@ -3153,7 +3150,7 @@
     break;
 
   case 157:
-#line 1130 "pir.y"
+#line 1129 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (3)].sval));
                           if (sym == NULL) {
@@ -3177,7 +3174,7 @@
     break;
 
   case 158:
-#line 1151 "pir.y"
+#line 1150 "pir.y"
     {
                           /*   $P0 = foo ["bar"]
                            *
@@ -3220,7 +3217,7 @@
     break;
 
   case 159:
-#line 1191 "pir.y"
+#line 1190 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (4)].sval));
                           target *t;
@@ -3241,7 +3238,7 @@
     break;
 
   case 160:
-#line 1209 "pir.y"
+#line 1208 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (4)].ival));
                           set_target_key(preg, (yyvsp[(4) - (4)].key));
@@ -3251,7 +3248,7 @@
     break;
 
   case 161:
-#line 1216 "pir.y"
+#line 1215 "pir.y"
     {
                           set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%E", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].expr));
                           get_opinfo(yyscanner);
@@ -3259,7 +3256,7 @@
     break;
 
   case 162:
-#line 1221 "pir.y"
+#line 1220 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3273,7 +3270,7 @@
     break;
 
   case 163:
-#line 1232 "pir.y"
+#line 1231 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3287,7 +3284,7 @@
     break;
 
   case 164:
-#line 1243 "pir.y"
+#line 1242 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3301,7 +3298,7 @@
     break;
 
   case 165:
-#line 1254 "pir.y"
+#line 1253 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3315,7 +3312,7 @@
     break;
 
   case 166:
-#line 1265 "pir.y"
+#line 1264 "pir.y"
     {
                           set_instrf(lexer, "add", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3323,7 +3320,7 @@
     break;
 
   case 167:
-#line 1270 "pir.y"
+#line 1269 "pir.y"
     {
                           set_instrf(lexer, "sub", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3331,7 +3328,7 @@
     break;
 
   case 168:
-#line 1275 "pir.y"
+#line 1274 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(3) - (4)].sval), "%T%E", (yyvsp[(1) - (4)].targ), (yyvsp[(4) - (4)].expr));
                           get_opinfo(yyscanner);
@@ -3339,19 +3336,22 @@
     break;
 
   case 169:
-#line 1280 "pir.y"
+#line 1279 "pir.y"
     {
                           if (targets_equal((yyvsp[(1) - (5)].targ), (yyvsp[(3) - (5)].targ))) /* $P0 = $P0 + $P1 ==> $P0 += $P1 */
-                              set_instrf(lexer, opnames[(yyvsp[(4) - (5)].ival)], "%T%T", (yyvsp[(1) - (5)].targ), (yyvsp[(5) - (5)].targ));
+                              set_instrf(lexer, opnames[(yyvsp[(4) - (5)].ival)], "%T%E", (yyvsp[(1) - (5)].targ), (yyvsp[(5) - (5)].expr));
                           else
-                              set_instrf(lexer, opnames[(yyvsp[(4) - (5)].ival)], "%T%T%T", (yyvsp[(1) - (5)].targ), (yyvsp[(3) - (5)].targ), (yyvsp[(5) - (5)].targ));
+                              set_instrf(lexer, opnames[(yyvsp[(4) - (5)].ival)], "%T%T%E", (yyvsp[(1) - (5)].targ), (yyvsp[(3) - (5)].targ), (yyvsp[(5) - (5)].expr));
+
+                          /* XXX this do_strength_reduction() doesn't work properly yet. */
+                          do_strength_reduction(yyscanner);
 
                           get_opinfo(yyscanner);
                         ;}
     break;
 
   case 170:
-#line 1289 "pir.y"
+#line 1291 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (4)].sval));
                           target *t;
@@ -3373,7 +3373,7 @@
     break;
 
   case 171:
-#line 1308 "pir.y"
+#line 1310 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (4)].ival));
                           set_target_key(preg, (yyvsp[(2) - (4)].key));
@@ -3383,97 +3383,97 @@
     break;
 
   case 172:
-#line 1342 "pir.y"
+#line 1344 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%i%T", (yyvsp[(1) - (3)].ival), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 173:
-#line 1344 "pir.y"
+#line 1346 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%n%T", (yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 174:
-#line 1346 "pir.y"
+#line 1348 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%s%T", (yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 175:
-#line 1348 "pir.y"
+#line 1350 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_s_s(yyscanner, (yyvsp[(1) - (3)].sval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].sval))); ;}
     break;
 
   case 176:
-#line 1350 "pir.y"
+#line 1352 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_i_i(yyscanner, (yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival))); ;}
     break;
 
   case 177:
-#line 1352 "pir.y"
+#line 1354 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_n_n(yyscanner, (yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval))); ;}
     break;
 
   case 178:
-#line 1354 "pir.y"
+#line 1356 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_i_n(yyscanner, (yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval))); ;}
     break;
 
   case 179:
-#line 1356 "pir.y"
+#line 1358 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_n_i(yyscanner, (yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival))); ;}
     break;
 
   case 180:
-#line 1361 "pir.y"
+#line 1363 "pir.y"
     { get_opinfo(yyscanner); ;}
     break;
 
   case 181:
-#line 1370 "pir.y"
+#line 1372 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, (yyvsp[(3) - (5)].sval), (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 182:
-#line 1372 "pir.y"
+#line 1374 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "int", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 183:
-#line 1374 "pir.y"
+#line 1376 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "num", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 184:
-#line 1376 "pir.y"
+#line 1378 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "pmc", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 185:
-#line 1378 "pir.y"
+#line 1380 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "string", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 186:
-#line 1380 "pir.y"
+#line 1382 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "if", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 187:
-#line 1382 "pir.y"
+#line 1384 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "unless", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 188:
-#line 1384 "pir.y"
+#line 1386 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "goto", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 189:
-#line 1386 "pir.y"
+#line 1388 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "null", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 190:
-#line 1388 "pir.y"
+#line 1390 "pir.y"
     {
                           int istrue = evaluate_c(lexer, (yyvsp[(2) - (4)].cval));
                           /* if "unless", invert the true-ness */
@@ -3488,7 +3488,7 @@
     break;
 
   case 191:
-#line 1400 "pir.y"
+#line 1402 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(1) - (5)].ival) ? "unless_null" : "if_null", "%T%I",
                                      new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (5)].ival)), (yyvsp[(5) - (5)].sval));
@@ -3496,67 +3496,67 @@
     break;
 
   case 192:
-#line 1405 "pir.y"
+#line 1407 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 193:
-#line 1407 "pir.y"
+#line 1409 "pir.y"
     { set_instrf(lexer, (yyvsp[(1) - (4)].ival) ? "unless" : "if", "%T%I", (yyvsp[(2) - (4)].targ), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 194:
-#line 1409 "pir.y"
+#line 1411 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "int", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 195:
-#line 1411 "pir.y"
+#line 1413 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "num", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 196:
-#line 1413 "pir.y"
+#line 1415 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "pmc", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 197:
-#line 1415 "pir.y"
+#line 1417 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "string", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 198:
-#line 1417 "pir.y"
+#line 1419 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "if", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 199:
-#line 1419 "pir.y"
+#line 1421 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "unless", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 200:
-#line 1421 "pir.y"
+#line 1423 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 201:
-#line 1423 "pir.y"
+#line 1425 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 202:
-#line 1425 "pir.y"
+#line 1427 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 203:
-#line 1427 "pir.y"
+#line 1429 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 204:
-#line 1429 "pir.y"
+#line 1431 "pir.y"
     {
                           if ((yyvsp[(2) - (4)].ival) == COMPUTE_DURING_RUNTIME) {
                              if ((yyvsp[(1) - (4)].ival) == NEED_INVERT_OPNAME) /* "unless" */
@@ -3584,7 +3584,7 @@
     break;
 
   case 205:
-#line 1460 "pir.y"
+#line 1462 "pir.y"
     {
                           /* the instructions "gt" and "ge" are converted to "lt" and "le".
                            * if so, then the arguments must be reversed as well. "lt" and
@@ -3613,7 +3613,7 @@
     break;
 
   case 206:
-#line 1486 "pir.y"
+#line 1488 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival) + 1], "%T%i", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].ival));
@@ -3624,7 +3624,7 @@
     break;
 
   case 207:
-#line 1494 "pir.y"
+#line 1496 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival) + 1], "%T%n", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].dval));
@@ -3636,7 +3636,7 @@
     break;
 
   case 208:
-#line 1503 "pir.y"
+#line 1505 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%s", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].sval));
@@ -3648,32 +3648,32 @@
     break;
 
   case 209:
-#line 1512 "pir.y"
+#line 1514 "pir.y"
     { (yyval.ival) = evaluate_i_i((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 210:
-#line 1514 "pir.y"
+#line 1516 "pir.y"
     { (yyval.ival) = evaluate_i_n((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 211:
-#line 1516 "pir.y"
+#line 1518 "pir.y"
     { (yyval.ival) = evaluate_n_i((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 212:
-#line 1518 "pir.y"
+#line 1520 "pir.y"
     { (yyval.ival) = evaluate_n_n((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 213:
-#line 1520 "pir.y"
+#line 1522 "pir.y"
     { (yyval.ival) = evaluate_s_s((yyvsp[(1) - (3)].sval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 214:
-#line 1524 "pir.y"
+#line 1526 "pir.y"
     {
                           yypirerror(yyscanner, lexer, "cannot compare string to %s",
                                      (yyvsp[(3) - (3)].ival) == INT_TYPE ? "integer" : "number");
@@ -3681,37 +3681,37 @@
     break;
 
   case 215:
-#line 1529 "pir.y"
+#line 1531 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare integer to string"); ;}
     break;
 
   case 216:
-#line 1531 "pir.y"
+#line 1533 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare number to string"); ;}
     break;
 
   case 217:
-#line 1535 "pir.y"
+#line 1537 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 218:
-#line 1536 "pir.y"
+#line 1538 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 219:
-#line 1539 "pir.y"
+#line 1541 "pir.y"
     { (yyval.ival) = DONT_INVERT_OPNAME; /* no need to invert */ ;}
     break;
 
   case 220:
-#line 1540 "pir.y"
+#line 1542 "pir.y"
     { (yyval.ival) = NEED_INVERT_OPNAME; /* yes, invert opname */ ;}
     break;
 
   case 223:
-#line 1548 "pir.y"
+#line 1550 "pir.y"
     {
                           set_instrf(lexer, "branch", "%I", (yyvsp[(2) - (3)].sval));
                           set_op_labelflag(lexer, BIT(0)); /* bit 0 means: "1 << 0" */
@@ -3720,37 +3720,37 @@
     break;
 
   case 224:
-#line 1556 "pir.y"
+#line 1558 "pir.y"
     { declare_local(lexer, (yyvsp[(2) - (4)].ival), (yyvsp[(3) - (4)].symb)); ;}
     break;
 
   case 225:
-#line 1560 "pir.y"
+#line 1562 "pir.y"
     { (yyval.symb) = (yyvsp[(1) - (1)].symb); ;}
     break;
 
   case 226:
-#line 1562 "pir.y"
+#line 1564 "pir.y"
     { (yyval.symb) = add_local((yyvsp[(1) - (3)].symb), (yyvsp[(3) - (3)].symb)); ;}
     break;
 
   case 227:
-#line 1566 "pir.y"
+#line 1568 "pir.y"
     { (yyval.symb) = new_local(lexer, (yyvsp[(1) - (2)].sval), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 228:
-#line 1569 "pir.y"
+#line 1571 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 229:
-#line 1570 "pir.y"
+#line 1572 "pir.y"
     { (yyval.ival) = 1; ;}
     break;
 
   case 230:
-#line 1574 "pir.y"
+#line 1576 "pir.y"
     { /* if $4 is not a register, it must be a declared symbol */
                           if (!TEST_FLAG((yyvsp[(4) - (5)].targ)->flags, TARGET_FLAG_IS_REG)) {
 
@@ -3763,12 +3763,12 @@
     break;
 
   case 231:
-#line 1589 "pir.y"
+#line 1591 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 234:
-#line 1601 "pir.y"
+#line 1603 "pir.y"
     { /* $4 contains an invocation object */
                               set_invocation_args((yyvsp[(4) - (8)].invo), (yyvsp[(3) - (8)].argm));
                               set_invocation_results((yyvsp[(4) - (8)].invo), (yyvsp[(6) - (8)].targ));
@@ -3777,72 +3777,72 @@
     break;
 
   case 235:
-#line 1609 "pir.y"
+#line 1611 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 236:
-#line 1611 "pir.y"
+#line 1613 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 237:
-#line 1615 "pir.y"
+#line 1617 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 238:
-#line 1617 "pir.y"
+#line 1619 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 239:
-#line 1621 "pir.y"
+#line 1623 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 240:
-#line 1625 "pir.y"
+#line 1627 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(2) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 241:
-#line 1627 "pir.y"
+#line 1629 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_NCI, (yyvsp[(2) - (2)].targ)); ;}
     break;
 
   case 242:
-#line 1630 "pir.y"
+#line 1632 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_METHOD, (yyvsp[(2) - (5)].targ), (yyvsp[(5) - (5)].expr)); ;}
     break;
 
   case 243:
-#line 1634 "pir.y"
+#line 1636 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 244:
-#line 1636 "pir.y"
+#line 1638 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (2)].targ); ;}
     break;
 
   case 245:
-#line 1640 "pir.y"
+#line 1642 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 246:
-#line 1642 "pir.y"
+#line 1644 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 247:
-#line 1646 "pir.y"
+#line 1648 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 248:
-#line 1648 "pir.y"
+#line 1650 "pir.y"
     {
                                if ((yyvsp[(2) - (2)].targ))
                                    (yyval.targ) = add_target(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].targ));
@@ -3852,38 +3852,38 @@
     break;
 
   case 249:
-#line 1657 "pir.y"
+#line 1659 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (3)].targ); ;}
     break;
 
   case 250:
-#line 1659 "pir.y"
+#line 1661 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 252:
-#line 1667 "pir.y"
+#line 1669 "pir.y"
     { set_invocation_results((yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ));
                              (yyval.invo) = (yyvsp[(3) - (3)].invo);
                            ;}
     break;
 
   case 253:
-#line 1671 "pir.y"
+#line 1673 "pir.y"
     { set_invocation_results((yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ));
                              (yyval.invo) = (yyvsp[(3) - (3)].invo);
                            ;}
     break;
 
   case 254:
-#line 1675 "pir.y"
+#line 1677 "pir.y"
     { set_invocation_results((yyvsp[(1) - (1)].invo), NULL);
                              (yyval.invo) = (yyvsp[(1) - (1)].invo);
                            ;}
     break;
 
   case 257:
-#line 1685 "pir.y"
+#line 1687 "pir.y"
     {
                              target *invocant;
 
@@ -3912,7 +3912,7 @@
     break;
 
   case 258:
-#line 1713 "pir.y"
+#line 1715 "pir.y"
     {
                              (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(1) - (2)].targ), NULL);
                              set_invocation_args((yyval.invo), (yyvsp[(2) - (2)].argm));
@@ -3920,12 +3920,12 @@
     break;
 
   case 259:
-#line 1720 "pir.y"
+#line 1722 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 260:
-#line 1722 "pir.y"
+#line 1724 "pir.y"
     {
                                symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                                if (sym == NULL)
@@ -3935,7 +3935,7 @@
     break;
 
   case 261:
-#line 1731 "pir.y"
+#line 1733 "pir.y"
     { /* check that this identifier was declared */
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
 
@@ -3955,22 +3955,22 @@
     break;
 
   case 262:
-#line 1748 "pir.y"
+#line 1750 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 263:
-#line 1750 "pir.y"
+#line 1752 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 264:
-#line 1752 "pir.y"
+#line 1754 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, new_const(lexer, STRING_TYPE, (yyvsp[(1) - (1)].sval))); ;}
     break;
 
   case 265:
-#line 1756 "pir.y"
+#line 1758 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -3982,67 +3982,67 @@
     break;
 
   case 266:
-#line 1765 "pir.y"
+#line 1767 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 267:
-#line 1770 "pir.y"
+#line 1772 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (3)].targ); ;}
     break;
 
   case 268:
-#line 1774 "pir.y"
+#line 1776 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 269:
-#line 1776 "pir.y"
+#line 1778 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 270:
-#line 1780 "pir.y"
+#line 1782 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 271:
-#line 1782 "pir.y"
+#line 1784 "pir.y"
     { (yyval.targ) = add_target(lexer, (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 272:
-#line 1786 "pir.y"
+#line 1788 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 273:
-#line 1790 "pir.y"
+#line 1792 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 274:
-#line 1792 "pir.y"
+#line 1794 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 275:
-#line 1796 "pir.y"
+#line 1798 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPTIONAL; ;}
     break;
 
   case 276:
-#line 1798 "pir.y"
+#line 1800 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPT_FLAG; ;}
     break;
 
   case 277:
-#line 1800 "pir.y"
+#line 1802 "pir.y"
     { (yyval.ival) = TARGET_FLAG_SLURPY; ;}
     break;
 
   case 278:
-#line 1802 "pir.y"
+#line 1804 "pir.y"
     {
                              (yyval.ival) = TARGET_FLAG_NAMED;
                              set_param_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4050,12 +4050,12 @@
     break;
 
   case 279:
-#line 1812 "pir.y"
+#line 1814 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 284:
-#line 1822 "pir.y"
+#line 1824 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args((yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4063,7 +4063,7 @@
     break;
 
   case 285:
-#line 1827 "pir.y"
+#line 1829 "pir.y"
     { /* was the invocation a method call? then it becomes a method tail
                                * call, otherwise it's just a normal (sub) tail call.
                                */
@@ -4075,7 +4075,7 @@
     break;
 
   case 286:
-#line 1838 "pir.y"
+#line 1840 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args((yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4083,47 +4083,47 @@
     break;
 
   case 287:
-#line 1845 "pir.y"
+#line 1847 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 288:
-#line 1849 "pir.y"
+#line 1851 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 289:
-#line 1851 "pir.y"
+#line 1853 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 290:
-#line 1855 "pir.y"
+#line 1857 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 291:
-#line 1857 "pir.y"
+#line 1859 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (3)].argm), (yyvsp[(3) - (3)].argm)); ;}
     break;
 
   case 294:
-#line 1865 "pir.y"
+#line 1867 "pir.y"
     { (yyval.argm) = set_arg_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 295:
-#line 1869 "pir.y"
+#line 1871 "pir.y"
     { (yyval.argm) = set_arg_flag((yyval.argm), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 296:
-#line 1873 "pir.y"
+#line 1875 "pir.y"
     { (yyval.argm) = set_curarg(lexer, new_argument(lexer, (yyvsp[(1) - (1)].expr)));  ;}
     break;
 
   case 297:
-#line 1879 "pir.y"
+#line 1881 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args((yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4131,7 +4131,7 @@
     break;
 
   case 298:
-#line 1888 "pir.y"
+#line 1890 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args((yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4139,72 +4139,72 @@
     break;
 
   case 299:
-#line 1895 "pir.y"
+#line 1897 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 300:
-#line 1897 "pir.y"
+#line 1899 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 301:
-#line 1902 "pir.y"
+#line 1904 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 302:
-#line 1904 "pir.y"
+#line 1906 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 303:
-#line 1909 "pir.y"
+#line 1911 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 304:
-#line 1913 "pir.y"
+#line 1915 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 305:
-#line 1915 "pir.y"
+#line 1917 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 306:
-#line 1919 "pir.y"
+#line 1921 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 307:
-#line 1921 "pir.y"
+#line 1923 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 308:
-#line 1925 "pir.y"
+#line 1927 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 309:
-#line 1930 "pir.y"
+#line 1932 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 310:
-#line 1932 "pir.y"
+#line 1934 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 311:
-#line 1936 "pir.y"
+#line 1938 "pir.y"
     { (yyval.ival) = ARG_FLAG_FLAT; ;}
     break;
 
   case 312:
-#line 1938 "pir.y"
+#line 1940 "pir.y"
     {
                                (yyval.ival) = ARG_FLAG_NAMED;
                                set_arg_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4212,132 +4212,132 @@
     break;
 
   case 313:
-#line 1945 "pir.y"
+#line 1947 "pir.y"
     { (yyval.sval) = NULL; ;}
     break;
 
   case 314:
-#line 1947 "pir.y"
+#line 1949 "pir.y"
     { (yyval.sval) = (yyvsp[(1) - (1)].sval); ;}
     break;
 
   case 315:
-#line 1951 "pir.y"
+#line 1953 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 319:
-#line 1962 "pir.y"
+#line 1964 "pir.y"
     { store_global_constant(lexer, (yyvsp[(2) - (2)].cval)); ;}
     break;
 
   case 320:
-#line 1966 "pir.y"
+#line 1968 "pir.y"
     { /* XXX is .globalconst to be kept? */ ;}
     break;
 
   case 321:
-#line 1970 "pir.y"
+#line 1972 "pir.y"
     { (yyval.cval) = new_named_const(lexer, INT_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ival)); ;}
     break;
 
   case 322:
-#line 1972 "pir.y"
+#line 1974 "pir.y"
     { (yyval.cval) = new_named_const(lexer, NUM_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].dval)); ;}
     break;
 
   case 323:
-#line 1974 "pir.y"
+#line 1976 "pir.y"
     { (yyval.cval) = new_named_const(lexer, STRING_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 324:
-#line 1976 "pir.y"
+#line 1978 "pir.y"
     { (yyval.cval) = new_pmc_const((yyvsp[(1) - (4)].sval), (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].cval)); ;}
     break;
 
   case 325:
-#line 1983 "pir.y"
+#line 1985 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 326:
-#line 1984 "pir.y"
+#line 1986 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 327:
-#line 1988 "pir.y"
+#line 1990 "pir.y"
     { (yyval.cval) = new_const(lexer, STRING_TYPE, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 328:
-#line 1989 "pir.y"
+#line 1991 "pir.y"
     { (yyval.cval) = new_const(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 329:
-#line 1990 "pir.y"
+#line 1992 "pir.y"
     { (yyval.cval) = new_const(lexer, NUM_TYPE, (yyvsp[(1) - (1)].dval)); ;}
     break;
 
   case 330:
-#line 1993 "pir.y"
+#line 1995 "pir.y"
     { (yyval.ival) = OP_NE; ;}
     break;
 
   case 331:
-#line 1994 "pir.y"
+#line 1996 "pir.y"
     { (yyval.ival) = OP_EQ; ;}
     break;
 
   case 332:
-#line 1995 "pir.y"
+#line 1997 "pir.y"
     { (yyval.ival) = OP_LT; ;}
     break;
 
   case 333:
-#line 1996 "pir.y"
+#line 1998 "pir.y"
     { (yyval.ival) = OP_LE; ;}
     break;
 
   case 334:
-#line 1997 "pir.y"
+#line 1999 "pir.y"
     { (yyval.ival) = OP_GE; ;}
     break;
 
   case 335:
-#line 1998 "pir.y"
+#line 2000 "pir.y"
     { (yyval.ival) = OP_GT; ;}
     break;
 
   case 336:
-#line 2001 "pir.y"
+#line 2003 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 337:
-#line 2002 "pir.y"
+#line 2004 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 338:
-#line 2003 "pir.y"
+#line 2005 "pir.y"
     { (yyval.ival) = PMC_TYPE; ;}
     break;
 
   case 339:
-#line 2004 "pir.y"
+#line 2006 "pir.y"
     { (yyval.ival) = STRING_TYPE; ;}
     break;
 
   case 340:
-#line 2012 "pir.y"
+#line 2014 "pir.y"
     { set_curtarget(lexer, (yyvsp[(1) - (1)].targ));  ;}
     break;
 
   case 342:
-#line 2016 "pir.y"
+#line 2018 "pir.y"
     { /* a symbol must have been declared; check that at this point. */
                            symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                            if (sym == NULL) {
@@ -4352,277 +4352,277 @@
     break;
 
   case 343:
-#line 2029 "pir.y"
+#line 2031 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 344:
-#line 2030 "pir.y"
+#line 2032 "pir.y"
     { (yyval.targ) = new_reg(lexer, NUM_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 345:
-#line 2031 "pir.y"
+#line 2033 "pir.y"
     { (yyval.targ) = new_reg(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 346:
-#line 2032 "pir.y"
+#line 2034 "pir.y"
     { (yyval.targ) = new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 349:
-#line 2040 "pir.y"
+#line 2042 "pir.y"
     { (yyval.sval) = "if"; ;}
     break;
 
   case 350:
-#line 2041 "pir.y"
+#line 2043 "pir.y"
     { (yyval.sval) = "unless"; ;}
     break;
 
   case 351:
-#line 2042 "pir.y"
+#line 2044 "pir.y"
     { (yyval.sval) = "goto"; ;}
     break;
 
   case 352:
-#line 2043 "pir.y"
+#line 2045 "pir.y"
     { (yyval.sval) = "int"; ;}
     break;
 
   case 353:
-#line 2044 "pir.y"
+#line 2046 "pir.y"
     { (yyval.sval) = "num"; ;}
     break;
 
   case 354:
-#line 2045 "pir.y"
+#line 2047 "pir.y"
     { (yyval.sval) = "string"; ;}
     break;
 
   case 355:
-#line 2046 "pir.y"
+#line 2048 "pir.y"
     { (yyval.sval) = "pmc"; ;}
     break;
 
   case 356:
-#line 2047 "pir.y"
+#line 2049 "pir.y"
     { (yyval.sval) = "null"; ;}
     break;
 
   case 357:
-#line 2050 "pir.y"
+#line 2052 "pir.y"
     { (yyval.sval) = "neg"; ;}
     break;
 
   case 358:
-#line 2051 "pir.y"
+#line 2053 "pir.y"
     { (yyval.sval) = "not"; ;}
     break;
 
   case 359:
-#line 2052 "pir.y"
+#line 2054 "pir.y"
     { (yyval.sval) = "bnot"; ;}
     break;
 
   case 360:
-#line 2055 "pir.y"
+#line 2057 "pir.y"
     { (yyval.ival) = OP_ADD; ;}
     break;
 
   case 361:
-#line 2056 "pir.y"
+#line 2058 "pir.y"
     { (yyval.ival) = OP_SUB; ;}
     break;
 
   case 362:
-#line 2057 "pir.y"
+#line 2059 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 363:
-#line 2058 "pir.y"
+#line 2060 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 364:
-#line 2059 "pir.y"
+#line 2061 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 365:
-#line 2060 "pir.y"
+#line 2062 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 366:
-#line 2061 "pir.y"
+#line 2063 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 367:
-#line 2062 "pir.y"
+#line 2064 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 368:
-#line 2063 "pir.y"
+#line 2065 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 369:
-#line 2064 "pir.y"
+#line 2066 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 370:
-#line 2065 "pir.y"
+#line 2067 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 371:
-#line 2066 "pir.y"
+#line 2068 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 372:
-#line 2067 "pir.y"
+#line 2069 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 373:
-#line 2068 "pir.y"
+#line 2070 "pir.y"
     { (yyval.ival) = OP_OR; ;}
     break;
 
   case 374:
-#line 2069 "pir.y"
+#line 2071 "pir.y"
     { (yyval.ival) = OP_AND; ;}
     break;
 
   case 375:
-#line 2070 "pir.y"
+#line 2072 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 376:
-#line 2071 "pir.y"
+#line 2073 "pir.y"
     { (yyval.ival) = OP_XOR; ;}
     break;
 
   case 377:
-#line 2072 "pir.y"
+#line 2074 "pir.y"
     { (yyval.ival) = OP_ISEQ; ;}
     break;
 
   case 378:
-#line 2073 "pir.y"
+#line 2075 "pir.y"
     { (yyval.ival) = OP_ISLE; ;}
     break;
 
   case 379:
-#line 2074 "pir.y"
+#line 2076 "pir.y"
     { (yyval.ival) = OP_ISLT; ;}
     break;
 
   case 380:
-#line 2075 "pir.y"
+#line 2077 "pir.y"
     { (yyval.ival) = OP_ISGE; ;}
     break;
 
   case 381:
-#line 2076 "pir.y"
+#line 2078 "pir.y"
     { (yyval.ival) = OP_ISGT; ;}
     break;
 
   case 382:
-#line 2077 "pir.y"
+#line 2079 "pir.y"
     { (yyval.ival) = OP_ISNE; ;}
     break;
 
   case 383:
-#line 2083 "pir.y"
+#line 2085 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 384:
-#line 2084 "pir.y"
+#line 2086 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 385:
-#line 2085 "pir.y"
+#line 2087 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 386:
-#line 2086 "pir.y"
+#line 2088 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 387:
-#line 2087 "pir.y"
+#line 2089 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 388:
-#line 2088 "pir.y"
+#line 2090 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 389:
-#line 2089 "pir.y"
+#line 2091 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 390:
-#line 2090 "pir.y"
+#line 2092 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 391:
-#line 2091 "pir.y"
+#line 2093 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 392:
-#line 2092 "pir.y"
+#line 2094 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 393:
-#line 2093 "pir.y"
+#line 2095 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 394:
-#line 2094 "pir.y"
+#line 2096 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 396:
-#line 2115 "pir.y"
+#line 2117 "pir.y"
     { new_subr(lexer, "@start"); ;}
     break;
 
   case 405:
-#line 2131 "pir.y"
+#line 2133 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 410:
-#line 2141 "pir.y"
+#line 2143 "pir.y"
     { set_sub_name(lexer, (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 411:
-#line 2145 "pir.y"
+#line 2147 "pir.y"
     { new_subr(lexer, NULL); ;}
     break;
 
   case 412:
-#line 2150 "pir.y"
+#line 2152 "pir.y"
     {
                                   if (is_parrot_op(lexer, (yyvsp[(1) - (3)].sval)))
                                       get_opinfo(yyscanner);
@@ -4848,7 +4848,7 @@
 }
 
 
-#line 2161 "pir.y"
+#line 2163 "pir.y"
 
 
 



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About