Mercurial > hg > CbC > old > device
comparison mc-code-powerpc.c @ 367:4efbb07f556b
global variable offset
author | kono |
---|---|
date | Wed, 07 Jul 2004 20:50:07 +0900 |
parents | 2d510935c37d |
children | be56772ab12a |
comparison
equal
deleted
inserted
replaced
366:2d510935c37d | 367:4efbb07f556b |
---|---|
1106 { | 1106 { |
1107 clear_ptr_cache(); | 1107 clear_ptr_cache(); |
1108 printf("L_%d:\n",labelno); | 1108 printf("L_%d:\n",labelno); |
1109 } | 1109 } |
1110 | 1110 |
1111 static void | |
1112 code_add(int reg,int offset,int r) | |
1113 { | |
1114 char *crn = register_name(reg); | |
1115 char *rrn = register_name(r); | |
1116 if (offset==0) { | |
1117 if(r!=reg) | |
1118 printf("\tmr %s,%s\n",crn,rrn); | |
1119 } else if (offset<-32768||32767<offset) { | |
1120 printf("\tla %s,ha16(%d)(%s)\n",crn,offset,rrn); | |
1121 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,offset); | |
1122 } else | |
1123 printf("\taddi %s,%s,%d\n",crn,rrn,offset); | |
1124 } | |
1125 | |
1126 static void | |
1127 code_ld(char *ld,int reg,int offset,int r) | |
1128 { | |
1129 char *crn = register_name(reg); | |
1130 char *rrn = register_name(r); | |
1131 if (offset<-32768||32767<offset) { | |
1132 printf("\tla %s,ha16(%d)(%s)\n",crn,offset,rrn); | |
1133 printf("\t%s %s,%s,lo16(%d)\n",ld,crn,crn,offset); | |
1134 } else | |
1135 printf("\t%s %s,%d(%s)\n",ld,crn,offset,rrn); | |
1136 } | |
1137 | |
1138 static void | |
1139 code_ldf(char *ld,char *crn,int offset,int r) | |
1140 { | |
1141 char *rrn = register_name(r); | |
1142 int reg; | |
1143 char *lrn; | |
1144 if (offset<-32768||32767<offset) { | |
1145 lrn = register_name(reg = get_register()); | |
1146 printf("\tla %s,ha16(%d)(%s)\n",lrn,offset,rrn); | |
1147 printf("\t%s %s,%s,lo16(%d)\n",ld,crn,lrn,offset); | |
1148 free_register(reg); | |
1149 } else | |
1150 printf("\t%s %s,%d(%s)\n",ld,crn,offset,rrn); | |
1151 } | |
1152 | |
1111 void | 1153 void |
1112 code_gvar(int e1,int reg) { | 1154 code_gvar(int e1,int reg) { |
1113 int r; | |
1114 use_int(reg); | 1155 use_int(reg); |
1115 r = get_ptr_cache((NMTBL*)cadr(e1)); | 1156 code_add(reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1))); |
1116 if(r!=reg) | |
1117 printf("\tmr %s,%s\n",register_name(reg),register_name(r)); | |
1118 return; | 1157 return; |
1119 } | 1158 } |
1120 | 1159 |
1121 void | 1160 void |
1122 code_rgvar(int e1,int reg) { | 1161 code_rgvar(int e1,int reg) { |
1123 use_int(reg); | 1162 use_int(reg); |
1124 printf("\tlwz %s,0(%s)\n",register_name(reg), | 1163 code_ld("lwz",reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1))); |
1125 register_name(get_ptr_cache((NMTBL*)cadr(e1)))); | |
1126 } | 1164 } |
1127 | 1165 |
1128 void | 1166 void |
1129 code_crgvar(int e1,int reg,int sign,int sz){ | 1167 code_crgvar(int e1,int reg,int sign,int sz){ |
1130 char *crn; | |
1131 use_int(reg); | 1168 use_int(reg); |
1132 crn = register_name(reg); | 1169 code_ld(cload(sz),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1))); |
1133 printf("\t%s %s,0(%s)\n",cload(sz),crn, | |
1134 register_name(get_ptr_cache((NMTBL*)cadr(e1)))); | |
1135 cext(sign,sz,reg); | 1170 cext(sign,sz,reg); |
1136 } | 1171 } |
1137 | 1172 |
1138 | 1173 |
1139 | 1174 |
1404 } | 1439 } |
1405 | 1440 |
1406 void | 1441 void |
1407 code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) { | 1442 code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) { |
1408 int r; | 1443 int r; |
1409 char *crn; | |
1410 use_int(reg); | 1444 use_int(reg); |
1411 crn = register_name(reg); | 1445 code_ld(cload(sz),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1))); |
1412 r = get_ptr_cache((NMTBL*)cadr(e1)); | |
1413 printf("\t%s %s,0(%s)\n",cload(sz),crn,register_name(r)); | |
1414 cext(0,sz,r); | 1446 cext(0,sz,r); |
1415 inc_cmpflag(); | 1447 inc_cmpflag(); |
1416 printf("\tcmpwi cr%d,%s,0\n",cmpflag,crn); | 1448 printf("\tcmpwi cr%d,%s,0\n",cmpflag,register_name(reg)); |
1417 jcond(label,cond); | 1449 jcond(label,cond); |
1418 } | 1450 } |
1419 | 1451 |
1420 | 1452 |
1421 void | 1453 void |
1431 } | 1463 } |
1432 | 1464 |
1433 | 1465 |
1434 void | 1466 void |
1435 code_cmp_rgvar(int e1,int reg,int label,int cond) { | 1467 code_cmp_rgvar(int e1,int reg,int label,int cond) { |
1436 int r; | |
1437 char *crn; | |
1438 use_int(reg); | 1468 use_int(reg); |
1439 crn = register_name(reg); | 1469 code_ld("lwz",reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1))); |
1440 r = get_ptr_cache((NMTBL*)cadr(e1)); | |
1441 printf("\tlwz %s,0(%s)\n",crn,register_name(r)); | |
1442 code_cmp_register(reg,label,cond); | 1470 code_cmp_register(reg,label,cond); |
1443 } | 1471 } |
1444 | 1472 |
1445 | 1473 |
1446 void | 1474 void |
2287 lload(creg0,reg,offset); | 2315 lload(creg0,reg,offset); |
2288 return us?ULONGLONG:LONGLONG; | 2316 return us?ULONGLONG:LONGLONG; |
2289 } | 2317 } |
2290 #endif | 2318 #endif |
2291 | 2319 |
2292 | |
2293 void | 2320 void |
2294 code_assign_gvar(int e2,int creg,int byte) { | 2321 code_assign_gvar(int e2,int creg,int byte) { |
2295 int r; | |
2296 use_int(creg); | 2322 use_int(creg); |
2297 r = get_ptr_cache((NMTBL*)cadr(e2)); | 2323 code_ldf(cstore(byte),register_name(creg),cadr(e2), |
2298 code_assign(r,byte,creg); | 2324 get_ptr_cache((NMTBL*)caddr(e2))); |
2299 } | 2325 } |
2300 | 2326 |
2301 void | 2327 void |
2302 code_assign_lvar(int e2,int creg,int byte) { | 2328 code_assign_lvar(int e2,int creg,int byte) { |
2303 char *crn; | 2329 char *crn; |
2304 use_int(creg); | 2330 use_int(creg); |
2305 crn=register_name(creg); | 2331 crn=register_name(creg); |
2306 lvar_intro(e2); | 2332 lvar_intro(e2); |
2307 if (byte==1) { | 2333 printf("\t%s %s,",cstore(byte),crn); |
2308 printf("\tstb %s,",crn); | |
2309 } else if (byte==SIZE_OF_SHORT) { | |
2310 printf("\tsth %s,",crn); | |
2311 } else { | |
2312 printf("\tstw %s,",crn); | |
2313 } | |
2314 lvar(e2); | 2334 lvar(e2); |
2315 } | 2335 } |
2316 | 2336 |
2317 void | 2337 void |
2318 code_assign_register(int e2,int byte,int creg) { | 2338 code_assign_register(int e2,int byte,int creg) { |
2328 use_int(e2); | 2348 use_int(e2); |
2329 drn=register_name(e2); | 2349 drn=register_name(e2); |
2330 use_int(creg); | 2350 use_int(creg); |
2331 crn=register_name(creg); | 2351 crn=register_name(creg); |
2332 | 2352 |
2333 if (byte==1) { | 2353 printf("\t%s %s,0(%s)\n",cstore(byte),crn,drn); |
2334 printf("\tstb %s,0(%s)\n",crn,drn); | |
2335 } else if (byte==SIZE_OF_SHORT) { | |
2336 printf("\tsth %s,0(%s)\n",crn,drn); | |
2337 } else { | |
2338 printf("\tstw %s,0(%s)\n",crn,drn); | |
2339 } | |
2340 } | 2354 } |
2341 | 2355 |
2342 | 2356 |
2343 void | 2357 void |
2344 code_register_assop(int e2,int reg, int op,int byte) { | 2358 code_register_assop(int e2,int reg, int op,int byte) { |
2990 printf("\t.long\t0x%x\n",*(int *)&f); | 3004 printf("\t.long\t0x%x\n",*(int *)&f); |
2991 #endif | 3005 #endif |
2992 } | 3006 } |
2993 | 3007 |
2994 extern void | 3008 extern void |
2995 emit_address(char *s) | 3009 emit_address(char *s,int offset) |
2996 { | 3010 { |
2997 data_mode(0); | 3011 data_mode(0); |
2998 printf("\t.long _%s\n",s); | 3012 if (offset) |
3013 printf("\t.long _%s+%d\n",s,offset); | |
3014 else | |
3015 printf("\t.long _%s\n",s); | |
2999 } | 3016 } |
3000 | 3017 |
3001 extern void | 3018 extern void |
3002 emit_label(int labelno) | 3019 emit_label(int labelno) |
3003 { | 3020 { |
3214 } | 3231 } |
3215 | 3232 |
3216 void | 3233 void |
3217 code_dassign_gvar(int e2,int freg,int d) | 3234 code_dassign_gvar(int e2,int freg,int d) |
3218 { | 3235 { |
3219 int r; | |
3220 use_float(d,freg); | 3236 use_float(d,freg); |
3221 r = get_ptr_cache((NMTBL*)cadr(e2)); | 3237 code_ldf(fstore(d),fregister_name(freg),cadr(e2), |
3222 printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(r)); | 3238 get_ptr_cache((NMTBL*)caddr(e2))); |
3223 } | 3239 } |
3224 | 3240 |
3225 void | 3241 void |
3226 code_dassign_lvar(int e2,int freg,int d) | 3242 code_dassign_lvar(int e2,int freg,int d) |
3227 { | 3243 { |
3488 code_u2f() { code_u2d(); } | 3504 code_u2f() { code_u2d(); } |
3489 | 3505 |
3490 void | 3506 void |
3491 code_drgvar(int e2,int d,int freg) | 3507 code_drgvar(int e2,int d,int freg) |
3492 { | 3508 { |
3493 int r; | |
3494 r = get_ptr_cache((NMTBL*)cadr(e2)); | |
3495 use_float(d,freg); | 3509 use_float(d,freg); |
3496 printf("\t%s %s,0(%s)\n",fload(d),fregister_name(freg),register_name(r)); | 3510 code_ldf(fload(d),fregister_name(freg),cadr(e2), |
3511 get_ptr_cache((NMTBL*)caddr(e2))); | |
3497 } | 3512 } |
3498 | 3513 |
3499 | 3514 |
3500 void | 3515 void |
3501 code_drlvar(int e2,int d,int freg) | 3516 code_drlvar(int e2,int d,int freg) |
3506 } | 3521 } |
3507 | 3522 |
3508 void | 3523 void |
3509 code_cmp_drgvar(int e2,int reg,int d,int label,int cond) | 3524 code_cmp_drgvar(int e2,int reg,int d,int label,int cond) |
3510 { | 3525 { |
3511 int r; | |
3512 char *frn; | 3526 char *frn; |
3513 int g=get_dregister(d); | 3527 int g=get_dregister(d); |
3514 char *grn=fregister_name(g); | 3528 char *grn=fregister_name(g); |
3515 | 3529 |
3516 use_float(d,reg); | 3530 use_float(d,reg); |
3517 frn=fregister_name(reg); | 3531 frn=fregister_name(reg); |
3518 | 3532 |
3519 r = get_ptr_cache((NMTBL*)cadr(e2)); | 3533 code_ldf(fload(1),grn,cadr(e2), |
3520 printf("\t%s %s,0(%s)\n",fload(1),grn,register_name(r)); | 3534 get_ptr_cache((NMTBL*)caddr(e2))); |
3521 inc_cmpflag(); | 3535 inc_cmpflag(); |
3522 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn); | 3536 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn); |
3523 free_register(g); | 3537 free_register(g); |
3524 jcond(label,cond); | 3538 jcond(label,cond); |
3525 } | 3539 } |
3961 | 3975 |
3962 void | 3976 void |
3963 code_lassign_gvar(int e2,int creg) | 3977 code_lassign_gvar(int e2,int creg) |
3964 { | 3978 { |
3965 int r; | 3979 int r; |
3966 r = get_ptr_cache((NMTBL*)cadr(e2)); | 3980 use_longlong(creg); |
3967 code_lassign(r,creg); | 3981 r = get_ptr_cache((NMTBL*)caddr(e2)); |
3982 code_ldf(cstore(0),lregister_name_high(creg),cadr(e2),r); | |
3983 code_ldf(cstore(0),lregister_name_low(creg),cadr(e2)+SIZE_OF_INT,r); | |
3968 } | 3984 } |
3969 | 3985 |
3970 void | 3986 void |
3971 code_lassign_lvar(int e2,int creg) | 3987 code_lassign_lvar(int e2,int creg) |
3972 { | 3988 { |
4031 char *crn_h; | 4047 char *crn_h; |
4032 char *crn_l; | 4048 char *crn_l; |
4033 use_longlong(creg); | 4049 use_longlong(creg); |
4034 crn_h = lregister_name_high(creg); | 4050 crn_h = lregister_name_high(creg); |
4035 crn_l = lregister_name_low(creg); | 4051 crn_l = lregister_name_low(creg); |
4036 r = get_ptr_cache((NMTBL*)cadr(e1)); | 4052 r = get_ptr_cache((NMTBL*)caddr(e1)); |
4037 printf("\tlwz %s,0(%s)\n",crn_h,register_name(r)); | 4053 code_ldf(cload(0),crn_h,cadr(e1),r); |
4038 printf("\tlwz %s,%d(%s)\n",crn_l,SIZE_OF_INT,register_name(r)); | 4054 code_ldf(cload(0),crn_l,cadr(e1)+SIZE_OF_INT,r); |
4039 } | 4055 } |
4040 | 4056 |
4041 void | 4057 void |
4042 code_lrlvar(int e1,int creg) | 4058 code_lrlvar(int e1,int creg) |
4043 { | 4059 { |