cvsuser     03/06/26 04:20:14

  Modified:    languages/imcc cfg.c
  Log:
  newsub, invokecc reg usage
  
  Revision  Changes    Path
  1.29      +21 -1     parrot/languages/imcc/cfg.c
  
  Index: cfg.c
  ===================================================================
  RCS file: /cvs/public/parrot/languages/imcc/cfg.c,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -w -r1.28 -r1.29
  --- cfg.c     24 May 2003 13:43:06 -0000      1.28
  +++ cfg.c     26 Jun 2003 11:20:14 -0000      1.29
  @@ -15,6 +15,7 @@
    */
   
   static void add_instruc_reads(Instruction *ins, SymReg *r0);
  +static void add_instruc_writes(Instruction *ins, SymReg *r0);
   static void propagate_need(Basic_block *bb, SymReg* r, int i);
   
   /* Code: */
  @@ -52,7 +53,7 @@
           /* invoke w/o arg implicitly uses P0, so mark it as doing so
            * XXX but in the parser
            */
  -        if ( !strcmp(ins->op, "invoke")) {
  +        if ( !strcmp(ins->op, "invoke") || !strcmp(ins->op, "invokecc")) {
               if (ins->opsize == 1) {
                   SymReg * p0 = mk_pasm_reg(str_dup("P0"));
                   add_instruc_reads(ins, p0);
  @@ -63,6 +64,12 @@
               }
               ins->type |= IF_r0_branch | ITBRANCH;
           }
  +        else if ( !strcmp(ins->op, "newsub") && ins->opsize == 5) {
  +            SymReg * p0 = mk_pasm_reg(str_dup("P0"));
  +            SymReg * p1 = mk_pasm_reg(str_dup("P1"));
  +            add_instruc_writes(ins, p0);
  +            add_instruc_writes(ins, p1);
  +        }
           if ( (ins->type & ITLABEL)) {
               /* set the labels address (ins) */
               ins->r[0]->first_ins = ins;
  @@ -317,6 +324,19 @@
       ins->flags |= (1<<i);
   }
   
  +static void add_instruc_writes(Instruction *ins, SymReg *r0)
  +{
  +    int i;
  +    for (i = 0; i < IMCC_MAX_REGS && ins->r[i]; i++)
  +        if (r0 == ins->r[i])
  +            return;
  +    if (i == IMCC_MAX_REGS) {
  +        fatal(1, "add_instruc_writes","out of registers with %s\n", r0->name);
  +    }
  +    /* append reg */
  +    ins->r[i] = r0;
  +    ins->flags |= (1<< (16+i));
  +}
   #ifdef ALIAS
   /*
    * set P1, P0
  
  
  

Reply via email to