# HG changeset patch # User kono # Date 1058159120 -32400 # Node ID f8271009a3146e31baec61b9bd0e52bcb58e71f3 # Parent 0f36fdbcba9b5ff57cec73b8f8f04203f1ac1041 MIPS continue diff -r 0f36fdbcba9b -r f8271009a314 Changes --- a/Changes Mon Jul 14 07:56:26 2003 +0900 +++ b/Changes Mon Jul 14 14:05:20 2003 +0900 @@ -3127,3 +3127,11 @@ いたら気まずくない? regv は、register rename がなければいらないんじゃない? + +Mon Jul 14 10:54:46 JST 2003 + +なんかなぁ... creg/ireg/freg/dreg は、あんまり良いアイデア +では、なかったみたい。creg は、このうちのどれかでなくては +ならないんだが、それを保証できない。 + +前と同じで、creg を廃止して、ireg/freg/dreg/lreg とするか? diff -r 0f36fdbcba9b -r f8271009a314 Makefile --- a/Makefile Mon Jul 14 07:56:26 2003 +0900 +++ b/Makefile Mon Jul 14 14:05:20 2003 +0900 @@ -70,7 +70,8 @@ mc-parse.c mc-tree.c mc.h \ conv/c.c conv/c.h conv/c2cbc.c conv/c2cbc.h conv/cbc2c.c \ conv/cbc2c.h conv/conv.h conv/convdef.h conv/null.c conv/null.h \ - mc-code-powerpc.c + mc-code-powerpc.c \ + mc-code-mips.c clean : -rm -f mc mc-ia32 mc-powerpc mc-mips *.bak *.s *.o *.cc mc mc1 mc2 a.out *~ core* */*.o *.bak test/*.s test/*.cc test/*.o test/*.bak test/*~ conv/*.s conv/*.cc conv/*.o conv/*.bak conv/*~ *.out */*.out *.i */*.i @@ -182,3 +183,9 @@ mc-code-powerpc.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h mc-code-powerpc.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h mc-code-powerpc.o: conv/conv.h mc-code.h mc-codegen.h +mc-code-mips.o: mc.h /usr/include/stdio.h /usr/include/sys/types.h +mc-code-mips.o: /usr/include/sys/appleapiopts.h /usr/include/sys/cdefs.h +mc-code-mips.o: /usr/include/machine/types.h /usr/include/ppc/types.h +mc-code-mips.o: /usr/include/machine/ansi.h /usr/include/ppc/ansi.h +mc-code-mips.o: /usr/include/machine/endian.h /usr/include/ppc/endian.h +mc-code-mips.o: conv/conv.h mc-code.h mc-codegen.h diff -r 0f36fdbcba9b -r f8271009a314 mc-code-mips.c --- a/mc-code-mips.c Mon Jul 14 07:56:26 2003 +0900 +++ b/mc-code-mips.c Mon Jul 14 14:05:20 2003 +0900 @@ -630,7 +630,7 @@ for(i=0;i < ... */ + creg = use_int(creg); xrn = register_name(creg); printf("\tli %s,0\n",xrn); jmp(e3=fwdlabel()); @@ -1078,31 +1083,31 @@ char * code_gt(int cond) { - return (cond?"\tslt %s,%s,%s\n\tbeq %s,$0,%s\n": - "\tslt %s,%s,%s\n\tbne %s,$0,%s\n"); + return (cond?"\tslt %s,%s,%s\n\tbeq %s,$0,L%d\n": + "\tslt %s,%s,%s\n\tbne %s,$0,L%d\n"); } char * code_ugt(int cond) { - return (cond?"\tsltu %s,%s,%s\n\tbeq %s,$0,%s\n": - "\tsltu %s,%s,%s\n\tbne %s,$0,%s\n"); + return (cond?"\tsltu %s,%s,%s\n\tbeq %s,$0,L%d\n": + "\tsltu %s,%s,%s\n\tbne %s,$0,L%d\n"); } char * code_ge(int cond) { - return (cond?"\tslt %s,%s,%s\n\txori %s,%s,0x1\n\tbeq %s,$0,%s\n": - "\tslt %s,%s,%s\n\txori %s,%s,0x1\n\tbne %s,$0,%s\n"); + return (cond?"\tslt %s,%s,%s\n\txori %s,%s,0x1\n\tbeq %s,$0,L%d\n": + "\tslt %s,%s,%s\n\txori %s,%s,0x1\n\tbne %s,$0,L%d\n"); } char * code_uge(int cond) { - return (cond?"\tsltu %s,%s,%s\n\txori %s,%s,0x1\n\tbeq %s,$0,%s\n": - "\tsltu %s,%s,%s\n\txori %s,%s,0x1\n\tbne %s,$0,%s\n"); + return (cond?"\tsltu %s,%s,%s\n\txori %s,%s,0x1\n\tbeq %s,$0,L%d\n": + "\tsltu %s,%s,%s\n\txori %s,%s,0x1\n\tbne %s,$0,L%d\n"); } char * code_eq(int cond) { - return (cond?"\tbeq %s,%s,%s\n":"\tbne %s,%s,%s\n"); + return (cond?"\tbeq %s,%s,L%d\n":"\tbne %s,%s,L%d\n"); } void @@ -1299,7 +1304,7 @@ if (!is_int_reg(reg)) error(-1); if (reg!=creg) { if (reg!=ireg && mode) - printf("\tmove %s,%s\n",register_name(reg),register_name(creg)); + printf("\tmove %s,%s\n",register_name(reg),register_name(ireg)); free_register(creg); creg = ireg = reg; regs[creg]=1; @@ -1431,7 +1436,7 @@ int function(int e1) { - int e2,e3,e4,e5,nargs,t,r0,r1; + int e2,e3,e4,nargs,t; int arg,reg_arg,freg_arg,arg_assign; int dots; int reg_arg_list=0,ret_type,special_lvar; @@ -1493,33 +1498,6 @@ nargs ++ ; reg_arg++; continue; } else if (t==DOUBLE||t==FLOAT) { - if (reg_arg=MAX_INPUT_DREGISTER_VAR) { arg = list2(LVAR,caller_arg_offset_v(nargs)); } else if (!simple_args(e3) && cadr(e3)) { @@ -1840,6 +1818,7 @@ { /* used in dosiwtch() */ if(chk) return; + creg = use_int(creg); printf("\tli %s,%d\n",register_name(creg),e); cmpreg = csreg; regv[cmpreg]=2; /* prevent from freeing */ @@ -1882,7 +1861,7 @@ g_expr(cadr(e1)); emit_push(); g_expr(caddr(e1)); - cmpreg = pop_register(); + cmpreg = emit_pop(0); crn = register_name(creg); drn = register_name(cmpreg); @@ -1906,8 +1885,10 @@ { if (chk) return; if (cmpreg==-1) error(-1); - printf("\tb%s %s,%s,L_%d\n",register_name(creg),register_name(cmpreg), - cond?"ne":"eq",l); + printf("\tb%s %s,%s,L_%d\n", + cond?"ne":"eq", + register_name(creg),register_name(cmpreg), + l); if (regv[cmpreg]==1) { free_register(cmpreg); cmpreg = -1; } @@ -2463,7 +2444,7 @@ code_save_stacks(); set_creg(RET_REGISTER,1); printf("\tjal litodp\n"); - set_freg(RET_DREGISTER,0); + set_dreg(RET_DREGISTER,0); regv[freg]=1; regv[creg]=0; } diff -r 0f36fdbcba9b -r f8271009a314 mc.h --- a/mc.h Mon Jul 14 07:56:26 2003 +0900 +++ b/mc.h Mon Jul 14 14:05:20 2003 +0900 @@ -60,9 +60,9 @@ #define FLOAT (-47) #define DOUBLE (-48) -#define DREGISTER (REGISTER+DOP) -#define FREGISTER (REGISTER+FOP) -#define LONGLONG (-50) +#define LONGLONG (-49) +#define FREGISTER (-50) +#define DREGISTER (-51) #define EMPTY (-99)