# HG changeset patch # User kono # Date 1090121190 -32400 # Node ID c7abd48191b37dab8fa8e69692fe41e029650c15 # Parent b3c6c479c5223b81ff4dea5fdfd60570072902fb ARM continue... diff -r b3c6c479c522 -r c7abd48191b3 Changes --- a/Changes Wed Jul 14 14:37:37 2004 +0900 +++ b/Changes Sun Jul 18 12:26:30 2004 +0900 @@ -5857,3 +5857,22 @@ ってなんだ? せっかく作ったのに? +ちょっとバグってました。でも、なんでだろう? logic miss がある? + +drexpr_bool for MIPS は作ってないみたいね。long long はさすがに +大変そうだし。 + +double/long long の定数だけどさ、 + local const table に連続して入れる + 大域領域に初期化して、そこへのポインタをlocal const table に入れる +でいいんだけど... 前者だと、searchがめんどい。後者だと、double load +になるので、なんか嫌。たまたま一致した0を使えないのもなんかね。 + +adr なんて言うのがあるのか。adr して ldmia ってなんか変。mvfs #0 +なんてのがあるのか。0,1,10 があるのがわかるけど... + +float の switch ってあるの? + +(はぁ、めんどくさい... 一週間かかってるし...) + + diff -r b3c6c479c522 -r c7abd48191b3 mc-code-arm.c --- a/mc-code-arm.c Wed Jul 14 14:37:37 2004 +0900 +++ b/mc-code-arm.c Sun Jul 18 12:26:30 2004 +0900 @@ -8,10 +8,9 @@ #include "mc-code.h" #include "mc-codegen.h" -#define Linux_Zaurus 1 -#define GameBoyAdvance 2 - -int arch_mode = Linux_Zaurus; +#define UseFPP 1 + +int arch_mode = UseFPP; char **l_include_path[]; @@ -61,7 +60,6 @@ static int freg,ireg,lreg; -static int cmpreg; int code_lassop_p = 1; @@ -177,9 +175,9 @@ char *lh(i) { return lregister_name_high(i); } #define is_int_reg(i) (0reg_var_num(reg_save);i--) { - printf("\tsw %s,$L_%d-%d($sp)\n",register_name(i), + printf("\tstr\t%s, [sp, #%d]\n",register_name(i), r1_offset_label,-disp); disp -= SIZE_OF_INT; } @@ -3402,7 +3395,7 @@ static void comm(NMTBL *n) { - printf(".comm %s,%d,%d\n",n->nm,size(n->ty), + printf(".comm %s,%d @ %d\n",n->nm,size(n->ty), (n->ty==DOUBLE||n->ty==LONGLONG||n->ty==ULONGLONG)?8:4 ); } @@ -3427,7 +3420,7 @@ data_mode(0); init=1; } - printf(".local %s\n",n->nm); + // printf(".local %s\n",n->nm); comm(n); } } @@ -3502,83 +3495,132 @@ code_cmp_dregister(int e2,int d,int label,int cond) { char *grn,*frn; - int greg; + int greg,cmpreg; use_float(d,e2); - if (d) { + if (!(arch_mode&UseFPP)) { code_save_stacks(); clear_ptr_cache(); - set_dreg(DREGISTER_OPERAND,0); - dconst(DREGISTER_OPERAND_1_L,DREGISTER_OPERAND_1_H,0.0); - extern_conv("dpcmp"); - set_dreg(RET_DREGISTER,0); - cmpreg = 2; + if (d) { + set_dreg(DREGISTER_OPERAND,0); + dconst(DREGISTER_OPERAND_1_L,DREGISTER_OPERAND_1_H,0.0); + extern_conv("__nedf2"); + printf("\tcmp\tr0, #0\n"); + } else { + set_freg(FREGISTER_OPERAND,0); + fconst(REGISTER_OPERAND,0.0); + extern_conv("__nesf2"); + printf("\tcmp\tr0, #0\n"); + } } else { grn = register_name(greg = get_dregister(d)); frn = register_name(e2); - printf("\tmtc1 $0,%s\n",grn); - printf("\tc.eq.s %s,%s\n",grn,frn); + printf("\tcmf\t%s, #0\n",grn); free_register(greg); - cmpreg = CMP_C1T; } jcond(label,cond); return; } +static char * +movef(int d) +{ + return d?"mvfd":mvfs"; +} + +static char * +storef(int d) +{ + return d?"stfd":stfs"; +} + +static char * +loadf(int d) +{ + return d?"ldfd":ldfs"; +} + + void code_dregister(int e2,int freg,int d) { use_float(d,freg); - if (d) { - code_lregister(e2,freg); set_double(freg); return; - } - if (freg!=e2) { - if (is_int_reg(e2)) error(-1); - printf("\tmov.s %s,%s\n",fregister_name(freg),fregister_name(e2)); + if (!(arch_mode&UseFPP)) { + if (d) { + code_lregister(e2,freg); set_double(freg); return; + } else { + code_register(e2,freg); set_float(freg); return; + } + } else { + if (freg!=e2) { + if (is_int_reg(e2)) error(-1); + printf("\t%s\t%s,%s\n",movef(d), + fregister_name(freg),fregister_name(e2)); + } } } void code_dassign_gvar(int e2,int freg,int d) { - if (d) { - code_lassign_gvar(e2,freg); set_double(freg); return; + if (!(arch_mode&UseFPP)) { + if (d) { + code_lassign_gvar(e2,freg); set_double(freg); return; + } else { + code_assign_gvar(e2,freg); set_float(freg); return; + } + } else { + use_float(d,freg); + code_ldf(storef(d),fregister_name(freg),cadr(e2), + get_ptr_cache((NMTBL*)caddr(e2))," @ float"); } - use_float(d,freg); - code_ldf("s.s",fregister_name(freg),cadr(e2), - get_ptr_cache((NMTBL*)caddr(e2))); } void code_dassign_lvar(int e2,int freg,int d) { - if (d) { - code_lassign_lvar(e2,freg); set_double(freg); return; + if (!(arch_mode&UseFPP)) { + if (d) { + code_lassign_lvar(e2,freg); set_double(freg); return; + } else { + code_assign_lvar(e2,freg); set_float(freg); return; + } + } else { + use_float(d,freg); + lvar_intro(e2); + printf("\t%s\t%s,",fstore(d),fregister_name(freg)); + lvar(e2,"@ float"); } - use_float(d,freg); - lvar_intro(e2); - printf("\ts.s %s,",fregister_name(freg)); - lvar(e2,""); } void code_dassign(int e2,int freg,int d) { - if (d) { - code_lassign(e2,freg); set_double(freg); return; + if (!(arch_mode&UseFPP)) { + if (d) { + code_lassign(e2,freg); set_double(freg); return; + } else { + code_assign(e2,freg); set_float(freg); return; + } } use_float(d,freg); - printf("\ts.s %s,0(%s)\n",fregister_name(freg),register_name(e2)); + printf("\t%s\t%s,0(%s) @ float\n",fstore(d), + fregister_name(freg),register_name(e2)); } void code_dassign_dregister(int e2,int d,int freg) { - if (d) { - code_lassign_lregister(e2,freg); set_double(freg); return; + if (!(arch_mode&UseFPP)) { + if (d) { + code_lassign_lregister(e2,freg); set_double(freg); return; + } else { + code_assign_register(e2,freg); set_float(freg); return; + } } use_float(d,freg); if (e2!=freg) { - printf("\tmov.s %s,%s\n",fregister_name(e2),fregister_name(freg)); + printf("\t%s\t%s,%s\n",movef(d), + fregister_name(e2),fregister_name(freg)); } } @@ -3610,26 +3652,54 @@ dconst(int l,int h,double value) { #if ENDIAN==0 - printf("\tli %s,0x%x\n",register_name(l),code_d1(value)); - printf("\tli %s,0x%x\n",register_name(h),code_d2(value)); + code_const(code_d1(value),l); + code_const(code_d2(value),h); #else - printf("\tli %s,0x%x\n",register_name(h),code_d1(value)); - printf("\tli %s,0x%x\n",register_name(l),code_d2(value)); + code_const(code_d1(value),h); + code_const(code_d2(value),l); #endif } +static void +fconst(int reg,double value) +{ + float f = value; + code_const(*((int*)f),reg); +} + void code_dconst(int e2,int freg,int d) { double value = dcadr(e2); char *frn; + int label,disp; use_float(d,freg); - if (d) { - dconst(regv_l(freg),regv_h(freg),value); + if (!(arch_mode&UseFPP)) { + if (d) { + dconst(regv_l(freg),regv_h(freg),value); + } else { + code_const0(*((int*)f),freg,"\t@ float"); + } } else { - frn = fregister_name(freg); - printf("\tli.s %s,%10.10g\n",frn,value); + frn = register_name(freg); + if (value==0 || value==1 || value==10) { + printf("\t%s\t%s, #%d\n",movef(d),(int)value); + } else if (value==-1 || value==-10) { + printf("\t%s\t%s, #%d\n",d?"mnfd":"mnfs",(int)-value); + } else if (d) { +#if ENDIAN==0 + disp = search_double_const(DCONST, + code_d1(value),code_d2(value),&label); +#else + disp = search_double_const(DCONST, + code_d2(value),code_d1(value),&label); +#endif + disp = printf("\tldfd\t%s, .L%d+%d\n",frn,label,disp); + } else { + disp = search_const(CONST,*((int*)f),freg,&label); + printf("\tldfs\t%s, .L%d+%d\n",frn,label,disp); + } } } @@ -3639,19 +3709,26 @@ { char *frn; use_float(d,freg); - if (d) { - code_save_stacks(); - clear_ptr_cache(); - set_dreg(DREGISTER_OPERAND_1,1); - printf("\tmove $4,$0\n"); - printf("\tmove $5,$0\n"); - /// set_dreg_operand(oreg,1); - extern_conv("dpsub"); - set_dreg(RET_DREGISTER,0); - return; + if (!(arch_mode&UseFPP)) { + if (d) { + code_save_stacks(); + clear_ptr_cache(); + set_dreg(DREGISTER_OPERAND_1,1); + extern_conv("__negdf2"); + set_dreg(RET_DREGISTER,0); + return; + } else { + code_save_stacks(); + clear_ptr_cache(); + set_dreg(FREGISTER_OPERAND,1); + extern_conv("__negsf2"); + set_dreg(RET_FREGISTER,0); + return; + } + } else { + frn = fregister_name(freg); + printf("\t%s\t%s, %s\n",d?"mnfd":"mnfs",frn,frn); } - frn = fregister_name(freg); - printf("\tneg.s %s,%s\n",frn,frn); } void @@ -3862,7 +3939,7 @@ code_cmp_drgvar(int e2,int reg,int d,int label,int cond) { char *frn,*fr1; - int g; + int g,cmpreg; use_float(d,reg); if (d) { @@ -3890,7 +3967,7 @@ code_cmp_drlvar(int e2,int reg,int d,int label,int cond) { char *frn,*fr1; - int g; + int g,cmpreg; use_float(d,reg); if (d) { diff -r b3c6c479c522 -r c7abd48191b3 mc-code-mips.c --- a/mc-code-mips.c Wed Jul 14 14:37:37 2004 +0900 +++ b/mc-code-mips.c Sun Jul 18 12:26:30 2004 +0900 @@ -2818,7 +2818,6 @@ { int e2,reg0; int op = car(e1); -return 0; if (!( op== GT || op== LT || op== UGT || op== ULT || op== ULE || op== UGE || op== LE || op== GE || @@ -2830,7 +2829,7 @@ e2 = emit_pop(1); reg0 = ireg; use_int(reg); - pcond(op, reg,e2,reg0,1,0,COND_VALUE); + pcond(op, reg,e2,reg0,0,0,COND_VALUE); emit_pop_free(e2); return 1; } diff -r b3c6c479c522 -r c7abd48191b3 mc-codegen.c --- a/mc-codegen.c Wed Jul 14 14:37:37 2004 +0900 +++ b/mc-codegen.c Sun Jul 18 12:26:30 2004 +0900 @@ -554,7 +554,8 @@ case FOP+GT: case FOP+GE: case FOP+LT: case FOP+LE: case FOP+EQ: case FOP+NEQ: case EQ: case NEQ: case DOP+EQ: case DOP+NEQ: - if ((car(caddr(e1))==CONST||(car(caddr(e1))==DCONST))) { + if (car(caddr(e1))==CONST||(car(caddr(e1))==DCONST)|| + car(caddr(e1))==FCONST) { b_expr(list3(rop_dual(op),caddr(e1),cadr(e1)),cond,l1,0); return; } diff -r b3c6c479c522 -r c7abd48191b3 mc-parse.c --- a/mc-parse.c Wed Jul 14 14:37:37 2004 +0900 +++ b/mc-parse.c Sun Jul 18 12:26:30 2004 +0900 @@ -2434,7 +2434,7 @@ e=rvalue(expr13()); #if FLOAT_CODE if(type==FLOAT) { - return(car(e)==DCONST?dlist2(DCONST,-dcadr(e)):list2(FMINUS,e)); + return(car(e)==FCONST?dlist2(FCONST,-dcadr(e)):list2(FMINUS,e)); } else if(type==DOUBLE) { return(car(e)==DCONST?dlist2(DCONST,-dcadr(e)):list2(DMINUS,e)); } @@ -2462,7 +2462,7 @@ e=rvalue(expr13()); type=INT; #if FLOAT_CODE - if (car(e)==DCONST) return list2(CONST,!dcadr(e)); + if (car(e)==DCONST||car(e)==FCONST) return list2(CONST,!dcadr(e)); #endif #if LONGLONG_CODE if (car(e)==LCONST) return list2(CONST,!lcadr(e)); @@ -2675,6 +2675,12 @@ getsym(0); break; #if FLOAT_CODE + case FCONST: + conv-> const_(symval); + type= FLOAT; + e1=dlist2(FCONST,dsymval); + getsym(0); + break; case DCONST: conv-> const_(symval); type= DOUBLE; diff -r b3c6c479c522 -r c7abd48191b3 stdio.h --- a/stdio.h Wed Jul 14 14:37:37 2004 +0900 +++ b/stdio.h Sun Jul 18 12:26:30 2004 +0900 @@ -1,5 +1,4 @@ -#define __micro_c__ 1 -#ifndef __micro_c__ +#ifndef __micro_c__aaa #include "/usr/include/stdio.h" long long strtoll(const char *, char **, int); char *malloc(int); diff -r b3c6c479c522 -r c7abd48191b3 test/float.c --- a/test/float.c Wed Jul 14 14:37:37 2004 +0900 +++ b/test/float.c Sun Jul 18 12:26:30 2004 +0900 @@ -35,6 +35,20 @@ return (double)u; } +double +f2d(float u) { + double u1; + u1 = f1; + return (double)u; +} + +float +d2f(double u) { + float u1; + u1 = d1; + return (float)u; +} + int main(int ac,char *av[]) { double g;