# HG changeset patch # User kono # Date 1137554808 -32400 # Node ID a5b902b20300a8994c5a8a2eca14828d6e250718 # Parent ef6e0e05137fb69edb665e227dcd4fbfda6e86c7 ia32 reconfigure end (correct?) diff -r ef6e0e05137f -r a5b902b20300 Changes --- a/Changes Wed Jan 18 02:16:53 2006 +0900 +++ b/Changes Wed Jan 18 12:26:48 2006 +0900 @@ -8508,3 +8508,12 @@ 酒飲んでないけど、頭が廻らん。 +Wed Jan 18 11:42:18 JST 2006 + +あと、もう少し。code-stringの後の .text のalignはいらんだろ。 + +なんか、creg に reg_var を割り振るように直してしまったが、 +だいたい動いているんだけど、かなり怪しい。その方がコード +は良いんだが.... これは read only creg なんだよね。 + + diff -r ef6e0e05137f -r a5b902b20300 mc-code-ia32.c --- a/mc-code-ia32.c Wed Jan 18 02:16:53 2006 +0900 +++ b/mc-code-ia32.c Wed Jan 18 12:26:48 2006 +0900 @@ -268,7 +268,7 @@ #define REG_EDI 6 #define REG_EBP 7 #define REG_ESP 8 -#define is_int_reg(reg) (1<=reg&®0) { - + edx = get_register(); crn = register_name(reg,0); drn = register_name(edx,0); printf("\tmovl %%esp,%s\n",drn); printf("\tsubl %s,%%esp\n",crn); printf("\tmovl %%esp,%s\n",crn); + free_register(edx); emit_copy(edx,creg,stack_depth,0,1,1); printf("\taddl $%d,%s\n",stack_depth,register_name(creg,0)); @@ -1594,24 +1599,6 @@ emit_pop_free(xreg); } -#if 0 - int xreg; - int edx; - use_int(reg); - xreg = emit_pop(0); /* pop e3 value */ - regs[xreg]=1; - edx = get_register(); - printf("\tmovl %s,%s # assop \n",register_name(reg,0),register_name(edx,0)); - ld_indexx(byte,0,edx,reg,sign); - tosop(op,reg,xreg); - printf("\t%s %s,(%s)\n",move(byte),register_name(reg,byte),register_name(edx,0)); - - emit_pop_free(xreg); - free_register(edx); -} -#endif - - void tosop(int op,int reg,int oreg) { @@ -1619,6 +1606,9 @@ char *orn,*crn; // creg = creg op oreg +#if 0 + int q; +#endif use_int(reg); if(oreg==-1) { @@ -1669,13 +1659,20 @@ break; case DIV: case UDIV: +#if 0 + q = list3(REG_EAX,0,reg); + q = list3(REG_ECX,q,oreg); + parallel_rassign(q); + orn = "%ecx"; +#else use_register(reg,REG_EAX,1); if (oreg==REG_EAX) oreg=reg; - else if (oreg==REG_EDX) { + if (oreg==REG_EDX) { use_register(oreg,REG_ECX,1); oreg = REG_ECX; } orn = register_name(oreg,0); +#endif if (op==DIV) printf("\tcltd\n\tidivl %s\n",orn); else @@ -1685,13 +1682,20 @@ break; case MOD: case UMOD: +#if 0 + q = list3(REG_EAX,0,reg); + q = list3(REG_ECX,q,oreg); + parallel_rassign(q); + orn = "%ecx"; +#else use_register(reg,REG_EAX,1); if (oreg==REG_EAX) oreg=reg; - else if (oreg==REG_EDX) { + if (oreg==REG_EDX) { use_register(oreg,REG_ECX,1); oreg = REG_ECX; } orn = register_name(oreg,0); +#endif if (op==MOD) printf("\tcltd\n\tidivl %s\n",orn); else @@ -1700,7 +1704,7 @@ set_ireg(reg,1); break; } - if(ox) free_register(ox); + if(ox && ox!=ireg) free_register(ox); } int @@ -1814,7 +1818,7 @@ code_cmpdimm(int e, int csreg,int label,int cond) { /* used in dosiwtch() */ - use_register(creg,csreg,0); + set_ireg(csreg,0); printf("\tcmpl $%d,%s\n",e,register_name(creg,0)); jcond(label,cond); } @@ -2020,6 +2024,12 @@ use_longlong(reg); return reg; } else { + if (reg==USE_CREG) { + if (regs[CREG_REGISTER]==0) { + set_ireg(CREG_REGISTER,is_int_reg(creg)&®s[creg]==USING_REG); + return CREG_REGISTER; + } + } use_int(reg); return reg; } @@ -2030,7 +2040,7 @@ if (type==FLOAT||type==DOUBLE) { } else if (type==LONGLONG||type==ULONGLONG) { } else { - use_register(creg,reg,mode); + set_ireg(reg,mode); } } diff -r ef6e0e05137f -r a5b902b20300 mc-inline.c --- a/mc-inline.c Wed Jan 18 02:16:53 2006 +0900 +++ b/mc-inline.c Wed Jan 18 12:26:48 2006 +0900 @@ -412,6 +412,7 @@ extern void st_comment(int e1){ glineno++; + printf("## %d ",glineno); gen_comment((char *)caddr(e1)); }