Mercurial > hg > CbC > old > device
comparison mc-code-mips.c @ 285:912b54949344
register assop const ( int/long )
author | kono |
---|---|
date | Tue, 01 Jun 2004 12:42:36 +0900 |
parents | ec1a68133f6a |
children | a0779a414855 |
comparison
equal
deleted
inserted
replaced
284:ec1a68133f6a | 285:912b54949344 |
---|---|
1966 } | 1966 } |
1967 | 1967 |
1968 static void | 1968 static void |
1969 code_call(int e2,NMTBL *fn,int jmp) | 1969 code_call(int e2,NMTBL *fn,int jmp) |
1970 { | 1970 { |
1971 char *jrn; | 1971 // char *jrn; |
1972 if (fnptr->sc==CODE) { | 1972 if (fnptr->sc==CODE) { |
1973 if (car(e2) == FNAME) { | 1973 if (car(e2) == FNAME) { |
1974 printf("\tla\t$25,%s\n",fn->nm); | 1974 printf("\tla\t$25,%s\n",fn->nm); |
1975 } else { | 1975 } else { |
1976 jrn = register_name(cadr(jmp)); | 1976 // jrn = register_name(cadr(jmp)); |
1977 printf("\tmove\t$25,%s\n",jrn); | 1977 // printf("\tmove\t$25,%s\n",jrn); |
1978 } | 1978 } |
1979 printf("\tjalr\t$25\n"); | 1979 printf("\tjalr\t$25\n"); |
1980 printf("\tlw\t$gp,$L_%d($sp)\n",cprestore_label); | 1980 printf("\tlw\t$gp,$L_%d($sp)\n",cprestore_label); |
1981 } else { | 1981 } else { |
1982 if (car(e2) == FNAME) { | 1982 if (car(e2) == FNAME) { |
1983 printf("\tjal\t%s\n",fn->nm); | 1983 printf("\tjal\t%s\n",fn->nm); |
1984 } else { | 1984 } else { |
1985 jrn = register_name(cadr(jmp)); | 1985 // jrn = register_name(cadr(jmp)); |
1986 printf("\tmove $25,%s\n",jrn); | 1986 // printf("\tmove $25,%s\n",jrn); |
1987 printf("\tjal\t$31,$25\n"); | 1987 printf("\tjal\t$31,$25\n"); |
1988 } | 1988 } |
1989 } | 1989 } |
1990 } | 1990 } |
1991 | 1991 |
2014 for(t = caddr(cadddr(e1));t;t = cadr(t)) { | 2014 for(t = caddr(cadddr(e1));t;t = cadr(t)) { |
2015 if (car(t)==DOTS) dots = 1; | 2015 if (car(t)==DOTS) dots = 1; |
2016 } | 2016 } |
2017 } | 2017 } |
2018 | 2018 |
2019 arg_assign = 0; | |
2019 e2 = cadr(e1); | 2020 e2 = cadr(e1); |
2020 if (car(e2) == FNAME) { | 2021 if (car(e2) == FNAME) { |
2021 fn=(NMTBL *)cadr(e2); | 2022 fn=(NMTBL *)cadr(e2); |
2022 } else { | 2023 } else { |
2023 jmp = get_register_var(0); | 2024 if (car(e2)==INDIRECT) e2=cadr(e2); // (*func)(i) case |
2024 if (car(jmp)!=REGISTER) error(-1); | 2025 jmp = list2(REGISTER,25); |
2025 reg_arg_list = list2(jmp,reg_arg_list); | 2026 if (!simple_arg(e2)) { |
2026 g_expr(e2); | 2027 e3=get_register_var(0); |
2027 if (!is_int_reg(creg)) error(-1); | 2028 g_expr_u(assign_expr0(e3,e2,INT,INT)); |
2028 code_register(creg,cadr(jmp)); | 2029 e2=e3; |
2029 /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */ | 2030 } |
2031 arg_assign = list2(assign_expr0(jmp,e2,INT,INT),arg_assign); | |
2030 } | 2032 } |
2031 /* First we execute complex argument to avoid interaction with | 2033 /* First we execute complex argument to avoid interaction with |
2032 input variables. Remain the last complex argument in complex_. */ | 2034 input variables. Remain the last complex argument in complex_. */ |
2033 stargs = 0; | 2035 stargs = 0; |
2034 complex_ = 0; | 2036 complex_ = 0; |
2098 reg_arg_list = compute_complex_arg(complex_,reg_arg_list,arg); | 2100 reg_arg_list = compute_complex_arg(complex_,reg_arg_list,arg); |
2099 car(complex_) = 0; // done. | 2101 car(complex_) = 0; // done. |
2100 } | 2102 } |
2101 } | 2103 } |
2102 | 2104 |
2103 nargs = reg_arg = freg_arg = arg_assign = 0; | 2105 nargs = reg_arg = freg_arg = 0; |
2104 // calc stack arguments first, it may requires extra registers, | 2106 // calc stack arguments first, it may requires extra registers, |
2105 // and we can still use input registers now. | 2107 // and we can still use input registers now. |
2106 for (e3 = e1; e3; | 2108 for (e3 = e1; e3; |
2107 increment_function_arg(e3,&nargs,®_arg,&freg_arg), | 2109 increment_function_arg(e3,&nargs,®_arg,&freg_arg), |
2108 e3 = cadr(e3)) { | 2110 e3 = cadr(e3)) { |
2431 int edx = get_register(); if(!edx) error(-1); | 2433 int edx = get_register(); if(!edx) error(-1); |
2432 // (*creg) op = pop() | 2434 // (*creg) op = pop() |
2433 | 2435 |
2434 use_int(creg); | 2436 use_int(creg); |
2435 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ | 2437 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */ |
2438 #if 1 | |
2439 set_ireg(edx,0); | |
2440 ld_indexx(byte,0,creg,ireg,sign); | |
2441 tosop(op,ireg,xreg); | |
2442 crn = register_name(ireg); | |
2443 drn = register_name(creg); | |
2444 if (byte==1) { | |
2445 printf("\tsb %s,0(%s)\n",crn,drn); | |
2446 } else if (byte==SIZE_OF_SHORT) { | |
2447 printf("\tsh %s,0(%s)\n",crn,drn); | |
2448 } else { | |
2449 printf("\tsw %s,0(%s)\n",crn,drn); | |
2450 } | |
2451 free_register(edx); | |
2452 emit_pop_free(xreg); | |
2453 #else | |
2436 printf("# assop\n\tmove %s,%s\n",register_name(edx),register_name(creg)); | 2454 printf("# assop\n\tmove %s,%s\n",register_name(edx),register_name(creg)); |
2437 ld_indexx(byte,0,edx,creg,sign); | 2455 ld_indexx(byte,0,edx,creg,sign); |
2438 tosop(op,creg,xreg); | 2456 tosop(op,creg,xreg); |
2439 crn = register_name(creg); | 2457 crn = register_name(creg); |
2440 drn = register_name(edx); | 2458 drn = register_name(edx); |
2445 } else { | 2463 } else { |
2446 printf("\tsw %s,0(%s)\n",crn,drn); | 2464 printf("\tsw %s,0(%s)\n",crn,drn); |
2447 } | 2465 } |
2448 free_register(edx); | 2466 free_register(edx); |
2449 emit_pop_free(xreg); | 2467 emit_pop_free(xreg); |
2468 #endif | |
2450 } | 2469 } |
2451 | 2470 |
2452 | 2471 |
2453 void | 2472 void |
2454 tosop(int op,int creg,int oreg) | 2473 tosop(int op,int creg,int oreg) |
2691 asi = fopen(p,"w"); | 2710 asi = fopen(p,"w"); |
2692 cheapp = p; | 2711 cheapp = p; |
2693 printf(".include \"%s\"\n",p); | 2712 printf(".include \"%s\"\n",p); |
2694 if (!asi) error(-1); | 2713 if (!asi) error(-1); |
2695 } | 2714 } |
2715 | |
2716 // should have pcond_const | |
2696 | 2717 |
2697 static void | 2718 static void |
2698 pcond(int op, int r2,int r1,int r0,int cond,int l1) | 2719 pcond(int op, int r2,int r1,int r0,int cond,int l1) |
2699 { | 2720 { |
2700 char *slt = "slt"; | 2721 char *slt = "slt"; |