# HG changeset patch # User kono # Date 1082658421 -32400 # Node ID 32f54ab63b35ec083c1ba98d1cb8961da231ef2f # Parent dbad3172fa14aefec894f9cab9e47ada99df03b8 *** empty log message *** diff -r dbad3172fa14 -r 32f54ab63b35 Changes --- a/Changes Fri Apr 23 03:27:01 2004 +0900 +++ b/Changes Fri Apr 23 03:27:01 2004 +0900 @@ -3944,6 +3944,12 @@ Thu Apr 22 12:33:04 JST 2004 +ようやっと、int/float が元に戻りました。 + lrexpr は、codegen で、long の計算に置き換えた方がいい? でも、それだと、64bit 演算をサポートしているCPUがうれしく ないか。 + +あと、もう少し! でも、2,3日かかりそう。 +loprtc も、あった方がいいんじゃない? (まね....) + diff -r dbad3172fa14 -r 32f54ab63b35 mc-code-ia32.c --- a/mc-code-ia32.c Fri Apr 23 03:27:01 2004 +0900 +++ b/mc-code-ia32.c Fri Apr 23 03:27:01 2004 +0900 @@ -2153,7 +2153,7 @@ } -void code_lneg(int e1,int e2) +void code_lneg(int e1) { } diff -r dbad3172fa14 -r 32f54ab63b35 mc-code-mips.c --- a/mc-code-mips.c Fri Apr 23 03:27:01 2004 +0900 +++ b/mc-code-mips.c Fri Apr 23 03:27:01 2004 +0900 @@ -2822,7 +2822,7 @@ } -void code_lneg(int e1,int e2) +void code_lneg(int e1) { } diff -r dbad3172fa14 -r 32f54ab63b35 mc-code-powerpc.c --- a/mc-code-powerpc.c Fri Apr 23 03:27:01 2004 +0900 +++ b/mc-code-powerpc.c Fri Apr 23 03:27:01 2004 +0900 @@ -3449,7 +3449,7 @@ emit_lpush() { int new_reg; - if (!is_longlong(creg)) error(-1); + if (!is_longlong_reg(creg)) error(-1); if (lreg_sp>MAX_MAX) error(-1); new_reg = get_lregister(); lreg_stack[lreg_sp++] = creg; /* push するかわりにレジスタを使う */ @@ -3572,7 +3572,7 @@ code_lpreinc(int e1,int e2,int reg) { char *xrn,*drn_h,*drn_l; - int i,dreg; + int dreg; int dir=caddr(e1); if (car(e2)==LREGISTER) { printf("\taddci %s,%s,%d\n", @@ -3595,10 +3595,10 @@ printf("\tlzw %s,%d(%s)\n",drn_l,size_of_int,xrn); printf("\tlzw %s,0(%s)\n",drn_h,xrn); printf("\taddci %s,%s,%d\n",drn_l,drn_l,dir); - printf("\taddei %s,%s,0\n",drn_h,drn_h,dir); + printf("\taddei %s,%s,0\n",drn_h,drn_h); printf("\tstw %s,%d(%s)\n",drn_l,size_of_int,xrn); printf("\tstw %s,0(%s)\n",drn_h,xrn); - set_lreg(dreg); + set_lreg(dreg,0); } void @@ -3606,7 +3606,7 @@ { char *xrn,*drn_h,*drn_l; char *nrn_h,*nrn_l; - int i,dreg,nreg; + int dreg,nreg; int dir=caddr(e1); if (car(e2)==LREGISTER) { printf("\tmr %s,%s\n",lregister_name_low(cadr(reg)), @@ -3630,11 +3630,11 @@ printf("\tlzw %s,%d(%s)\n",drn_l,size_of_int,xrn); printf("\tlzw %s,0(%s)\n",drn_h,xrn); printf("\taddci %s,%s,%d\n",nrn_l,drn_l,dir); - printf("\taddei %s,%s,0\n",nrn_h,drn_h,dir); + printf("\taddei %s,%s,0\n",nrn_h,drn_h); printf("\tstw %s,%d(%s)\n",nrn_l,size_of_int,xrn); printf("\tstw %s,0(%s)\n",nrn_h,xrn); free_register(nreg); - set_lreg(dreg); + set_lreg(dreg,0); } void @@ -3688,6 +3688,15 @@ } } #endif +#if LONGLONG_CODE + for(i=0;i=0) { + code_assign_lvar( + (lreg_stack[i]=new_lvar(size_of_longlong)),reg,0); + lreg_stack[i]= lreg_stack[i]-REG_LVAR_OFFSET; + } + } +#endif } void diff -r dbad3172fa14 -r 32f54ab63b35 mc-code.h --- a/mc-code.h Fri Apr 23 03:27:01 2004 +0900 +++ b/mc-code.h Fri Apr 23 03:27:01 2004 +0900 @@ -163,7 +163,7 @@ extern void code_lassign_lvar(int,int); extern void code_lassign_lregister(int e2,int reg); extern void code_lconst(int,int); -extern void code_lneg(int,int); +extern void code_lneg(int); extern void code_lrgvar(int,int); extern void code_lrlvar(int,int); extern void ltosop(int,int); diff -r dbad3172fa14 -r 32f54ab63b35 mc-codegen.c --- a/mc-codegen.c Fri Apr 23 03:27:01 2004 +0900 +++ b/mc-codegen.c Fri Apr 23 03:27:01 2004 +0900 @@ -267,6 +267,11 @@ case MINUS: /* レジスタに対し、neglを実行すれば実現可能 */ g_expr0(e2); code_neg(creg); return INT; +#if LONGLONG_CODE + case LMINUS: + g_expr0(e2); code_lneg(creg); + return LONGLONG; +#endif #if FLOAT_CODE case DMINUS: g_expr0(e2); code_dneg(creg,1); diff -r dbad3172fa14 -r 32f54ab63b35 mc.h --- a/mc.h Fri Apr 23 03:27:01 2004 +0900 +++ b/mc.h Fri Apr 23 03:27:01 2004 +0900 @@ -11,7 +11,7 @@ #endif #define FLOAT_CODE 1 -#define LONGLONG_CODE 0 +#define LONGLONG_CODE 1 #define SIZE_INT 4