Mercurial > hg > CbC > old > device
diff mc-code-mips.c @ 285:912b54949344
register assop const ( int/long )
author | kono |
---|---|
date | Tue, 01 Jun 2004 12:42:36 +0900 |
parents | ec1a68133f6a |
children | a0779a414855 |
line wrap: on
line diff
--- a/mc-code-mips.c Mon May 24 19:59:50 2004 +0900 +++ b/mc-code-mips.c Tue Jun 01 12:42:36 2004 +0900 @@ -1968,13 +1968,13 @@ static void code_call(int e2,NMTBL *fn,int jmp) { - char *jrn; + // char *jrn; if (fnptr->sc==CODE) { if (car(e2) == FNAME) { printf("\tla\t$25,%s\n",fn->nm); } else { - jrn = register_name(cadr(jmp)); - printf("\tmove\t$25,%s\n",jrn); + // jrn = register_name(cadr(jmp)); + // printf("\tmove\t$25,%s\n",jrn); } printf("\tjalr\t$25\n"); printf("\tlw\t$gp,$L_%d($sp)\n",cprestore_label); @@ -1982,8 +1982,8 @@ if (car(e2) == FNAME) { printf("\tjal\t%s\n",fn->nm); } else { - jrn = register_name(cadr(jmp)); - printf("\tmove $25,%s\n",jrn); + // jrn = register_name(cadr(jmp)); + // printf("\tmove $25,%s\n",jrn); printf("\tjal\t$31,$25\n"); } } @@ -2016,17 +2016,19 @@ } } + arg_assign = 0; e2 = cadr(e1); if (car(e2) == FNAME) { fn=(NMTBL *)cadr(e2); } else { - jmp = get_register_var(0); - if (car(jmp)!=REGISTER) error(-1); - reg_arg_list = list2(jmp,reg_arg_list); - g_expr(e2); - if (!is_int_reg(creg)) error(-1); - code_register(creg,cadr(jmp)); - /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */ + if (car(e2)==INDIRECT) e2=cadr(e2); // (*func)(i) case + jmp = list2(REGISTER,25); + if (!simple_arg(e2)) { + e3=get_register_var(0); + g_expr_u(assign_expr0(e3,e2,INT,INT)); + e2=e3; + } + arg_assign = list2(assign_expr0(jmp,e2,INT,INT),arg_assign); } /* First we execute complex argument to avoid interaction with input variables. Remain the last complex argument in complex_. */ @@ -2100,7 +2102,7 @@ } } - nargs = reg_arg = freg_arg = arg_assign = 0; + nargs = reg_arg = freg_arg = 0; // calc stack arguments first, it may requires extra registers, // and we can still use input registers now. for (e3 = e1; e3; @@ -2433,6 +2435,22 @@ use_int(creg); xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ +#if 1 + set_ireg(edx,0); + ld_indexx(byte,0,creg,ireg,sign); + tosop(op,ireg,xreg); + crn = register_name(ireg); + drn = register_name(creg); + if (byte==1) { + printf("\tsb %s,0(%s)\n",crn,drn); + } else if (byte==SIZE_OF_SHORT) { + printf("\tsh %s,0(%s)\n",crn,drn); + } else { + printf("\tsw %s,0(%s)\n",crn,drn); + } + free_register(edx); + emit_pop_free(xreg); +#else printf("# assop\n\tmove %s,%s\n",register_name(edx),register_name(creg)); ld_indexx(byte,0,edx,creg,sign); tosop(op,creg,xreg); @@ -2447,6 +2465,7 @@ } free_register(edx); emit_pop_free(xreg); +#endif } @@ -2694,6 +2713,8 @@ if (!asi) error(-1); } +// should have pcond_const + static void pcond(int op, int r2,int r1,int r0,int cond,int l1) {