Mercurial > hg > CbC > old > device
diff mc-code-powerpc.c @ 285:912b54949344
register assop const ( int/long )
author | kono |
---|---|
date | Tue, 01 Jun 2004 12:42:36 +0900 (2004-06-01) |
parents | 230a3b98b843 |
children | a0779a414855 |
line wrap: on
line diff
--- a/mc-code-powerpc.c Mon May 24 19:59:50 2004 +0900 +++ b/mc-code-powerpc.c Tue Jun 01 12:42:36 2004 +0900 @@ -1885,10 +1885,12 @@ } } + arg_assign = 0; e2 = cadr(e1); if (car(e2) == FNAME) { fn=(NMTBL *)cadr(e2); } else { +#if 0 jmp = get_register_var(0); if (car(jmp)!=REGISTER) error(-1); reg_arg_list = list2(jmp,reg_arg_list); @@ -1896,6 +1898,16 @@ if (!is_int_reg(creg)) error(-1); code_register(creg,cadr(jmp)); /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */ +#else + if (car(e2)==INDIRECT) e2=cadr(e2); // (*func)(i) case + jmp = get_register_var(0); + if (car(jmp)!=REGISTER) error(-1); + reg_arg_list = list2(jmp,reg_arg_list); + if (!simple_arg(e2)) { + g_expr_u(assign_expr0(jmp,e2,INT,INT)); + } else + arg_assign = list2(assign_expr0(jmp,e2,INT,INT),arg_assign); +#endif } /* first we execute complex argument to avoid interaction with input variables */ @@ -1968,7 +1980,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; @@ -2295,6 +2307,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("\tstb %s,0(%s)\n",crn,drn); + } else if (byte==SIZE_OF_SHORT) { + printf("\tsth %s,0(%s)\n",crn,drn); + } else { + printf("\tstw %s,0(%s)\n",crn,drn); + } + free_register(creg); + emit_pop_free(xreg); +#else printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg)); ld_indexx(byte,0,edx,creg,sign); tosop(op,creg,xreg); @@ -2309,6 +2337,7 @@ } free_register(edx); emit_pop_free(xreg); +#endif } void @@ -4531,6 +4560,7 @@ emit_push(); use_longlong(reg); if (regv_l(lreg)==edx || regv_h(lreg)==edx) { + // this can't happen edx0 = get_register(); if(!edx0) error(-1); printf("# lassop\n\tmr %s,%s\n",register_name(edx0),register_name(edx)); edx = edx0;