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,&reg_arg,&freg_arg), 2109 increment_function_arg(e3,&nargs,&reg_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";