comparison mc-code-mips.c @ 583:421be86892b3

ia32 reorganization
author kono
date Tue, 17 Jan 2006 23:38:57 +0900
parents dbde3b869a0f
children c991b82e6849
comparison
equal deleted inserted replaced
582:3f60e599cc04 583:421be86892b3
1572 printf("\tsw %s,%d(%s)\n",drn,offset,trn); 1572 printf("\tsw %s,%d(%s)\n",drn,offset,trn);
1573 break; 1573 break;
1574 default: 1574 default:
1575 if (length <0) { 1575 if (length <0) {
1576 if (length > -MAX_COPY_LEN) { 1576 if (length > -MAX_COPY_LEN) {
1577 free_register(dreg); dreg = 0;
1577 for(;length<=-4;length+=4,offset-=4) 1578 for(;length<=-4;length+=4,offset-=4)
1578 emit_copy(from,to,-4,offset-4,0,det); 1579 emit_copy(from,to,-4,offset-4,0,det);
1579 for(;length<=-2;length+=2,offset-=2) 1580 for(;length<=-2;length+=2,offset-=2)
1580 emit_copy(from,to,-2,offset-2,0,det); 1581 emit_copy(from,to,-2,offset-2,0,det);
1581 if(length<0) 1582 if(length<0)
1582 emit_copy(from,to,length,offset-1,0,det); 1583 emit_copy(from,to,length,offset-1,0,det);
1583 break; 1584 break;
1584 } 1585 }
1585 } else if (length <=MAX_COPY_LEN) { 1586 } else if (length <=MAX_COPY_LEN) {
1587 free_register(dreg); dreg = 0;
1586 for(;length>=4;length-=4,offset+=4) 1588 for(;length>=4;length-=4,offset+=4)
1587 emit_copy(from,to,4,offset,0,det); 1589 emit_copy(from,to,4,offset,0,det);
1588 for(;length>=2;length-=2,offset+=2) 1590 for(;length>=2;length-=2,offset+=2)
1589 emit_copy(from,to,2,offset,0,det); 1591 emit_copy(from,to,2,offset,0,det);
1590 if(length>0) 1592 if(length>0)
1617 if(creg!=to) { 1619 if(creg!=to) {
1618 free_register(to); 1620 free_register(to);
1619 // set_ireg(to,1); 1621 // set_ireg(to,1);
1620 } 1622 }
1621 } 1623 }
1622 free_register(dreg); 1624 if (dreg) free_register(dreg);
1623 } 1625 }
1624 1626
1625 int 1627 int
1626 push_struct(int e4,int t,int arg) 1628 push_struct(int e4,int t,int arg)
1627 { 1629 {
2484 tosop(op,e2,reg); 2486 tosop(op,e2,reg);
2485 } 2487 }
2486 2488
2487 void 2489 void
2488 code_assop(int op,int creg, int byte,int sign) { 2490 code_assop(int op,int creg, int byte,int sign) {
2489 char *xrn,*crn,*drn; 2491 char *crn,*drn;
2490 int xreg; 2492 int xreg;
2491 int edx = get_register(); if(!edx) error(-1); 2493 int edx = get_register(); if(!edx) error(-1);
2492 // (*creg) op = pop() 2494 // (*creg) op = pop()
2493 2495
2494 use_int(creg); 2496 use_int(creg);
2495 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ 2497 xreg = emit_pop(0); /* pop e3 value */
2496 #if 1 2498 #if 1
2497 set_ireg(edx,0); 2499 set_ireg(edx,0);
2498 ld_indexx(byte,0,creg,ireg,sign); 2500 ld_indexx(byte,0,creg,ireg,sign);
2499 tosop(op,ireg,xreg); 2501 tosop(op,ireg,xreg);
2500 crn = register_name(ireg); 2502 crn = register_name(ireg);