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 {