Mercurial > hg > CbC > old > device
comparison mc-code-powerpc.c @ 127:eb4d8975926c
Intel float fix
author | kono |
---|---|
date | Tue, 01 Apr 2003 10:31:40 +0900 |
parents | 1d1612fe705a |
children | d497c39add36 |
comparison
equal
deleted
inserted
replaced
126:1d1612fe705a | 127:eb4d8975926c |
---|---|
127 | 127 |
128 f0 return value etc. | 128 f0 return value etc. |
129 f1-r8 input register | 129 f1-r8 input register |
130 f24-f31 saved register variable | 130 f24-f31 saved register variable |
131 | 131 |
132 function call stack frame | |
132 <------r1_offset------------------------------> | 133 <------r1_offset------------------------------> |
133 <------------lvar_offset-------> | 134 <------------lvar_offset-------> |
134 r+ +------------+---+---------------+----------+--------------+----+ - | 135 r+ +------------+---+---------------+----------+--------------+----+ - |
135 callee arg xx register save local caller arg xx | 136 callee arg xx register save local caller arg xx |
136 reg_save disp max_func_args*size_of_int | 137 reg_save disp max_func_args*size_of_int |
137 lvar>0 lvar<0 lvar>0x1000 0000 | 138 lvar>0 lvar<0 lvar>0x1000 0000 |
139 | |
140 code segment stack frame | |
141 | |
142 * gotoを呼び出した関数のr1 ! r1(goto前のr1) | |
143 # * r30 <---------------r1_offset---------------> r1 | |
144 r+ +----------+--+----------+----------------+-----------+----------+----+ | |
145 cousin arg xx reg save !callee arg !code local caller arg xx | |
146 r20-r29 lvar>0 lvar<0 lvar>0x1000 000 | |
147 f20-f31 <-my_func_args--><--disp-----><-max_func_arg-> | |
148 *size_of_int *size_of_int | |
149 | |
138 */ | 150 */ |
139 int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12; | 151 int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12; |
140 #define func_disp_offset 60 | 152 #define func_disp_offset 60 |
141 #define r1_offset func_disp_offset+12 | 153 #define r1_offset func_disp_offset+12 |
142 int code_disp_offset = 0; int jump_offset = 0; | 154 int code_disp_offset = 0; int jump_offset = 0; |
591 int ptcptr=ptr_cache; | 603 int ptcptr=ptr_cache; |
592 int g = (int)nptr; | 604 int g = (int)nptr; |
593 int p,p1; | 605 int p,p1; |
594 char *rrn; | 606 char *rrn; |
595 | 607 |
608 p1 = ptcptr; p = cadr(p1); /* unnecesary, if ptcptr is initialized */ | |
596 while(ptcptr) { | 609 while(ptcptr) { |
597 if(car(ptcptr)==g) return caddr(ptcptr); | 610 if(car(ptcptr)==g) return caddr(ptcptr); |
598 p1=p; p=ptcptr; | 611 p1=p; p=ptcptr; |
599 ptcptr=cadr(ptcptr); | 612 ptcptr=cadr(ptcptr); |
600 } | 613 } |
602 cadr(p) = ptr_cache; /* connect current queue to the last one */ | 615 cadr(p) = ptr_cache; /* connect current queue to the last one */ |
603 ptr_cache = p; /* now the last one is the top */ | 616 ptr_cache = p; /* now the last one is the top */ |
604 if (!caddr(p)) { | 617 if (!caddr(p)) { |
605 if((r=get_register())) { | 618 if((r=get_register())) { |
606 caddr(p)=r; regs[r]=PTRC_REG; | 619 caddr(p)=r; regs[r]=PTRC_REG; |
607 } else | 620 } else { |
621 error(-1); | |
608 r=creg; /* this can't happen */ | 622 r=creg; /* this can't happen */ |
623 } | |
609 car(p)=g; | 624 car(p)=g; |
625 } else { | |
626 r = caddr(p); | |
610 } | 627 } |
611 rrn = register_name(r); | 628 rrn = register_name(r); |
612 if (nptr->sc==STATIC) { | 629 if (nptr->sc==STATIC) { |
613 printf("\taddis %s,r31,ha16(_%s-L_%d)\n", | 630 printf("\taddis %s,r31,ha16(_%s-L_%d)\n", |
614 rrn,nptr->nm,code_base); | 631 rrn,nptr->nm,code_base); |
1291 function(int e1) | 1308 function(int e1) |
1292 { | 1309 { |
1293 int e2,e3,e4,e5,nargs,t,r0,r1; | 1310 int e2,e3,e4,e5,nargs,t,r0,r1; |
1294 int arg,reg_arg,freg_arg,arg_assign; | 1311 int arg,reg_arg,freg_arg,arg_assign; |
1295 int reg_arg_list=0,ret_type,special_lvar; | 1312 int reg_arg_list=0,ret_type,special_lvar; |
1296 NMTBL *fn; | 1313 NMTBL *fn = 0; |
1297 int jmp = 0; | 1314 int jmp = 0; |
1298 char *jrn; | 1315 char *jrn; |
1299 | 1316 |
1300 special_lvar = -1; | 1317 special_lvar = -1; |
1301 ret_type = cadddr(e1); | 1318 ret_type = cadddr(e1); |
2448 fregv[freg]=0; | 2465 fregv[freg]=0; |
2449 } | 2466 } |
2450 | 2467 |
2451 void dtosop(int op,int e1) | 2468 void dtosop(int op,int e1) |
2452 { | 2469 { |
2453 char *opn; | 2470 char *opn=""; |
2454 char *frn=fregister_name(freg); | 2471 char *frn=fregister_name(freg); |
2455 char *grn=fregister_name(e1); | 2472 char *grn=fregister_name(e1); |
2456 fregv[freg]=1; | 2473 fregv[freg]=1; |
2457 switch(op) { | 2474 switch(op) { |
2458 case DADD: opn="fadd"; break; | 2475 case DADD: opn="fadd"; break; |