Mercurial > hg > CbC > old > device
changeset 227:ed92cef127f1
*** empty log message ***
author | kono |
---|---|
date | Tue, 27 Apr 2004 18:32:28 +0900 |
parents | a31e1d24c097 |
children | 21b311266011 |
files | Changes mc-code-powerpc.c test/code-gen.c |
diffstat | 3 files changed, 124 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Tue Apr 27 10:32:32 2004 +0900 +++ b/Changes Tue Apr 27 18:32:28 2004 +0900 @@ -4056,3 +4056,6 @@ まぁ、ia32 は、eax,edx にlong,long を積んで、あとは、 対メモリで計算するわけね。そうだろうな。むしろ、 やさしいかも。 + +あぁ、そうか、long の引数の渡し方は、 +r10 はレジスタ、残りはメモリに入るわけね。
--- a/mc-code-powerpc.c Tue Apr 27 10:32:32 2004 +0900 +++ b/mc-code-powerpc.c Tue Apr 27 18:32:28 2004 +0900 @@ -696,10 +696,10 @@ ll = get_lregister0(); if (i!=-1) { if (is_code) { - if(!(i+1<REG_VAR_BASE-REG_VAR_MIN)) return 0; + if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0; i = REG_VAR_BASE-i; } else { - if (i<0||i+1>=MAX_INPUT_REGISTER_VAR) return 0; + if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0; i = i+MIN_TMP_REG; } regv_h(ll)=i; @@ -1691,8 +1691,16 @@ nargs ++ ; reg_arg++; continue; } else if (t==LONGLONG||t==ULONGLONG) { - if (reg_arg+1>=MAX_INPUT_REGISTER_VAR) { + if (reg_arg>=MAX_INPUT_REGISTER_VAR) { arg = list2(LVAR,caller_arg_offset_v(nargs)); + } else if (reg_arg+1>=MAX_INPUT_REGISTER_VAR) { + // half register, half memory case + // put whole long long anyway + arg = list2(LVAR,caller_arg_offset_v(nargs)); + arg_assign = list2( + assign_expr0(get_input_register_var(reg_arg,0,0), + arg,INT,INT), + arg_assign); } else if (!simple_args(e3) && cadr(e3)) { arg = get_lregister_var(0); arg_assign = list2( @@ -3186,8 +3194,8 @@ switch(op) { case DOP+GE: case FOP+GE: - printf("\tcror 2,29,30\n"); - printf("\tbne\tcr0,L_%d\n",l1); + printf("\tcrnor 30,29,30\n"); + printf("\tbeq\tcr0,L_%d\n",l1); break; case DOP+GT: case FOP+GT: @@ -3243,7 +3251,14 @@ static void lmove(int to,int from) { - if (regv_h(to)==regv_l(from)) { + int tmp; + if (regv_h(to)==regv_l(from)&&(regv_l(to)==regv_h(from))) { + tmp = get_register(); + printf("\tmr %s,%s\n",lregister_name_low(tmp),lregister_name_low(from)); + printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from)); + printf("\tmr %s,%s\n",lregister_name_low(to),register_name(tmp)); + free_register(tmp); + } else if (regv_h(to)==regv_l(from)) { printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from)); printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from)); } else {
--- a/test/code-gen.c Tue Apr 27 10:32:32 2004 +0900 +++ b/test/code-gen.c Tue Apr 27 18:32:28 2004 +0900 @@ -250,7 +250,8 @@ // code_gt(int cond) -void code_gt() +void +code_gt() { if (i1>i2) printf("code_gt 1\n"); @@ -259,7 +260,8 @@ } // code_ugt(int cond) -void code_ugt() +void +code_ugt() { if (ui1>ui2) printf("code_ugt 1\n"); @@ -268,7 +270,8 @@ } // code_ge(int cond) -void code_ge() +void +code_ge() { if (i1>=i2) printf("code_ge 1\n"); @@ -277,7 +280,8 @@ } // code_uge(int cond) -void code_uge() +void +code_uge() { if (ui1>=ui2) printf("code_uge 1\n"); @@ -286,7 +290,8 @@ } // code_eq(int cond) -void code_eq() +void +code_eq() { if (ui1==ui2) printf("code_eq 1\n"); @@ -303,18 +308,10 @@ void code_bool() { - printf("code_bool %d %d %d %d %d %d\n", + printf("code_bool gvar %d %d %d %d %d %d\n", i1>i2,ui1>ui2,i1>=i2,ui1>=ui2,ui1==ui2,i1!=i2); -#if FLOAT_CODE - printf("code_bool float %d %d %d %d\n", - f0>f1,f0>=f1,f0==f1,f0!=f1); - printf("code_bool double %d %d %d %d\n", - d0>d1,d0>=d1,d0==d1,d0!=d1); -#endif -#if LONGLONG_CODE - printf("code_bool long long %d %d %d %d %d %d\n", - l1>l0,ul1>ul0,l1>=l0,ul1>=ul0,ul1==ul0,l1!=l0); -#endif + printf("code_bool gvar %d %d %d %d %d %d\n", + i1<i2,ui1<ui2,i1<=i2,ui1<=ui2,ui1==ui2,i1!=i2); } void @@ -492,6 +489,7 @@ pi2 = &i2; pui1 = &ui1; pui2 = &ui2; + printf("code_lrindirect %llx %llx %llx %llx\n",*pi1,*pi2,*pui1,*pui2); printf("code_lrindirect %lld %lld %llu %llu\n",*pi1,*pi2,*pui1,*pui2); } @@ -792,7 +790,8 @@ } // code_d2i(int freg0) -void code_d2i() +void +code_d2i() { double d; int i; @@ -801,7 +800,8 @@ printf("code_d2i %d\n",i); } // code_i2d(int creg0) -void code_i2d() +void +code_i2d() { double d; int i; @@ -810,7 +810,8 @@ printf("code_i2d %g\n",d); } // code_d2u(int freg0) -void code_d2u() +void +code_d2u() { double d; unsigned int i; @@ -819,7 +820,8 @@ printf("code_d2u %ud\n",i); } // code_u2d(int creg0) -void code_u2d() +void +code_u2d() { double d; unsigned int i; @@ -828,7 +830,8 @@ printf("code_u2d %g\n",d); } // code_f2i(int freg0) -void code_f2i() +void +code_f2i() { float d; int i; @@ -837,7 +840,8 @@ printf("code_d2i %d\n",i); } // code_i2f(int creg0) -void code_i2f() +void +code_i2f() { float d; int i; @@ -846,7 +850,8 @@ printf("code_i2f %g\n",d); } // code_f2u(int freg0) -void code_f2u() +void +code_f2u() { float d; unsigned int i; @@ -855,7 +860,8 @@ printf("code_f2u %ud\n",i); } // code_u2f(int creg0) -void code_u2f() +void +code_u2f() { float d; unsigned int i; @@ -886,6 +892,14 @@ f0 = 0.0; f1 = 0.2; d0 = 10; d1 = 10e10; printf("code_lvar float %f %f %g %g\n",f0,f1,d0,d1); + printf("code_bool lvar float %d %d %d %d\n", + f0>f1,f0>=f1,f0==f1,f0!=f1); + printf("code_bool lvar double %d %d %d %d\n", + d0>d1,d0>=d1,d0==d1,d0!=d1); + printf("code_bool lvar float %d %d %d %d\n", + f0<f1,f0<=f1,f0==f1,f0!=f1); + printf("code_bool lvar double %d %d %d %d\n", + d0<d1,d0<=d1,d0==d1,d0!=d1); } @@ -1005,7 +1019,8 @@ // case FOP+NEQ: // code_gt(int cond) -void code_dgt() +void +code_dgt() { if (d0>d1) printf("code_gt 1\n"); @@ -1014,7 +1029,8 @@ } // code_ugt(int cond) -void code_fgt() +void +code_fgt() { if (f0>f1) printf("code_fgt 1\n"); @@ -1023,7 +1039,8 @@ } // code_ge(int cond) -void code_dge() +void +code_dge() { if (d0>=d1) printf("code_dge 1\n"); @@ -1032,7 +1049,8 @@ } // code_uge(int cond) -void code_fge() +void +code_fge() { if (f0>=f1) printf("code_fge 1\n"); @@ -1041,7 +1059,8 @@ } // code_eq(int cond) -void code_deq() +void +code_deq() { if (f0==f1) printf("code_feq 1\n"); @@ -1062,6 +1081,10 @@ f0>f1,f0>=f1,f0==f1,f0!=f1); printf("code_bool double %d %d %d %d\n", d0>d1,d0>=d1,d0==d1,d0!=d1); + printf("code_bool float %d %d %d %d\n", + f0<f1,f0<=f1,f0==f1,f0!=f1); + printf("code_bool double %d %d %d %d\n", + d0<d1,d0<=d1,d0==d1,d0!=d1); } #endif @@ -1073,6 +1096,8 @@ { printf("code_bool long long %d %d %d %d %d %d\n", l1>l0,ul1>ul0,l1>=l0,ul1>=ul0,ul1==ul0,l1!=l0); + printf("code_bool long long %d %d %d %d %d %d\n", + l1<l0,ul1<ul0,l1<=l0,ul1<=ul0,ul1==ul0,l1!=l0); } // int lpop_register() @@ -1189,6 +1214,10 @@ ul0 = 123123123LL; ul1 = 123123123LL; printf("code_lvar long long %lld %lld %llu %llu\n",l0,l1,ul0,ul1); + printf("code_bool lvar long long %d %d %d %d %d %d\n", + l1>l0,ul1>ul0,l1>=l0,ul1>=ul0,ul1==ul0,l1!=l0); + printf("code_bool lvar long long %d %d %d %d %d %d\n", + l1<l0,ul1<ul0,l1<=l0,ul1<=ul0,ul1==ul0,l1!=l0); } // ltosop(int e1,int e2) @@ -1343,7 +1372,8 @@ // code_i2ll(int creg) -void code_i2ll() +void +code_i2ll() { long long d; int i; @@ -1352,7 +1382,8 @@ printf("code_i2ll %lld\n",d); } // code_i2ull(int creg) -void code_i2ull() +void +code_i2ull() { unsigned long long d; int i; @@ -1361,7 +1392,8 @@ printf("code_i2ull %lld\n",d); } // code_u2ll(int creg) -void code_u2ll() +void +code_u2ll() { long long d; unsigned int i; @@ -1370,7 +1402,8 @@ printf("code_u2ll %lld\n",d); } // code_u2ull(int creg) -void code_u2ull() +void +code_u2ull() { unsigned long long d; unsigned int i; @@ -1379,7 +1412,8 @@ printf("code_u2ull %llu\n",d); } // code_ll2i(int creg) -void code_ll2i() +void +code_ll2i() { long long d; int i; @@ -1388,7 +1422,8 @@ printf("code_ll2i %d\n",i); } // code_ll2u(int creg) -void code_ll2u() +void +code_ll2u() { long long d; unsigned int i; @@ -1397,7 +1432,8 @@ printf("code_ll2i %ud\n",i); } // code_ull2i(int creg) -void code_ull2i() +void +code_ull2i() { unsigned long long d; int i; @@ -1406,7 +1442,8 @@ printf("code_ull2i %d\n",i); } // code_ull2u(int creg) -void code_ull2u() +void +code_ull2u() { unsigned long long d; unsigned int i; @@ -1416,7 +1453,8 @@ } #if FLOAT_CODE // code_d2ll(int creg) -void code_d2ll() +void +code_d2ll() { long long d; double i; @@ -1425,7 +1463,8 @@ printf("code_d2ll %lld\n",d); } // code_d2ull(int creg) -void code_d2ull() +void +code_d2ull() { unsigned long long d; double i; @@ -1434,7 +1473,8 @@ printf("code_d2ll %llu\n",d); } // code_f2ll(int creg) -void code_f2ll() +void +code_f2ll() { long long d; float i; @@ -1443,7 +1483,8 @@ printf("code_d2ll %lld\n",d); } // code_f2ull(int creg) -void code_f2ull() +void +code_f2ull() { unsigned long long d; float i; @@ -1452,7 +1493,8 @@ printf("code_d2ll %llu\n",d); } // code_ll2d(int creg) -void code_ll2d() +void +code_ll2d() { long long d; double i; @@ -1461,7 +1503,8 @@ printf("code_d2ll %g\n",i); } // code_ll2f(int creg) -void code_ll2f() +void +code_ll2f() { long long d; float i; @@ -1470,7 +1513,8 @@ printf("code_d2ll %g\n",i); } // code_ull2d(int creg) -void code_ull2d() +void +code_ull2d() { long long d; double i; @@ -1479,7 +1523,8 @@ printf("code_d2ll %g\n",i); } // code_ull2f(int creg) -void code_ull2f() +void +code_ull2f() { long long d; float i; @@ -1625,7 +1670,8 @@ // code_lgt(int cond) -void code_lgt() +void +code_lgt() { if (l0>l1) printf("code_lgt 1\n"); @@ -1634,7 +1680,8 @@ } // code_lugt(int cond) -void code_lugt() +void +code_lugt() { if (ul0>ul1) printf("code_lugt 1\n"); @@ -1643,7 +1690,8 @@ } // code_lge(int cond) -void code_lge() +void +code_lge() { if (l0>=l1) printf("code_lge 1\n"); @@ -1652,7 +1700,8 @@ } // code_luge(int cond) -void code_luge() +void +code_luge() { if (ul0>=ul1) printf("code_luge 1\n"); @@ -1661,7 +1710,8 @@ } // code_leq(int cond) -void code_leq() +void +code_leq() { if (ul0==ul1) printf("code_leq 1\n");