Mercurial > hg > CbC > old > device
changeset 419:5fafb50df9d4
fix mips memmove
author | kono |
---|---|
date | Wed, 27 Oct 2004 09:04:07 +0900 |
parents | c73f013d07d7 |
children | efbd420386c5 |
files | Changes mc-code-arm.c mc-code-mips.c mc-codegen.c |
diffstat | 4 files changed, 39 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Mon Oct 25 19:16:17 2004 +0900 +++ b/Changes Wed Oct 27 09:04:07 2004 +0900 @@ -6263,3 +6263,27 @@ してしまうらしい。goto 時に。で、戻ったときにerrorとなる。 register は全部、save するので、差はわかっているので、それを 足せば良いだけだけどね。(これ、前もやったな...) + +Mon Oct 25 19:36:16 JST 2004 + +なんか、できた。 + +まだ、レジスタ分のオフセットがcode_segmentで取られるのは直してない。 +ARM の bit field の穴塞ぎもね。 + +あとは、 + inline + CbC2C + C2CbC +だけだね。 + +Wed Oct 27 08:48:37 JST 2004 + +MIPSのallocaは、$spを移動するので、j の後の、code segement の + lw $gp,$L_41($sp) +はまずい。が、通常は、 + lw $gp,$L_41($fp) +が出る。だから、alloca で$gpを移動する必要はない。しかし、code_segment +で alloca は使えない。$gp をswしなおせば? + +
--- a/mc-code-arm.c Mon Oct 25 19:16:17 2004 +0900 +++ b/mc-code-arm.c Wed Oct 27 09:04:07 2004 +0900 @@ -1895,7 +1895,6 @@ char *frn; char *trn; char *drn; - int fix = 0; char *memmove = "memmove"; int dreg = REG_ip; @@ -1947,12 +1946,11 @@ code_save_stacks(); parallel_rassign(list3(1,list3(2,0,from),to)); code_const(length>0?length:-length,3); - /* overrap must be allowed */ + /* overlap must be allowed */ inc_inst(1); // offset have to be ignored */ printf("\tbl\t%s\n",memmove); extern_define(memmove,0,FUNCTION,1); - fix=0; set_ireg(RET_REGISTER,0); if (creg!=to) { free_register(to); to = creg; @@ -1963,7 +1961,6 @@ /* creg must point top of the destination data */ /* this code is necessary for the value of assignment or function call */ /* otherwise we don't need this */ - if (fix) code_add(to,fix,to); if(creg!=to) { free_register(creg); creg=to; ireg=to; }
--- a/mc-code-mips.c Mon Oct 25 19:16:17 2004 +0900 +++ b/mc-code-mips.c Wed Oct 27 09:04:07 2004 +0900 @@ -365,6 +365,8 @@ round16(max_func_args*SIZE_OF_INT), 0 ); +#endif +#if 0 printf("# mask_label $L_%d=0x%x\n",mask_label,code_mask()); printf("# mask_offset$L_%d=%d\n",mask_offset_label,code_mask_offset()); printf("# fmask_label $L_%d=0x%x\n",fmask_label,code_fmask()); @@ -1535,7 +1537,6 @@ char *frn; char *trn; char *drn; - int fix = 0; char *memmove = "memmove"; int dreg = get_register(); if (!dreg) error(-1); @@ -1587,9 +1588,14 @@ // offset should not be used printf("\tmove $4,%s\n",trn); /* overrap must be allowed */ - printf("\tjal %s\n",memmove); + if (fnptr->sc==CODE) { + printf("\tla\t$25,%s\n",memmove); + printf("\tjalr\t$25\n"); + printf("\tlw\t$gp,$L_%d($sp)\n",cprestore_label); + } else { + printf("\tjal %s\n",memmove); + } extern_define(memmove,0,FUNCTION,1); - fix=0; set_ireg(RET_REGISTER,0); if (creg!=to) { free_register(to); to = creg; @@ -1600,7 +1606,6 @@ /* creg must point top of the destination data */ /* this code is necessary for the value of assignment or function call */ /* otherwise we don't need this */ - if (fix) printf("\taddu %s,%s,%d\n",trn,trn,fix); if(creg!=to) { free_register(creg); creg=to; ireg=to; } @@ -2270,17 +2275,16 @@ void code_alloca(int e1,int reg) { - char *crn,*grn; - int g; + char *crn; g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); use_int(reg); - g = get_register(); crn = register_name(reg); - grn = register_name(g); printf("\tsubu $sp,$sp,%s\n",crn); printf("\taddu %s,$sp,$L_%d\n",crn,cprestore_label); - free_register(g); + if (fnptr->sc==CODE) { + printf("\tsw\t$gp,$L_%d($sp)\n",cprestore_label); + } } void
--- a/mc-codegen.c Mon Oct 25 19:16:17 2004 +0900 +++ b/mc-codegen.c Wed Oct 27 09:04:07 2004 +0900 @@ -854,7 +854,7 @@ /* source (after) list2(tag,disp) */ /* source list list3(e,cdr,sz) */ -#define DEBUG_PARALLEL_ASSIGN 2 +#define DEBUG_PARALLEL_ASSIGN 0 static int overlap(int t,int sz,int source)