Mercurial > hg > CbC > old > device
diff mc-code-mips.c @ 196:5f70abd9453d
*** empty log message ***
author | kono |
---|---|
date | Wed, 07 Apr 2004 21:14:19 +0900 |
parents | c193120ee2a6 |
children | 28baf6cd9ad1 |
line wrap: on
line diff
--- a/mc-code-mips.c Sun Apr 04 21:17:10 2004 +0900 +++ b/mc-code-mips.c Wed Apr 07 21:14:19 2004 +0900 @@ -1513,29 +1513,53 @@ } int -rindirect(int e1) /* *(p +5 ) */ +code_rindirect(int e1, int offset, int us) +{ + char *crn; + g_expr(e1); + crn=register_name(creg); + printf("\tlw %s,%d(%s)\n",crn,offset,crn); + return INT; +} + +int +code_crindirect(int e1, int offset, int us) { char *crn; - int e2,e3,e4,offset; - - offset=0; - e3 = cadr(e2 = cadr(e1)); - if (car(e2)==ADD) { - e4=caddr(e2); - if (car(e4)==CONST) { - offset=cadr(e4); - e2=e3; - } + g_expr(e1); + crn=register_name(creg); + if (us) { + printf("\tlbu %s,%d(%s)\n",crn,offset,crn); + return UCHAR; + } else { + printf("\tlb %s,%d(%s)\n",crn,offset,crn); + return CHAR; } - g_expr(e2); +} + +int +code_srindirect(int e1, int offset, int us) +{ + char *crn; + g_expr(e1); crn=register_name(creg); - switch (car(e1)) { - case FRINDIRECT: - printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn); - regv[creg]=0; regv[freg]=1; - creg = freg; - return FLOAT; - case DRINDIRECT: + if (us) { + printf("\tlhu %s,%d(%s)\n",crn,offset,crn); + return USHORT; + } else { + printf("\tlh %s,%d(%s)\n",crn,offset,crn); + return SHORT; + } +} + +#if FLOAT_CODE +int +code_drindirect(int e1, int offset, int d) +{ + char *crn; + g_expr(e1); + crn=register_name(creg); + if (d) { printf("\tlw %s,%d(%s)\n", dregister_name0(dreg),offset,crn); printf("\tlw %s,%d(%s)\n", @@ -1543,24 +1567,24 @@ regv[creg]=0; regv[dreg]=1; creg = dreg; return DOUBLE; - case CRINDIRECT: - printf("\tlb %s,%d(%s)\n",crn,offset,crn); - return CHAR; - case CURINDIRECT: - printf("\tlbu %s,%d(%s)\n",crn,offset,crn); - return UCHAR; - case SRINDIRECT: - printf("\tlh %s,%d(%s)\n",crn,offset,crn); - return SHORT; - case SURINDIRECT: - printf("\tlhu %s,%d(%s)\n",crn,offset,crn); - return USHORT; - case RINDIRECT: - printf("\tlw %s,%d(%s)\n",crn,offset,crn); - return INT; + } else { + printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn); + regv[creg]=0; regv[freg]=1; + creg = freg; + return FLOAT; } - error(-1); return INT; } +#endif + +#if LONGLONG_CODE +int +code_lrindirect(int e1, int offset, int us) +{ + char *crn; + g_expr(e1); + crn=register_name(creg); +} +#endif void code_assign_gvar(int e2,int creg,int byte) {