Mercurial > hg > CbC > old > device
diff mc-code-spu.c @ 680:f536897fa3cb
*** empty log message ***
author | kono |
---|---|
date | Sun, 29 Jul 2007 23:09:38 +0900 |
parents | 7c42cf329666 |
children | e5a498eab0f4 |
line wrap: on
line diff
--- a/mc-code-spu.c Fri May 25 19:28:25 2007 +0900 +++ b/mc-code-spu.c Sun Jul 29 23:09:38 2007 +0900 @@ -91,6 +91,7 @@ static void dconst(int l,int h,double value); static void code_assign_input_double_long(int e1,int e2) ; +static void code_assign_input_double_reg(int e1,int e2) ; static void code_assign_input_float_int(int e1,int e2) ; #endif static void use_input_reg(int reg,int mode); @@ -483,23 +484,27 @@ lvar(int l,char *cext) { if (large_lvar) { - printf("[%s, 0]%s\n",register_name(large_lvar),cext); + //printf("[%s, 0]%s\n##lvar0\n",register_name(large_lvar),cext); + printf("0(%s)\n##lvar0\n",register_name(large_lvar)); free_register(large_lvar); return; } if (is_code(fnptr)) { if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - printf("[sp, %d]%s\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET),cext); - } else - printf("[fp, %d]%s\n",CODE_LVAR(l),cext); - } else if (l<0) { /* local variable */ - //printf("[fp, #%d+.L%d]%s\n",FUNC_LVAR(l),lvar_offset_label,cext); + //printf("[sp, %d]%s\n##lvar1\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET),cext); + printf("%d($sp)\n##lvar1\n",CODE_CALLER_ARG(l-ARG_LVAR_OFFSET)); + //} else + // printf("[fp, %d]%s\n",CODE_LVAR(l),cext); + printf("%d($sp)\n",CODE_LVAR(l)); + } + } else if (l<0) { /* local variable */ + //printf("[fp, #%d+.L%d]%s\n##lvar2\n",FUNC_LVAR(l),lvar_offset_label,cext); printf(".LC%d+%d($sp)\n",lvar_offset_label,FUNC_LVAR(l)); } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ - printf("[sp, %d]%s\n",CALLER_ARG(l-ARG_LVAR_OFFSET),cext); + printf("%d($sp)%s\n",CALLER_ARG(l-ARG_LVAR_OFFSET),cext); } else { /* callee's arguments */ - printf("[fp, %d]%s\n",CALLEE_ARG(l),cext); - } + printf("%d($sp)%s\n",CALLEE_ARG(l),cext); + } } static void @@ -518,8 +523,9 @@ // printf("\tsfi\t%s, fp, %d\n",register_name(creg), FUNC_LVAR(l)); trn = register_name(tmp = get_register()); //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(l)),&label); - printf("\tlqd\t%s, %d($sp)\n",trn,(disp*4)); - printf("\tadd\t%s, fp, %s\n",register_name(creg),trn); + //printf("\tlqdhoge\t%s, %d($sp)\n",trn,(disp*4)); + printf("\tlqd\t%s, 64($sp)\n",trn); + printf("\ta\t%s, $sp, %s\n",register_name(creg),trn); } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */ code_add(creg,CALLER_ARG(l-ARG_LVAR_OFFSET),REG_sp); } else { /* callee's arguments */ @@ -1246,7 +1252,7 @@ int disp; char *rrn = register_name(r); //disp = search_const(GVAR,(int)nptr,&label); - printf("\tlqd\t%s, %d($sp)\n",rrn,(disp*4)); + printf("\tlqd\t%s, %d($sp)\n",rrn,(nptr->sc)*16); } #define mask8(d,bit) (d & (255 << bit)) @@ -1362,8 +1368,8 @@ crn = register_name(reg); if ((s=make_const(e2,&p1,&p2,&p3,CONST))) { add = s>0?"a":"sf"; - mov = s>0?"il":"mvn"; - printf("\t%s\t%s, %d\n",mov,crn,p1); + mov = s>0?"il":"ori"; + printf("\t%s\t%s, %s, %d\n",mov,crn,crn,p1); if (p2) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p2); if (p3) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p3); } else { @@ -1397,17 +1403,17 @@ crn = register_name(reg); if (-32768<e2&&e2<32768) printf("\til %s,%d\n",crn,e2); - else if(32767<e2&&e2<262143) + else if(32767<e2&&e2<262144) printf("\tila %s,%d\n",crn,e2); else if(262143<e2) { - printf("\t ilhu %s,%d\n",crn,e2/16^4); - printf("\t iohl %s,%d\n",crn,e2%16^4); + printf("\t ilhu\t%s,%d\n",crn,e2/65536); + printf("\t iohl %s,%d\n",crn,e2%65536); } else { r = (~e2 >> 16) & 0xffff; r += 1; r = -r; - printf("\tilhu %s,%d\n",crn,r); - if(e2 > -262143) + printf("\tilhu\t%s,%d\n",crn,r); + if((e2&0xffff) > -262143) printf("\tiohl %s,%d\n",crn, (e2&0xffff)); else printf("\tori %s,%s,%d\n",crn,crn,(e2&0xffff)); @@ -1419,9 +1425,10 @@ { char *crn = register_name(reg); char *rrn = register_name(r); - char *drn; + char *rn2 = register_name(r+1); + char *drn; int dreg; - int s,p1,p2,p3; + int s,p1,p2,p3,h; char *add; //int label,disp; int disp; @@ -1429,10 +1436,30 @@ if(r!=reg) printf("\tori\t%s, %s, 0\n",crn,rrn); } else if ((s=make_const(offset,&p1,&p2,&p3,0))) { - add = s>0?"a":"sfi"; - printf("\t%s\t%s, %s, %d\n",add,crn,rrn,p1); - if (p2) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p2); - if (p3) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p3); + add = s>0?"a":"sf"; + //printf("\t%s\t%s, %s, %d\n",add,crn,rrn,p1); + if (-32768<(p1+p2+p3)&&(p1+p2+p3)<32768) + printf("\til\t%s,%d\n",rn2,(p1+p2+p3)); + else if( (p1+p2+p3) > 32767 && (p1+p2+p3) < 262144) + printf("\tila\t%s, %d\n",rn2,p1+p2+p3); + else if( (p1+p2+p3) > 262143) { + printf("\tilhu\t%s, %d\n",rn2,(p1+p2+p3)/65536); + printf("\tiohl\t%s, %d\n",rn2,(p1+p2+p3)%65536); + } else { + h = (~(p1+p2+p3) >> 16) & 0xffff; + h += 1; + h = -h; + printf("\tilhu\t%s,%d\n",crn,h); + if(((p1+p2)&0xffff) > -262143) + printf("\tiohl %s,%d\n",crn, ((p1+p2)&0xffff)); + else + printf("\tori %s,%s,%d\n",crn,crn,((p1+p2)&0xffff)); + + } + + printf("\t%s\t%s, %s, %s\n", add, crn, rrn ,rn2); + //if (p2) printf("\t%s\t%s, %s, %s\n",add,crn,rrn,rrn+1); + //if (p3) printf("\t%s\t%s, %s, %d\n",add,crn,crn,p3); } else { //disp = search_const(CONST,offset,&label); drn = register_name(dreg = get_register()); @@ -1449,33 +1476,32 @@ char *crn = register_name(reg); char *rrn = register_name(r); if (-1024<offset&&offset<1024) { - printf("\t%s\t%s, [%s, %d]%s\n",ld,crn,rrn,offset,cext); + printf("\t%s\t%s, %d(%s)\n",ld,crn,offset,rrn); } else { code_add(reg,offset,r); - printf("\t%s\t%s, [%s, 0]%s\n",ld,crn,crn,cext); + printf("\t%s\t%s, 0(%s) %s\n",ld,crn,crn,cext); } } static void code_ldf(char *ld,char *crn,int offset,int r,char *cext) { - //char *rrn = register_name(r); + char *rrn = register_name(r); char *orn; int reg; if (-1024<offset&&offset<1024) { - printf("\t%s\t%s, %d(%s)\n",ld,crn,(offset*4),cext); + printf("\t%s\t%s, %d(%s)\n",ld,crn,(offset*4),rrn); } else { orn = register_name(reg=get_register()); code_add(reg,offset,r); //printf("\t%s\t%s, [%s, 0]%s\n",ld,crn,orn,cext); - printf("hoge\n"); free_register(reg); } } #define cload(sz,sign) \ - (sz==1?(sign?"lqx":"lqa"):sz==SIZE_OF_SHORT?(sign?"lqx":"lqa"):"lqd") + (sz==1?(sign?"lqd":"lqd"):sz==SIZE_OF_SHORT?(sign?"lqd":"lqd"):"lqd") #define cext(sign,sz,reg) @@ -1531,7 +1557,7 @@ lvar_intro(e2); printf("\tlqd\t%s, ",register_name(reg)); e2 *= 4; - lvar(e2,""); + lvar(e2,""); } extern void @@ -1548,15 +1574,21 @@ code_u2uc(int reg) { use_int(reg); - printf("and\t%s, %s, #255\n",register_name(reg),register_name(reg)); + printf("\tandbi\t%s, %s, 255\n",register_name(reg),register_name(reg)); } extern void code_u2us(int reg) -{ +{ + // &! ということらしい、だけど16711680とかは使えない。よってilhuとかで16711680をレジスタに格納して + // and rt,rs,ra でandを行えば良いが、!はどうすんだ? use_int(reg); - printf("bic\t%s, %s, #16711680\n",register_name(reg),register_name(reg)); - printf("bic\t%s, %s, #-16777216\n",register_name(reg),register_name(reg)); + //printf("bic\t%s, %s, #16711680\n",register_name(reg),register_name(reg)); + printf("\tilhu\t%s,255\n", register_name(reg+1)); + printf("\tand\t%s,%s,%s\n",register_name(reg),register_name(reg),register_name(reg+1)); + //printf("bic\t%s, %s, #-16777216\n",register_name(reg),register_name(reg)); + printf("\tilhu\t%s,-256\n", register_name(reg+1)); + printf("\tand\t%s,%s,%s\n",register_name(reg),register_name(reg),register_name(reg+1)); } void @@ -1591,14 +1623,15 @@ void code_neg(int creg) { use_int(creg); - printf("\trsb\t%s, %s, #0\n", register_name(creg), register_name(creg)); + //printf("\trsb\t%s, %s, #0\n", register_name(creg), register_name(creg)); + printf("\tsfi\t%s, %s, 0\n", register_name(creg), register_name(creg)); } void code_not(int creg) { use_int(creg); - printf("\tmvn\t%s, %s\n", + printf("\tori\t%s, %s, 0\n", register_name(creg), register_name(creg)); } @@ -1607,9 +1640,10 @@ code_lnot(int creg) { use_int(creg); - printf("\tcmp\t%s, #0\n", register_name(creg)); - printf("\tmovne\t%s, #0\n", register_name(creg)); - printf("\tmoveq\t%s, #1\n", register_name(creg)); + //printf("\tcmp\t%s, #0\n", register_name(creg)); + printf("\tceqbi\t%s,%s,0\n",register_name(creg),register_name(creg)); + //printf("\tmovnehoge\t%s, #0\n", register_name(creg)); + //printf("\tmoveq\t%s, #1\n", register_name(creg)); } void @@ -1689,15 +1723,16 @@ /* save frame pointer */ if (is_code(fnptr)) { use_int(creg); - printf("\tmov\t%s, fp\n",register_name(creg)); - } else { + //printf("\tmov\t%s, fp\n",register_name(creg)); + printf("\tori\t%s, fp, 0\n",register_name(creg)); + } else { //int disp,label; int disp; char *trn = register_name(REG_ip); use_int(creg); //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(0)),&label); printf("\tlqa\t%s, %d\n",trn,disp); - printf("\ta\t%s, fp, %s\n",register_name(creg),trn); + printf("\ta\t%s, $sp, %s\n",register_name(creg),trn); } } @@ -1718,10 +1753,12 @@ if (use) { use_int(reg); xrn = register_name(reg); - printf("\tmov\t%s, #0\n",xrn); + //printf("\tmov\t%s, #0\n",xrn); + printf("\til\t%s, 0\n",xrn); gen_jmp(e3=fwdlabel()); fwddef(e2); - printf("\tmov\t%s, #1\n",xrn); + //printf("\tmov\t%s, #1\n",xrn); + printf("\til\t%s, 1\n",xrn); fwddef(e3); } else { fwddef(e2); @@ -1735,7 +1772,7 @@ code_ld(cload(sz,0),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)), cext_at(sz,0)); cext(0,sz,r); - printf("\tcmp\t%s, #0\n",register_name(reg)); + printf("\tceqi\t%s, %s, 0\n",register_name(reg), register_name(reg)); jcond(label,cond); } @@ -1746,7 +1783,7 @@ use_int(reg); crn = register_name(reg); lvar_intro(e2); - printf("\t%s\t%s, ",cload(sz,0),crn); + printf("\t%s\t%s,hoge2 ",cload(sz,0),crn); lvar(e2,cext_at(sz,0)); cext(0,sz,reg); code_cmp_register(reg,label,cond); @@ -1777,7 +1814,7 @@ void code_cmp_register(int e2,int label,int cond) { use_int(e2); - printf("\tcmp\t%s, #0\n",register_name(e2)); + printf("\tceqi\t%s, %s, 0\n",register_name(e2), register_name(e2)); jcond(label,cond); } @@ -1834,12 +1871,12 @@ printf("\tstqd\t%s,%d(%s)\n",drn,(offset*4),trn); break; case 2: case -2: - printf("\tlqx\t%s, [%s,#%d]\n",drn,frn,offset); - printf("\tstqx\t%s, [%s,#%d]\n",drn,trn,offset); + printf("\tlqd\t%s, %d(%s)\n",drn,(offset*4),trn); + printf("\tstqd\t%s,%d(%s)\n",drn,(offset*4),trn); break; case 4: case -4: - printf("\tlqa\t%s, [%s,#%d]\n",drn,frn,offset); - printf("\tstqa\t%s, [%s,#%d]\n",drn,trn,offset); + printf("\tlqd\t%s, %d(%s)\n",drn,(offset*4),trn); + printf("\tstqd\t%s,%d(%s)\n",drn,(offset*4),trn); break; default: if (length <0) { @@ -1867,7 +1904,7 @@ code_const(length>0?length:-length,3); /* overlap must be allowed */ // offset have to be ignored */ - printf("\thbra\t%s\n",memmove); + //printf("\thbra\t%s\n",memmove); extern_define(memmove,0,FUNCTION,1); set_ireg(RET_REGISTER,0); if (creg!=to) { @@ -1918,8 +1955,8 @@ srn = register_name(sreg); code_lvar(arg_disp,dreg); for(count=0;count<length;count+=SIZE_OF_INT) { - printf("\tlqd\t%s, [%s, #%d]\n",srn,crn,count+on_register*SIZE_OF_INT); - printf("\tstr\t%s, [%s, #%d]\n",srn,drn,count); + printf("\tlqd\t%s, %d(%s)\n",srn,count+on_register*SIZE_OF_INT,crn); + printf("\tstqd\t%s, %d(%s)\n",srn,count,drn); } free_register(sreg); if (on_register) { @@ -1947,8 +1984,8 @@ } for (count=0,arg_reg; on_register-->0; arg_reg++,count+=SIZE_OF_INT) { // len0 = (len0>2)?0:len0; - printf("\t%s\t%s, [%s, #%d]\n", cload(0,0), - register_name(arg_reg), crn,count); + printf("\t%s\t%s, %d(%s)\n", cload(0,0), + register_name(arg_reg), count,crn); use_input_reg(arg_reg,1); } return length/SIZE_OF_INT; @@ -2242,13 +2279,43 @@ reg = freg; case DREGISTER: if (car(e2)==DREGISTER) reg = cadr(e2); - printf("\tstqd\t%s, [sp, #-8]!\n",register_name(reg)); - printf("\tldmfd\tsp!, {%s, %s}\n",lregister_name_low(r),lregister_name_high(r)); + //printf("\tstqd\t%s, #sp, #-8]!\n",register_name(reg)); + //printf("\tstqd\t%s, #sp, #-8]!\n",register_name(reg)); + //printf("\tldmfd\tsp!, {%s, %s}\n",lregister_name_low(r),lregister_name_high(r)); + printf("\tstqd\t%s, -8($sp)\n",register_name(reg)); + printf("\tstqd\t%s, -8($sp)\n",register_name(reg)); + printf("\tlqx\t$sp,%s, %s\n",lregister_name_low(r),lregister_name_high(r)); } if (tmp!=-1) free_lvar(tmp); #endif } +static void +code_assign_input_double_reg(int e1,int e2) { +#if FLOAT_CODE + int r,tmp=-1,reg=0; + double value; + if(car(e1)!=REGISTER) { error(-1); return;} + r = cadr(e1); + switch(car(e2)) { + case DCONST: + value = dcadr(e2); + dconst(r,r,value); + break; + case DRGVAR: + code_lrgvar(e2,r); + break; + case DRLVAR: + code_lrlvar(cadr(e2),r); + break; + default: + g_expr(rvalue_t(e2,DOUBLE)); + reg = freg; + } + if(tmp!=-1) free_lvar(tmp); +#endif +} + static int compute_complex_arg(int e3,int reg_arg_list,int arg) { int t=caddr(e3); @@ -2341,8 +2408,9 @@ if (car(e2) == FNAME) { printf("\tbrsl\t$lr,%s\n",fn->nm); } else { - printf("\tmov\tlr, pc\n"); - printf("\tmov\tpc, %s\n",register_name(cadr(jmp))); + //printf("\tmov\tlr, pc\n"); + printf("\tori\t$sp,%s,0\n",register_name(cadr(jmp))); + printf("\tori\t$sp, %s,0\n",register_name(cadr(jmp))); } } @@ -2505,9 +2573,10 @@ g_expr_u(assign_expr0(arg,e4,t,t)); } else if (t==DOUBLE) { reg_arg_list = list2(arg,reg_arg_list); - if (car(arg)==LREGISTER) { - use_input_reg(cadr(arg),1); - code_assign_input_double_long(arg, e4); + if (car(arg)==REGISTER) { + use_input_reg(cadr(arg),1); + //code_assign_input_double_long(arg, e4); + code_assign_input_double_reg(arg, e4); } else { g_expr_u(assign_expr0(arg,e4,t,t)); } @@ -2567,16 +2636,17 @@ g_expr(list3(BAND,list3(ADD,e1,list2(CONST,15)),list2(CONST,~15))); use_int(reg); crn = register_name(reg); - printf("\trsb\tsp, %s, sp\n",crn); + //printf("\tsfi\t$sp, %s, $sp\n",crn); if (!max_func_arg_label) max_func_arg_label = fwdlabel(); code_label_value(max_func_arg_label ,REG_ip); - printf("\ta\t%s, sp, ip\n",crn); + printf("\ta\t%s, $sp, $sp\n",crn); } void code_frame_pointer(int e3) { use_int(e3); - printf("\tmov\tfp, %s\n",register_name(e3)); + //printf("\tmov\tfp, %s\n",register_name(e3)); + printf("\tori\t$sp,%s\n",register_name(e3)); } int @@ -2595,7 +2665,7 @@ trn = register_name(REG_ip); //disp = search_const(LVAR,glist2(lvar_offset_label,FUNC_LVAR(0)),&label); printf("\tlqd\t%s, %d($sp)\n",trn,disp); - printf("\ta\tfp, fp, %s\n",trn); + printf("\ta\t$sp, $sp, %s\n",trn); } } @@ -2618,7 +2688,7 @@ // jump to continuation means use all register variable max_reg_var = REG_VAR_MAX-REG_VAR_MIN; max_reg_var = FREG_VAR_MAX-FREG_VAR_MIN; - printf("\thogebr\t%s\n",s); + printf("\tbr\t%s\n",s); control=0; } @@ -2628,7 +2698,8 @@ max_reg_var = REG_VAR_MAX-REG_VAR_MIN; max_reg_var = FREG_VAR_MAX-FREG_VAR_MIN; use_int(e2); - printf("\tmov\tpc, %s @ indirect jump\n",register_name(e2)); // ?! + //printf("\tmov\tpc, %s @ indirect jump\n",register_name(e2)); // ?! + printf("\tbi\t%s\n",register_name(e2)); // ?! control=0; } @@ -2653,7 +2724,7 @@ if (!is_int_reg(creg)) error(-1); xreg = creg; use_float(d,reg); - code_ldf(d?"ldfd":"ldfs",register_name(reg),offset,xreg,""); + code_ldf(d?"lqd":"lqd",register_name(reg),offset,xreg,""); return d?DOUBLE:FLOAT; } #endif @@ -2666,19 +2737,19 @@ char *crn=register_name(creg); #if ENDIAN_L==0 if (creg!=reg) { - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset); - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset+SIZE_OF_INT); + printf("\tlqd\t%s, %d(%s)\n",lregister_name_low(reg),offset,crn); + //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset+SIZE_OF_INT); } else { - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset+SIZE_OF_INT); - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset); + printf("\tlqd\t%s, %d(%s)\n",lregister_name_high(reg),offset+SIZE_OF_INT,crn); + //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset); } #else if (creg!=reg) { - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset+SIZE_OF_INT); - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset); + printf("\tlqd\t%s, %d(%s)\n",lregister_name_low(reg),offset+SIZE_OF_INT,crn); + //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset); } else { - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_high(reg),crn,offset); - printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset+SIZE_OF_INT); + printf("\tlqd\t%s, %d(%s)\n",lregister_name_high(reg),offset,crn); + //printf("\tldr\t%s, [%s, #%d]\n",lregister_name_low(reg),crn,offset+SIZE_OF_INT); } #endif } @@ -2714,11 +2785,11 @@ crn_h = lregister_name_high(creg); crn_l = lregister_name_low(creg); #if ENDIAN_L==0 - printf("\tstr\t%s, [%s, #0]\n",crn_l,drn); - printf("\tstr\t%s, [%s, #%d]\n",crn_h,drn,SIZE_OF_INT); + printf("\tstqd\t%s, 0(%s)\n",crn_l,drn); + printf("\tstqd\t%s, %d(%s)\n",crn_h,SIZE_OF_INT,drn); #else - printf("\tstr\t%s, [%s, #0]\n",crn_h,drn); - printf("\tstr\t%s, [%s, #%d]\n",crn_l,drn,SIZE_OF_INT); + printf("\tstqd\t%s, 0(%s)\n",crn_h,drn); + printf("\tstqd\t%s, %d(%s)\n",crn_l,SIZE_OF_INT,drn); #endif } @@ -2740,8 +2811,8 @@ cstore(int sz) { switch(sz) { - case 1: return "stqx"; - case SIZE_OF_SHORT: return "stqa"; + case 1: return "stqd"; + case SIZE_OF_SHORT: return "stqd"; default: return "stqd"; } } @@ -2925,12 +2996,12 @@ v=ilog(v); case LSHIFT: case ULSHIFT: - printf("\tmov\t%s, %s, asl #%d\n",crn,crn,v); + printf("\troti\t%s, %s,-%d\n",crn,crn,v); break; case DIV: v=ilog(v); case RSHIFT: - printf("\trotmai\t%s, %s, %d\n",crn,crn,v); + printf("\troti\t%s, %s, -%d\n",crn,crn,v); break; case UDIV: v=ilog(v); @@ -2944,9 +3015,9 @@ code_add(creg,-v,creg); break; case CMP: printf("\tceq\t%s,%d\n",crn,v); break; - case BOR: printf("\tor\t%s, %s, #%d\n",crn,crn,v); break; - case EOR: printf("\txor\t%s, %s, #%d\n",crn,crn,v); break; - case BAND: printf("\tand\t%s, %s, #%d\n",crn,crn,v); break; + case BOR: printf("\tori\t%s, %s, %d\n",crn,crn,v); break; + case EOR: printf("\txori\t%s, %s, %d\n",crn,crn,v); break; + case BAND: printf("\tandi\t%s, %s, %d\n",crn,crn,v); break; default: error(-1); } @@ -3003,12 +3074,12 @@ switch(cond) { case -1: break; case 1: - printf("\tbne\t.LC%d\n",label); break; + printf("\tbr\t.LC%d\n",label); break; case 0: - printf("\tbeq\t.LC%d\n",label); break; + printf("\tbr\t.LC%d\n",label); break; case LT: - printf("\tblt\t.LC%d\n",label); break; - case GT: + printf("\tbra\t.LC%d\n",label); break; + case GT: printf("\tbgt\t.LC%d\n",label); break; default: error(-1); } @@ -3056,25 +3127,29 @@ } switch(op+(!cond)*BNOT) { - case GT: case LE+BNOT: cc="cgt"; ncc="le"; break; - case LE: case GT+BNOT: cc="le"; ncc="cgt"; break; - case GE: case LT+BNOT: cc="ge"; ncc="lt"; break; - case LT: case GE+BNOT: cc="lt"; ncc="ge"; break; - case UGT: case ULE+BNOT: cc="hi"; ncc="ls"; break; - case ULE: case UGT+BNOT: cc="ls"; ncc="hi"; break; - case UGE: case ULT+BNOT: cc="hs"; ncc="lo"; break; - case ULT: case UGE+BNOT: cc="lo"; ncc="hs"; break; - case EQ: case NEQ+BNOT: cc="eq"; ncc="ne"; break; - case NEQ: case EQ+BNOT: cc="ne"; ncc="eq"; break; + case GT: case LE+BNOT: cc="r"; ncc="r"; break; + case LE: case GT+BNOT: cc="r"; ncc="r"; break; + case GE: case LT+BNOT: cc="r"; ncc="r"; break; + case LT: case GE+BNOT: cc="r"; ncc="r"; break; + case UGT: case ULE+BNOT: cc="r"; ncc="r"; break; + case ULE: case UGT+BNOT: cc="r"; ncc="r"; break; + case UGE: case ULT+BNOT: cc="r"; ncc="r"; break; + case ULT: case UGE+BNOT: cc="r"; ncc="r"; break; + case EQ: case NEQ+BNOT: cc="r"; ncc="r"; break; + //case NEQ: case EQ+BNOT: cc="rnz"; ncc="r"; break; + case NEQ: case EQ+BNOT: cc="r"; ncc="r"; break; default: error(-1); } if (mode==COND_BRANCH||mode==COND_BRANCH_CONST) { - printf("\tb%s\t.LC%d\n",cc,l1); + printf("\tb%s\t.LC%d\n",cc,l1); + //printf("\tb%s\t%s, .LC%d\n",cc,rn1,l1); } else if (mode==COND_VALUE||mode==COND_VALUE_CONST) { rn0 = register_name(r0); - printf("\tmov%s\t%s, #0\n",ncc,rn0); - printf("\tmov%s\t%s, #1\n",cc,rn0); + // ここはnccで分岐させなきゃダメだな + printf("#####pcond##########\n"); + //printf("\tmovhoge%s\t%s, #0\n",ncc,rn0); + //printf("\tmovfuho%s\t%s, #1\n",cc,rn0); } else error(-1); } @@ -3131,7 +3206,7 @@ static void jcond(int l, int cond) { - printf("\tb%s\t.LC%d\n",cond?"ne":"eq",l); + printf("\tb%s\t.LC%d\n",cond?"r":"r",l); } void @@ -3172,12 +3247,15 @@ if (freg_save>0) { i=reg_save*SIZE_OF_INT+ freg_save*SIZE_OF_DOUBLE + 20; - printf("\tlfm\tf4, %d, [fp, #%d]\n",freg_save,-i); - } + //printf("\tlfm\tf4, %d, [fp, #%d]\n",freg_save,-i); + printf("\tlqd\t$sp,%d($sp)\n",i); + } //printf("\tldmea\tfp, {"); - for (i=reg_var_num(0);i<reg_var_num(reg_save);i++) { - printf("%s, ",register_name(i)); - } + for (i=reg_var_num(0);i<reg_var_num(reg_save);i++) { + //printf("%s, ",register_name(i)); + printf("\tlqd\t%s,-%d($sp)\n",register_name(i),-disp); + disp -= SIZE_OF_FLOAT*4; + } //printf("fp, sp, pc}\n"); return disp; } @@ -3198,7 +3276,7 @@ max_func_args = 0; printf("%s:\n",name); code_label_value(r1_offset_label,REG_ip); - printf("\ta\tsp, ip, fp\n"); + printf("\ta\t$sp, $sp, $fp\n"); clear_ptr_cache(); } @@ -3235,7 +3313,7 @@ if (stmode!=STATIC) printf("\t.globl\t%s\n",name); printf("%s:\n",name); - //printf("\tmov\tip, sp\n"); + //printf("\tmov\t$sp, $lr,0\n"); printf("\tstqd\t$lr,16($sp)\n"); printf("\tstqd\t$sp,-32($sp)\n"); printf("\tai\t$sp,$sp,-32\n"); @@ -3256,13 +3334,13 @@ void code_label_call(int l) { - printf("\tbl\tL_%d\n",l); + printf("\tbr\tL_%d\n",l); } void code_ret() { - printf("\tmov\tpc, lr\n"); + //printf("\tmov\tpc, lr\n"); control=0; } @@ -3295,8 +3373,8 @@ car(cadr(fnptr->ty))==UNION)) { sz = size(cadr(fnptr->ty)); code_const(sz,REGISTER_OPERAND); - printf("\tsf\tr1, r2, fp\n"); - printf("\tlqd\tr0, [fp, #%d]\n",(my_func_args-1)*SIZE_OF_INT); + printf("\tsf\t$1, $2, $sp\n"); + printf("\tlqd\t$1, %d($sp)\n",(my_func_args-1)*SIZE_OF_INT); emit_copy(6,3,sz,0,1,1); } else if (cadr(fnptr->ty)!=VOID) { creg = ireg = cadr(get_input_register_var(0,0,1)); @@ -3316,7 +3394,7 @@ fwddef(entry_label); if (arg_on_register>0) - printf("\tsfi\tsp, sp, %d\n",arg_on_register); + printf("\tsfi\t$sp, $sp, %d\n",arg_on_register); //code_register_save(max_reg_var,max_reg_var,0); //printf("\tsf\tfp, ip, #%d\n",4+arg_on_register); @@ -3557,7 +3635,7 @@ emit_label(int labelno) { data_mode(0); - printf("\t.word .L%d\n",labelno); + printf("\t.word .LC%d\n",labelno); } void @@ -3571,7 +3649,7 @@ #ifdef DOT_SIZE lb=fwdlabel(); printf(".LC%d:\n",lb); - printf("\t.size\t%s,.L%d-%s\n",n->nm,lb,n->nm); + printf("\t.size\t%s,.LC%d-%s\n",n->nm,lb,n->nm); #endif } } @@ -3580,9 +3658,9 @@ static void comm(NMTBL *n) { - printf(".comm %s,%d @ %d\n",n->nm,size(n->ty), - (n->ty==DOUBLE||n->ty==LONGLONG||n->ty==ULONGLONG)?8:4 - ); + //printf(".comm %s,%d @ %d\n",n->nm,size(n->ty), + //(n->ty==DOUBLE||n->ty==LONGLONG||n->ty==ULONGLONG)?8:4 + //); } void @@ -3675,7 +3753,7 @@ code_save_stacks(); clear_ptr_cache(); extern_define(conv,0,FUNCTION,1); - printf("\tbl\t%s\n",conv); + printf("\tbr\t%s\n",conv); lib_args(16); } #endif @@ -3690,7 +3768,7 @@ g = list3(REGISTER_OPERAND_1,g,oreg); parallel_rassign(g); extern_define(lib,0,FUNCTION,1); - printf("\tbl\t%s\n",lib); + printf("\tbr\t%s\n",lib); lib_args(16); set_ireg(RET_REGISTER,0); if (reg!=RET_REGISTER) { @@ -3720,14 +3798,14 @@ static char * movef(int d) { - return d?"mvfd":"mvfs"; + return d?"ori":"ori"; } static char * -fload(int d) { return d?"ldfd":"ldfs"; } +fload(int d) { return d?"lqd":"lqd"; } static char * -fstore(int d) { return d?"stfd":"stfs"; } +fstore(int d) { return d?"stqd":"stqd"; } void @@ -3736,7 +3814,7 @@ use_float(d,freg); if (freg!=e2) { if (is_int_reg(e2)) error(-1); - printf("\t%s\t%s, %s\n",movef(d), + printf("\t%s\t%s, %s, 0\n",movef(d), register_name(freg),register_name(e2)); } } @@ -3746,7 +3824,7 @@ { use_float(d,freg); code_ldf(fstore(d),register_name(freg),cadr(e2), - get_ptr_cache((NMTBL*)caddr(e2))," @ float"); + get_ptr_cache((NMTBL*)caddr(e2)),""); } void @@ -3755,14 +3833,15 @@ use_float(d,freg); lvar_intro(e2); printf("\t%s\t%s, ",fstore(d),register_name(freg)); - lvar(e2,"@ float"); + lvar(e2,""); } void code_dassign(int e2,int freg,int d) { use_float(d,freg); - printf("\t%s\t%s, [%s, #0] @ float\n",fstore(d), + //printf("\t%s\t%s, [%s, #0] @ float\n",fstore(d), + printf("\t%s\t%s, 0(%s)\n",fstore(d), register_name(freg),register_name(e2)); } @@ -3770,7 +3849,7 @@ code_dassign_dregister(int e2,int d,int freg) { use_float(d,freg); if (e2!=freg) { - printf("\t%s\t%s, %s\n",movef(d), + printf("\t%s\t%s, %s, 0\n",movef(d), register_name(e2),register_name(freg)); } } @@ -3802,13 +3881,7 @@ static void dconst(int l,int h,double value) { -#if ENDIAN_D==0 - code_const(code_d1(value),l); - code_const(code_d2(value),h); -#else - code_const(code_d1(value),h); - code_const(code_d2(value),l); -#endif + code_dconst(code_d2(value),h,1); } @@ -3823,9 +3896,9 @@ use_float(d,freg); frn = register_name(freg); if (value==0 || value==1 || value==10) { - printf("\t%s\t%s, #%d\n",movef(d),frn,(int)value); + printf("\t%s\t%s, %s, %d\n",movef(d),frn,frn,(int)value); } else if (value==-1 || value==-10) { - printf("\t%s\t%s, #%d\n",d?"mnfd":"mnfs",frn,(int)-value); + printf("\t%s\t%s, %d\n",d?"mnfd":"mnfs",frn,(int)-value); } else if (d) { #if ENDIAN_D==0 disp = search_double_const(DCONST, @@ -3834,10 +3907,10 @@ disp = search_double_const(DCONST, code_d2(value),code_d1(value),&label); #endif - printf("\tldfd\t%s, .LC%d+%d\n",frn,label,disp); + printf("\tlqd\t%s, .LC%d+%d($sp)\n",frn,label,disp); } else { //disp = search_const(CONST,*((int*)&f),&label); - printf("\tldfs\t%s, .LC%d+%d\n",frn,label,disp); + printf("\tlqd\t%s, .LC%d+%d($sp)\n",frn,label,disp); } } @@ -3874,7 +3947,7 @@ int lreg; use_float(d,reg); lreg = get_register(); - printf("\tfixz\t%s, %s\n",register_name(lreg),register_name(reg)); + //printf("\tfixz\t%s, %s\n",register_name(lreg),register_name(reg)); set_ireg(lreg,0); return; } @@ -3899,7 +3972,7 @@ // u = (d>2.1e9)?((int)(d-2.1e9)^2147483648):(int)d use_float(1,reg); frn = register_name(reg); - if (!d) printf("\tmvfd\t%s, %s\n",frn,frn); + if (!d) printf("\tori\t%s, %s, 0\n",frn,frn); emit_dpush(1); code_dconst(dlist2(DCONST,2.147483648e9),USE_CREG,1); lrn = register_name(lreg = emit_dpop(d)); @@ -3907,12 +3980,12 @@ set_ireg(reg0=get_register(),0); crn = register_name(reg0); printf("\tcmfe\t%s, %s\n",lrn,frn); - printf("\tbge\t1f\n"); - printf("\tfixz\t%s, %s\n",crn,lrn); + printf("\tbr\t1f\n"); + //printf("\tfixz\t%s, %s\n",crn,lrn); printf("\tb\t2f\n"); printf("1:\n"); printf("\tsufd\t%s, %s, %s\n",lrn,lrn,frn); - printf("\tfixz\t%s, %s\n",crn,lrn); + //printf("\tfixz\t%s, %s\n",crn,lrn); printf("\teor\t%s, %s, #-2147483648\n",crn,crn); printf("2:\n"); emit_dpop_free(lreg,d); @@ -3929,8 +4002,8 @@ set_dreg(reg=get_dregister(1),0); frn = register_name(reg); printf("\tfltd\t%s, %s\n",frn,crn); - printf("\tcmp\t%s, #0\n",crn); - printf("\tbge\t1f\n"); + printf("\tceqi\t%s, %s, 0\n",crn,crn); + printf("\tbr\t1f\n"); freg1 = get_dregister(1); code_dconst(dlist2(DCONST,4.29496729600000000000e9),freg1,1); frn = register_name(creg); @@ -3955,7 +4028,7 @@ code_f2d(int reg) { char *frn; frn = register_name(freg); - printf("\tmvfd\t%s, %s\n",frn,frn); + printf("\tori\t%s, %s, 0\n",frn,frn); return; } @@ -4220,14 +4293,14 @@ } } switch(op) { - case FOP+GT: op1=FOP+CMP; opn = "bgt"; break; - case FOP+GE: op1=FOP+CMPGE; opn = "bge"; break; - case FOP+EQ: op1=FOP+CMP; opn = "beq"; break; - case FOP+NEQ: op1=FOP+CMP; opn = "bne"; break; - case DOP+GT: op1=DOP+CMP; opn = "bgt"; break; - case DOP+GE: op1=DOP+CMPGE; opn = "bge"; break; - case DOP+EQ: op1=DOP+CMP; opn = "beq"; break; - case DOP+NEQ: op1=DOP+CMP; opn = "bne"; break; + case FOP+GT: op1=FOP+CMP; opn = "br"; break; + case FOP+GE: op1=FOP+CMPGE; opn = "br"; break; + case FOP+EQ: op1=FOP+CMP; opn = "br"; break; + case FOP+NEQ: op1=FOP+CMP; opn = "br"; break; + case DOP+GT: op1=DOP+CMP; opn = "br"; break; + case DOP+GE: op1=DOP+CMPGE; opn = "br"; break; + case DOP+EQ: op1=DOP+CMP; opn = "br"; break; + case DOP+NEQ: op1=DOP+CMP; opn = "br"; break; default: error(-1); } g_expr(list3(op1,e2,e1)); @@ -4321,7 +4394,7 @@ code_cmp_lregister(int reg,int label,int cond) { use_longlong(reg); - printf("\torr\t%s, %s, %s\n", + printf("\torc\t%s, %s, %s\n", lregister_name_low(reg), lregister_name_low(reg), lregister_name_high(reg)); @@ -4404,11 +4477,11 @@ crn_l = lregister_name_low(creg); lvar_intro(e2); #if ENDIAN_L==0 - printf("\tstr\t%s, ",crn_l);lvar(e2,""); - printf("\tstr\t%s, ",crn_h);lvar(e2+SIZE_OF_INT,""); + printf("\tstqd\t%s, ",crn_l);lvar(e2,""); + printf("\tstqd\t%s, ",crn_h);lvar(e2+SIZE_OF_INT,""); #else - printf("\tstr\t%s, ",crn_h);lvar(e2,""); - printf("\tstr\t%s, ",crn_l);lvar(e2+SIZE_OF_INT,""); + printf("\tstqd\t%s, ",crn_h);lvar(e2,""); + printf("\tstqd\t%s, ",crn_l);lvar(e2+SIZE_OF_INT,""); #endif } @@ -4450,11 +4523,11 @@ crn_l = lregister_name_low(creg); r = get_ptr_cache((NMTBL*)caddr(e1)); #if ENDIAN_L==0 - code_ldf("ldr",crn_l,cadr(e1),r,""); - code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,""); + code_ldf("lqd",crn_l,cadr(e1),r,""); + //code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,""); #else - code_ldf("ldr",crn_h,cadr(e1),r,""); - code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,""); + code_ldf("lqd",crn_h,cadr(e1),r,""); + //code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,""); #endif } @@ -4494,13 +4567,7 @@ code_lconst(int e1,int creg) { use_longlong(creg); -#if ENDIAN_L==0 - code_const(code_l1(lcadr(e1)),(creg)); code_const(code_l2(lcadr(e1)),(creg)); -#else - code_const(code_l1(lcadr(e1)),(creg)); - code_const(code_l2(lcadr(e1)),(creg)); -#endif } void @@ -4590,8 +4657,8 @@ printf("\teor\t%s, %s, %s\n",crn_h,crn_h,orn_h); break; case LBOR: - printf("\torr\t%s, %s, %s\n",crn_l,crn_l,orn_l); - printf("\torr\t%s, %s, %s\n",crn_h,crn_h,orn_h); + printf("\tor\t%s, %s, %s\n",crn_l,crn_l,orn_l); + printf("\tor\t%s, %s, %s\n",crn_h,crn_h,orn_h); break; case LMUL: case LUMUL: @@ -4678,16 +4745,18 @@ code_const(0,(creg)); return; } else if (v>31) { - printf("\tmov\t%s, %s, lsl #%d\n",crn_h,crn_l,v-32); - code_const(0,(creg)); + //printf("\tmov\t%s, %s, lsl #%d\n",crn_h,crn_l,v-32); + // 右シフト + printf("\troti\t%s,%s,%d\n",crn_h,crn_h,96-v); + code_const(0,(creg)); return; } greg = get_register(); grn = register_name(greg); - printf("\tmov\t%s, %s, lsl #%d\n",crn_h,crn_h,v); - printf("\tmov\t%s, %s, lsr #%d\n",grn,crn_l,32-v); - printf("\torr\t%s, %s,%s\n",crn_h,crn_h,grn); - printf("\tmov\t%s, %s, lsl #%d\n",crn_l,crn_l,v); + printf("\tshli\t%s, %s, %d\n",crn_h,crn_h,v); + printf("\troti\t%s, %s, -%d\n",grn,crn_l,32-v); + printf("\torc\t%s, %s,%s\n",crn_h,crn_h,grn); + printf("\tshli\t%s, %s,%d\n",crn_l,crn_l,v); free_register(greg); return; case LDIV: @@ -4696,19 +4765,19 @@ if (v==0) return; if (v==32) { code_register((creg),(creg)); - printf("\tmov\t%s, %s, asr #31\n",crn_h,crn_l); + printf("\tshli\t%s, %s, 31\n",crn_h,crn_l); return; } else if (v>31) { - printf("\tmov\t%s, %s, asr #%d\n",crn_l,crn_h,v-32); - printf("\tmov\t%s, %s, asr #31\n",crn_h,crn_l); + printf("\t\t%s, %s, asr #%d\n",crn_l,crn_h,v-32); + printf("\tshl\t%s, %s, 31\n",crn_h,crn_l); return; } greg = get_register(); grn = register_name(greg); - printf("\tmov\t%s, %s, lsr #%d\n",crn_l,crn_l,v); - printf("\tmov\t%s, %s, lsl #%d\n",grn,crn_h,32-v); - printf("\torr\t%s, %s,%s\n",crn_l,crn_l,grn); - printf("\tmov\t%s, %s, asr #%d\n",crn_h,crn_h,v); + printf("\troti \t%s, %s, %d\n",crn_l,crn_l,v); + printf("\troti\t%s, %s, %d\n",grn,crn_h,160-v); + printf("\tor\t%s, %s,%s\n",crn_l,crn_l,grn); + printf("\tshli\t%s, %s, %d\n",crn_h,crn_h,v); free_register(greg); return; case LUDIV: @@ -4726,10 +4795,10 @@ } greg = get_register(); grn = register_name(greg); - printf("\tmov\t%s, %s, lsl #%d\n",grn,crn_h,32-v); - printf("\tmov\t%s, %s, lsr #%d\n",crn_l,crn_l,v); - printf("\torr\t%s, %s,%s\n",crn_l,grn,crn_l); - printf("\tmov\t%s, %s, lsr #%d\n",crn_h,crn_h,v); + printf("\troti\t%s, %s, %d\n",grn,crn_h,96-v); + printf("\troti\t%s, %s, %d\n",crn_l,crn_l,v); + printf("\tor\t%s, %s,%s\n",crn_l,grn,crn_l); + printf("\troti\t%s, %s, %d\n",crn_h,crn_h,v); free_register(greg); return; case LADD: @@ -4741,16 +4810,16 @@ printf("\tsbc\t%s, %s, #%d\n",crn_h,crn_h,vh); break; case LBAND: - printf("\tand\t%s, %s, #%d\n",crn_l,crn_l,v); - printf("\tand\t%s, %s, #%d\n",crn_h,crn_h,vh); + printf("\tandi\t%s, %s, %d\n",crn_l,crn_l,v); + printf("\tandi\t%s, %s, %d\n",crn_h,crn_h,vh); break; case LEOR: printf("\teor\t%s, %s, #%d\n",crn_l,crn_l,v); printf("\teor\t%s, %s, #%d\n",crn_h,crn_h,vh); break; case LBOR: - printf("\torr\t%s, %s, #%d\n",crn_l,crn_l,v); - printf("\torr\t%s, %s, #%d\n",crn_h,crn_h,vh); + printf("\tori\t%s, %s, %d\n",crn_l,crn_l,v); + printf("\tori\t%s, %s, %d\n",crn_h,crn_h,vh); break; default: error(-1); @@ -4770,7 +4839,7 @@ crn_l = lregister_name_low(lreg); if (reg0!=(lreg)) printf("\tori\t%s, %s, 0\n",crn_l,crn); - printf("\tmov\t%s, %s, asr #31\n",crn_h,crn_l); + printf("\tshli\t%s, %s, 31\n",crn_h,crn_l); } void @@ -5104,13 +5173,13 @@ break; case 2: printf("\ttst\t%s, #1\n",trn); - printf("\tbne\t.L%d\n",dlabel); + printf("\tbr\t.L%d\n",dlabel); code_cmpdimm(max-min,t,dlabel,-1); printf("\tldrls\tpc, [pc, %s, asl #1]\n",trn); break; break; case 4: printf("\ttst\t%s, #3\n",trn); - printf("\tbne\t.L%d\n",dlabel); + printf("\tbr\t.L%d\n",dlabel); code_cmpdimm(max-min,t,dlabel,-1); printf("\tldrls\tpc, [pc, %s]\n",trn); break; break; @@ -5517,14 +5586,14 @@ { // printf("## mask 0x%08x ~0x%08x\n",mask,~mask); code_const(~mask,tmp); - printf("\torr\t%s, %s, %s\n",trn,crn,trn); + printf("\tor\t%s, %s, %s\n",trn,crn,trn); /* do conjunction */ printf("\tand\t%s, %s, %s\n",lrn,trn,lrn); /* make or-mask */ code_const(mask,tmp); printf("\tand\t%s, %s, %s\n",trn,crn,trn); /* do disjunction */ - printf("\torr\t%s, %s, %s\n",crn,trn,lrn); + printf("\tor\t%s, %s, %s\n",crn,trn,lrn); } extern void @@ -5649,7 +5718,7 @@ // printf("## mask 0x%08x ~0x%08x\n",mask,~mask); if ((m=(~mask|c))!=-1) { if (is_stage1_const(m,0)>0) { - printf("\tand\t%s, %s, #%d\n",crn,crn,m); + printf("\tandi\t%s, %s, %d\n",crn,crn,m); } else { trn = register_name(tmp=get_register()); code_const((~mask|c),tmp); @@ -5663,11 +5732,11 @@ if (c!=0) { /* do disjunction */ if (is_stage1_const(c,0)>0) { - printf("\torr\t%s, %s, #%d\n",crn,crn,c); + printf("\tori\t%s, %s, %d\n",crn,crn,c); } else { trn = register_name(tmp=get_register()); code_const(c,tmp); - printf("\torr\t%s, %s, %s\n",crn,trn,crn); + printf("\tor\t%s, %s, %s\n",crn,trn,crn); } } if (tmp!=-1) free_register(tmp);