Mercurial > hg > CbC > old > device
comparison mc-code-mips.c @ 142:de272ad4ddce
mips continue
author | kono |
---|---|
date | Sun, 18 May 2003 21:03:39 +0900 |
parents | b70018bb3c0e |
children | 66ddda268ac5 |
comparison
equal
deleted
inserted
replaced
141:b70018bb3c0e | 142:de272ad4ddce |
---|---|
2284 printf("\tjal fptodp\n"); | 2284 printf("\tjal fptodp\n"); |
2285 set_freg(RET_DREGISTER,0); | 2285 set_freg(RET_DREGISTER,0); |
2286 } | 2286 } |
2287 | 2287 |
2288 void code_f2i(int freg,int creg) { | 2288 void code_f2i(int freg,int creg) { |
2289 printf("\ttrunc.w.s %s,%s,%s\n",freg,freg,creg); | |
2289 } | 2290 } |
2290 | 2291 |
2291 void code_f2u(int freg,int creg) { | 2292 void code_f2u(int freg,int creg) { |
2293 printf("\ttrunc.w.s %s,%s,%s\n",freg,freg,creg); | |
2292 } | 2294 } |
2293 | 2295 |
2294 void code_i2f(int creg,int freg) { | 2296 void code_i2f(int creg,int freg) { |
2297 printf("\tcvt.s.w %s,%s\n",freg,freg); | |
2295 } | 2298 } |
2296 | 2299 |
2297 void code_u2f(int creg,int freg) { | 2300 void code_u2f(int creg,int freg) { |
2301 printf("\tcvt.s.w %s,%s\n",freg,freg); | |
2298 } | 2302 } |
2299 | 2303 |
2300 void code_drgvar(int e2,int d,int freg) | 2304 void code_drgvar(int e2,int d,int freg) |
2301 { | 2305 { |
2302 char *nm = ((NMTBL*)cadr(e2))->nm; | 2306 char *nm = ((NMTBL*)cadr(e2))->nm; |
2410 case DDIV: dtosop0("dpdiv",e1,1,0); return; | 2414 case DDIV: dtosop0("dpdiv",e1,1,0); return; |
2411 case FMUL: dtosop0("fadd",e1,0,0); return; | 2415 case FMUL: dtosop0("fadd",e1,0,0); return; |
2412 case DMUL: dtosop0("dpmul",e1,1,0); return; | 2416 case DMUL: dtosop0("dpmul",e1,1,0); return; |
2413 case DCMPGE: | 2417 case DCMPGE: |
2414 case DCMP: dtosop0("dpcmp",e1,1,1); return; | 2418 case DCMP: dtosop0("dpcmp",e1,1,1); return; |
2415 case FCMPGE: | 2419 case FCMPGE: dtosop0("c.le.s",e1,0,1); return; |
2416 case FCMP: dtosop0("c.eq.s",e1,0,1); return; | 2420 case FCMP: dtosop0("c.eq.s",e1,0,1); return; |
2417 default: | 2421 default: |
2418 error(-1); return; | 2422 error(-1); return; |
2419 } | 2423 } |
2420 } | 2424 } |
2534 } | 2538 } |
2535 | 2539 |
2536 void | 2540 void |
2537 drexpr(int e1, int e2,int l1, int op) | 2541 drexpr(int e1, int e2,int l1, int op) |
2538 { | 2542 { |
2539 g_expr(list3(((op==DOP+GE)?DCMPGE:DCMP),e1,e2)); | 2543 g_expr(list3(((op==FOP+EQ||op==FOP+NEQ)?DCMP:FCMPGE),e1,e2)); |
2540 switch(op) { | 2544 switch(op) { |
2541 case DOP+GE: | 2545 case DOP+GE: |
2542 case FOP+GE: | |
2543 printf("\tbgez\tL_%d\n",l1); | 2546 printf("\tbgez\tL_%d\n",l1); |
2544 break; | 2547 break; |
2545 case DOP+GT: | 2548 case DOP+GT: |
2546 case FOP+GT: | |
2547 printf("\tbltz\tL_%d\n",l1); | 2549 printf("\tbltz\tL_%d\n",l1); |
2548 break; | 2550 break; |
2549 case DOP+EQ: | 2551 case DOP+EQ: |
2550 case FOP+EQ: | |
2551 printf("\tbeq\tL_%d\n",l1); | 2552 printf("\tbeq\tL_%d\n",l1); |
2552 break; | 2553 break; |
2553 case DOP+NEQ: | 2554 case DOP+NEQ: |
2555 printf("\tbne\tL_%d\n",l1); | |
2556 break; | |
2557 case FOP+GE: | |
2558 printf("\tbc1tl\tL_%d\n",l1); | |
2559 break; | |
2560 case FOP+GT: | |
2561 printf("\tbc1tl\tL_%d\n",l1); | |
2562 break; | |
2563 case FOP+EQ: | |
2564 printf("\tbc1f\tL_%d\n",l1); | |
2565 break; | |
2554 case FOP+NEQ: | 2566 case FOP+NEQ: |
2555 printf("\tbne\tL_%d\n",l1); | 2567 printf("\tbc1f\tL_%d\n",l1); |
2556 break; | 2568 break; |
2557 } | 2569 } |
2558 } | 2570 } |
2559 | 2571 |
2560 int emit_dpop(int d) | 2572 int emit_dpop(int d) |
2561 { | 2573 { |
2562 int xreg,reg; | 2574 int xreg,reg; |
2563 xreg=pop_fregister(); | 2575 xreg=pop_fregister(); |
2564 if (xreg<= -REG_LVAR_OFFSET) { | 2576 if (xreg<= -REG_LVAR_OFFSET) { |
2565 reg = get_dregister(d); | 2577 reg = get_dregister(d); |
2566 code_drlvar(REG_LVAR_OFFSET+xreg,1,reg); | 2578 code_drlvar(REG_LVAR_OFFSET+xreg,d,reg); |
2567 free_lvar(REG_LVAR_OFFSET+xreg); | 2579 free_lvar(REG_LVAR_OFFSET+xreg); |
2568 fregv[reg]=1; xreg=reg; | 2580 fregv[reg]=1; xreg=reg; |
2569 } | 2581 } |
2570 return xreg; | 2582 return xreg; |
2571 } | 2583 } |