Mercurial > hg > CbC > old > device
changeset 440:a531bbf572e3
regression test (case, float, long long)
author | kono |
---|---|
date | Sat, 20 Nov 2004 17:06:05 +0900 |
parents | 65e379ba36b8 |
children | 1edaa643458e |
files | Changes Makefile mc-code-arm.c mc-code-ia32.c mc-code-mips.c mc-code-powerpc.c mc-codegen.c mc-parse.c mc-parse.h test/code-gen.c |
diffstat | 10 files changed, 312 insertions(+), 211 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Mon Nov 15 20:58:58 2004 +0900 +++ b/Changes Sat Nov 20 17:06:05 2004 +0900 @@ -6650,7 +6650,7 @@ code hoge1() { b; } では、a-> b に、そのまま落ちるべきだろうね。ファイルが分離される -場合は少し困るが.... +場合は少し困るが.... 型が合わない場合にエラーを出さないと。 if (0) hoge; でhogeが生成されてしまう。control で切っても出るね。 いや、消えてました。ただ、jmp は生成されてしまうね。checkret @@ -6666,3 +6666,19 @@ if (1) hoge else fuga ; で fuga が生成されてしまう。bexpr で always jump かどうかを返したいところだが... + +Mon Nov 15 21:25:15 JST 2004 + +構造的にはさ、inline は、CbC の外で行われるべきものだよね。 +内部で処理してもいいんだけど、本来は外でやるべきものです。 + +gcov は面白い! + +Sat Nov 20 16:44:38 JST 2004 + +古いswitchの実装が壊れている。lazy jump の影響らしい。 + +PowerPC が cmp immideate value を出力してない + +あれ、複数のファイルをコンパイルするときの問題があったような +気がするんだが...
--- a/Makefile Mon Nov 15 20:58:58 2004 +0900 +++ b/Makefile Sat Nov 20 17:06:05 2004 +0900 @@ -1,6 +1,8 @@ CC = gcc # -O3 CFLAGS = -g -Wall -I. +# CFLAGS = -g -Wall -I. -pg -fprofile-arcs -ftest-coverage +# LDFLAGS = -pg # for Linux Zaurus # CFLAGS = -fsigned-char -pipe -g -I. -I/home/zaurus/develop/include BASE=0 @@ -31,16 +33,16 @@ conv/conv.h conv/convdef.h conv/null.c mc-powerpc : mc-code-powerpc.o $(COMPLIB) $(CONVERTER) - $(CC) -g mc-code-powerpc.o $(COMPLIB) $(CONVERTER) -o $@ + $(CC) $(LDFLAGS) -g mc-code-powerpc.o $(COMPLIB) $(CONVERTER) -o $@ mc-ia32 : mc-code-ia32.o $(COMPLIB) $(CONVERTER) - $(CC) -g mc-code-ia32.o $(COMPLIB) $(CONVERTER) -o $@ + $(CC) $(LDFLAGS) -g mc-code-ia32.o $(COMPLIB) $(CONVERTER) -o $@ mc-mips : mc-code-mips.o $(COMPLIB) $(CONVERTER) - $(CC) -g mc-code-mips.o $(COMPLIB) $(CONVERTER) -o $@ + $(CC) $(LDFLAGS) -g mc-code-mips.o $(COMPLIB) $(CONVERTER) -o $@ mc-arm : mc-code-arm.o $(COMPLIB) $(CONVERTER) - $(CC) -g mc-code-arm.o $(COMPLIB) $(CONVERTER) -o $@ + $(CC) $(LDFLAGS) -g mc-code-arm.o $(COMPLIB) $(CONVERTER) -o $@ conv/conv.h: conv_func.tbl conv_func.pl perl conv_func.pl
--- a/mc-code-arm.c Mon Nov 15 20:58:58 2004 +0900 +++ b/mc-code-arm.c Sat Nov 20 17:06:05 2004 +0900 @@ -53,10 +53,9 @@ static void dconst(int l,int h,double value); static void code_assign_input_double_long(int e1,int e2) ; static void code_assign_input_float_int(int e1,int e2) ; +#endif static void use_input_reg(int reg,int mode); -#endif - static int creg; static int output_mode = TEXT_EMIT_MODE; static int register_save_return_label; @@ -213,7 +212,7 @@ return i; } -#if LONGLONG_CODE +#if LONGLONG_CODE||FLOAT_CODE #define use_longlong(reg) if (reg==USE_CREG) reg=use_longlong0() static @@ -237,6 +236,9 @@ static void lmove(int to,int from); #endif +#define USING_DREG 5 +#define INPUT_DREG 6 + #if FLOAT_CODE @@ -258,9 +260,6 @@ return i; } -#define USING_DREG 5 -#define INPUT_DREG 6 - static int use_double0() { int i; @@ -272,6 +271,19 @@ creg = i; return i; } + +void code_lassign_lvar(int e2,int creg); +int code_lrindirect(int e1, int reg, int offset, int us); +void code_lregister(int e2,int reg); +void code_lassign_gvar(int e2,int creg); +void code_lassign(int e2,int creg); +void code_lassign_lregister(int e2,int reg); +void code_lrgvar(int e1,int creg); +void code_lrlvar(int e1,int creg); +void emit_lpop_free(int xreg); +void emit_lpush(); +int emit_lpop(); + #endif @@ -284,9 +296,13 @@ static void code_save_stacks(); static void code_save_input_registers(int dots); static void set_ireg(int,int); +#if FLOAT_CODE static void set_dreg(int,int); static void set_freg(int,int); +#endif +#if LONGLONG_CODE static void set_lreg(int,int); +#endif static void inc_inst(int count); static int max_func_args; @@ -1250,6 +1266,7 @@ return i; } +#if FLOAT_CODE static int search_double_const(int tag,int value1,int value2,int *label) { @@ -1288,6 +1305,7 @@ } return i; } +#endif static void const_list_table() @@ -1769,14 +1787,18 @@ } static int rexpr_bool(int e1, int reg); +#if LONGLONG_CODE static int lrexpr_bool(int e1, int reg); +#endif void code_bool(int e1,int reg) { int e2,e3; char *xrn; if (rexpr_bool(e1, reg)) return; +#if LONGLONG_CODE if (lrexpr_bool(e1, reg)) return; +#endif b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */ if (use) { inc_inst(2); @@ -2052,6 +2074,7 @@ creg = freg = reg; } +#if LONGLONG_CODE||FLOAT_CODE static void set_lreg0(int reg,int mode) { @@ -2075,14 +2098,18 @@ } creg = lreg = reg; } - +#endif + +#if LONGLONG_CODE static void set_lreg(int reg,int mode) { if (!is_longlong_reg(reg)) error(-1); set_lreg0(reg,mode); } - +#endif + +#if FLOAT_CODE static void set_dreg(int reg,int mode) { @@ -2127,6 +2154,9 @@ set_lreg_operand(reg,mode); } + +#endif + void use_reg(int arg) { @@ -2274,6 +2304,7 @@ static void code_assign_input_float_int(int e1,int e2) { +#if FLOAT_CODE int r,tmp=-1; float f; char *frn; @@ -2299,10 +2330,12 @@ code_rlvar(tmp,r); if (tmp!=-1) free_lvar(tmp); } +#endif } static void code_assign_input_double_long(int e1,int e2) { +#if FLOAT_CODE int r,tmp=-1,reg; double value; // e1 = e2; @@ -2328,6 +2361,7 @@ printf("\tldmfd\tsp!, {%s, %s}\n",lregister_name_low(r),lregister_name_high(r)); } if (tmp!=-1) free_lvar(tmp); +#endif } static int @@ -2639,13 +2673,19 @@ free_register(i); } if (ret_type==DOUBLE) { +#if FLOAT_CODE set_dreg(RET_DREGISTER,0); use_reg(RET_DREGISTER); +#endif } else if (ret_type==FLOAT) { +#if FLOAT_CODE set_freg(RET_FREGISTER,0); +#endif } else if (ret_type==ULONGLONG||ret_type==LONGLONG) { +#if LONGLONG_CODE set_lreg(RET_LREGISTER,0); use_reg(RET_LREGISTER); +#endif } else if (ret_type==VOID) { } else { set_ireg(RET_REGISTER,0); @@ -2740,7 +2780,7 @@ } #endif -#if LONGLONG_CODE +#if LONGLONG_CODE||FLOAT_CODE static void lload(int creg,int reg,int offset) @@ -3343,11 +3383,15 @@ retcont1 = fwdlabel(); fwddef(retcont); if (cadr(fnptr->ty)==FLOAT) { +#if FLOAT_CODE creg = freg = cadr(get_input_dregister_var(0,0,1,0)); set_freg(RET_FREGISTER,1); +#endif } else if (cadr(fnptr->ty)==DOUBLE) { +#if FLOAT_CODE creg = lreg = cadr(get_input_dregister_var(0,0,1,1)); set_dreg(RET_DREGISTER,1); +#endif } else if (cadr(fnptr->ty)>0&&( car(cadr(fnptr->ty))==STRUCT || car(cadr(fnptr->ty))==UNION)) { @@ -3396,9 +3440,13 @@ if (cadr(fnptr->ty)==FLOAT) { set_freg(RET_FREGISTER,mode); } else if (cadr(fnptr->ty)==DOUBLE) { +#if FLOAT_CODE set_dreg(RET_DREGISTER,mode); +#endif } else if (cadr(fnptr->ty)==LONGLONG||cadr(fnptr->ty)==ULONGLONG) { +#if LONGLONG_CODE set_lreg(RET_LREGISTER,mode); +#endif } else if (cadr(fnptr->ty)==VOID) { } else { set_ireg(RET_REGISTER,mode); @@ -3408,9 +3456,13 @@ int code_get_fixed_creg(int reg,int type) { switch(type) { +#if FLOAT_CODE case DOUBLE: use_float(1,reg); break; case FLOAT: use_float(0,reg); break; +#endif +#if LONGLONG_CODE case LONGLONG: case ULONGLONG: use_longlong(reg); break; +#endif default: if (reg==USE_CREG) { if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) { @@ -3427,12 +3479,18 @@ void code_set_fixed_creg(int reg,int mode,int type) { if (type==FLOAT) { +#if FLOAT_CODE set_freg(reg,mode); +#endif } else if (type==DOUBLE) { +#if FLOAT_CODE set_dreg(reg,mode); +#endif } else if (type==LONGLONG||type==ULONGLONG) { +#if LONGLONG_CODE set_lreg(reg,mode); // use_reg(reg); +#endif } else { set_ireg(reg,mode); } @@ -3687,6 +3745,7 @@ #define lib_args(max) if (max_func_args<max) max_func_args=max +#if LONGLONG_CODE||FLOAT_CODE static void extern_conv(char *conv) { @@ -3697,6 +3756,7 @@ printf("\tbl\t%s\n",conv); lib_args(16); } +#endif static void code_int_lib(char *lib,int reg,int oreg) @@ -4875,29 +4935,6 @@ return l1; } -int -emit_lpop() -{ - int xreg,reg; - xreg=lreg_stack[--lreg_sp]; - if (xreg<= -REG_LVAR_OFFSET) { - reg = get_lregister(); - code_lrlvar(REG_LVAR_OFFSET+xreg,reg); - free_lvar(REG_LVAR_OFFSET+xreg); - xreg = reg; - } - return xreg; -} - -void -code_lregister(int e2,int reg) -{ - use_longlong(reg); - if (reg!=e2) { - lmove(reg,e2); - } -} - void code_cmp_lregister(int reg,int label,int cond) { @@ -4926,6 +4963,33 @@ code_cmp_lregister(creg,label,cond); } +#endif +#if LONGLONG_CODE||FLOAT_CODE + +int +emit_lpop() +{ + int xreg,reg; + xreg=lreg_stack[--lreg_sp]; + if (xreg<= -REG_LVAR_OFFSET) { + reg = get_lregister(); + code_lrlvar(REG_LVAR_OFFSET+xreg,reg); + free_lvar(REG_LVAR_OFFSET+xreg); + xreg = reg; + } + return xreg; +} + +void +code_lregister(int e2,int reg) +{ + use_longlong(reg); + if (reg!=e2) { + lmove(reg,e2); + } +} + + void code_lassign(int e2,int creg) { @@ -4977,6 +5041,60 @@ } } +void +emit_lpop_free(int xreg) +{ + if (xreg>=0) + free_register(xreg); +} + +void +emit_lpush() +{ + int new_reg; + if (!is_longlong_reg(creg)) error(-1); + if (lreg_sp>MAX_MAX) error(-1); + new_reg = get_lregister(); /* 絶対に取れる(?) */ + lreg_stack[lreg_sp++] = creg; /* push するかわりにレジスタを使う */ + lreg = creg = new_reg; +} + +void +code_lrgvar(int e1,int creg) +{ + int r; + char *crn_h; + char *crn_l; + use_longlong(creg); + crn_h = lregister_name_high(creg); + crn_l = lregister_name_low(creg); + r = get_ptr_cache((NMTBL*)caddr(e1)); +#if ENDIAN_L==0 + code_ldf("ldr",crn_l,cadr(e1),r,""); + code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,""); +#else + code_ldf("ldr",crn_h,cadr(e1),r,""); + code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,""); +#endif +} + +void +code_lrlvar(int e1,int creg) +{ + char *crn_h; + char *crn_l; + use_longlong(creg); + crn_h = lregister_name_high(creg); + crn_l = lregister_name_low(creg); + inc_inst(2); + lvar_intro(e1); + printf("\tldr\t%s, ",crn_l); lvar(e1,""); + printf("\tldr\t%s, ",crn_h); lvar(e1+SIZE_OF_INT,""); +} + +#endif +#if LONGLONG_CODE + static long long ll0 = 1LL; static int @@ -5019,39 +5137,6 @@ printf("\trsc\t%s, %s, #0\n",rh,rh); } -void -code_lrgvar(int e1,int creg) -{ - int r; - char *crn_h; - char *crn_l; - use_longlong(creg); - crn_h = lregister_name_high(creg); - crn_l = lregister_name_low(creg); - r = get_ptr_cache((NMTBL*)caddr(e1)); -#if ENDIAN_L==0 - code_ldf("ldr",crn_l,cadr(e1),r,""); - code_ldf("ldr",crn_h,cadr(e1)+SIZE_OF_INT,r,""); -#else - code_ldf("ldr",crn_h,cadr(e1),r,""); - code_ldf("ldr",crn_l,cadr(e1)+SIZE_OF_INT,r,""); -#endif -} - -void -code_lrlvar(int e1,int creg) -{ - char *crn_h; - char *crn_l; - use_longlong(creg); - crn_h = lregister_name_high(creg); - crn_l = lregister_name_low(creg); - inc_inst(2); - lvar_intro(e1); - printf("\tldr\t%s, ",crn_l); lvar(e1,""); - printf("\tldr\t%s, ",crn_h); lvar(e1+SIZE_OF_INT,""); -} - static void code_longlong_lib(char *lib,int reg,int oreg) { @@ -5310,24 +5395,6 @@ void -emit_lpop_free(int xreg) -{ - if (xreg>=0) - free_register(xreg); -} - -void -emit_lpush() -{ - int new_reg; - if (!is_longlong_reg(creg)) error(-1); - if (lreg_sp>MAX_MAX) error(-1); - new_reg = get_lregister(); /* 絶対に取れる(?) */ - lreg_stack[lreg_sp++] = creg; /* push するかわりにレジスタを使う */ - lreg = creg = new_reg; -} - -void code_i2ll(int reg) { char *crn,*crn_h,*crn_l; @@ -6016,13 +6083,14 @@ code_bit_field(int type,int adr,int reg) { int sign,bitsz,l,align; - int bitsize,bitpos,lvalue; + int bitsize,bitpos; int i,size; set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l); size = bitsz/8; // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); /* this implementation returns -1 for int i:1; */ if (l==1) { +#if LONGLONG_CODE // use_int(adr); use_longlong(reg); lload(adr,reg,0); @@ -6033,6 +6101,7 @@ if ((i=bitsz-bitsize)) loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); } else if (l==2) { /* three int container */ + int lvalue; // use_int(adr); use_longlong(reg); lvalue = get_register(); @@ -6073,6 +6142,7 @@ loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); if (i<0||64<=i) error(-1); free_register(adr); +#endif } else { // use_int(adr); use_int(reg); @@ -6107,16 +6177,17 @@ extern void code_bit_replace(int adr,int value,int type) { - int sign,bitsz,l,align,i; + int sign,bitsz,l,align; int bitsize,bitpos; int mask = 0; - int tmp = -1,tmp2,lvalue,size; - int tmpvar = -1; + int tmp = -1,lvalue,size; char *crn,*lrn,*trn; set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l); size = bitsz/8; // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); if (l==1) { +#if LONGLONG_CODE + int tmp2; // use_int(adr); lvalue = get_lregister(); tmp2 = get_register(); @@ -6145,6 +6216,8 @@ free_register(lvalue); free_register(adr); } else if (l==2) { + int i; + int tmpvar; // use_int(adr); use_longlong(value); lvalue = get_register(); @@ -6192,6 +6265,7 @@ printf("\t%s\t%s, [%s, #8]\n",cstore(0),lrn,register_name(adr)); free_lvar(tmpvar); free_register(adr); +#endif } else { // use_int(adr); use_int(value); @@ -6263,7 +6337,7 @@ long long lc; int tmp; #endif - char *crn,*trn; + char *crn; set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l); size = bitsz/8; // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); @@ -6291,6 +6365,7 @@ free_register(adr); free_register(lvalue); } else if (l==2) { // three int container + char *trn; /* hhhhhh mmmmmmmmmmmm lllllll lllll 00000000000 mmmmmmmmmmmm 0000000 hhhhhhh
--- a/mc-code-ia32.c Mon Nov 15 20:58:58 2004 +0900 +++ b/mc-code-ia32.c Sat Nov 20 17:06:05 2004 +0900 @@ -946,7 +946,9 @@ } static int rexpr_bool(int e1,int reg); +#if FLOAT_CODE static int drexpr_bool(int e1,int reg); +#endif void code_bool(int e1,int reg) { @@ -3522,6 +3524,7 @@ // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); /* this implementation returns -1 for int i:1; */ if (l==1) { +#if LONGLONG_CODE use_int(adr); use_longlong(reg); lload(adr,0,reg); @@ -3531,6 +3534,7 @@ /* shift right */ if ((i=bitsz-bitsize)) loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); +#endif } else { use_int(adr); use_int(reg); @@ -3582,11 +3586,13 @@ int sign,bitsz,l,align; int bitsize,bitpos; int mask = 0; - int size,push=0; + int size; set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l); size = bitsz/8; // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); if (l) { +#if LONGLONG_CODE + int push=0; use_int(adr); use_longlong(value); /* shift left */ @@ -3615,6 +3621,7 @@ l_eax(value), register_name(adr,0)); } if (push) printf("\taddl %%sp,$4\n"); +#endif } else { use_int(adr); use_int(value);
--- a/mc-code-mips.c Mon Nov 15 20:58:58 2004 +0900 +++ b/mc-code-mips.c Sat Nov 20 17:06:05 2004 +0900 @@ -194,7 +194,7 @@ return i; } -#if LONGLONG_CODE +#if LONGLONG_CODE||FLOAT_CODE #define use_longlong(reg) if (reg==USE_CREG) reg=use_longlong0() static @@ -218,6 +218,9 @@ static void lmove(int to,int from); #endif +#define USING_DREG 5 +#define INPUT_DREG 6 + #if FLOAT_CODE #define use_float(d,reg) if (reg==USE_CREG) reg=d?use_double0():use_float0() @@ -235,9 +238,6 @@ return i; } -#define USING_DREG 5 -#define INPUT_DREG 6 - static int use_double0() { int i; @@ -260,10 +260,23 @@ static void code_double_lib(char *lib,int to,int reg,int oreg); static void code_double_lib_c(char *lib,int from,int to,double value); +void code_lassign_lvar(int e2,int creg); +int code_lrindirect(int e1, int reg, int offset, int us); +void code_lregister(int e2,int reg); +void code_lassign_gvar(int e2,int creg); +void code_lassign(int e2,int creg); +void code_lassign_lregister(int e2,int reg); +void code_lrgvar(int e1,int creg); +void code_lrlvar(int e1,int creg); +void emit_lpop_free(int xreg); +void emit_lpush(); +int emit_lpop(); + #endif #if LONGLONG_CODE static int code_l1(long long ll); static int code_l2(long long ll); +static void set_lreg(int,int); #endif static void code_save_stacks(); @@ -271,7 +284,6 @@ static void set_ireg(int,int); static void set_dreg(int,int); static void set_freg(int,int); -static void set_lreg(int,int); static int max_func_args; static int my_func_args; @@ -1708,6 +1720,8 @@ regs[regv_h(reg)]=USING_DREG; } +#if FLOAT_CODE + static void set_lreg_operand(int reg,int mode) { @@ -1718,31 +1732,13 @@ } } -/* -static void -set_lreg_operand1(int reg,int mode) -{ - // save_stack,clear_ptr_cache is assumed - if (!is_longlong_reg(reg)) { error(-1); return; } - if (mode) { - lmove(LREGISTER_OPERAND_1,reg); - } -} - */ - static void set_dreg_operand(int reg,int mode) { set_lreg_operand(reg,mode); } -/* -static void -set_dreg_operand1(int reg,int mode) -{ - set_lreg_operand1(reg,mode); -} - */ +#endif void use_reg(int arg) @@ -1911,6 +1907,7 @@ static void code_assign_input_float_int(int e0) { +#if FLOAT_CODE int e1 = cadr(e0); int e2 = caddr(e0); int r; @@ -1936,6 +1933,7 @@ case FREGISTER: printf("\tmfc1 %s,%s\n",frn,fregister_name(freg)); } +#endif } static int @@ -2341,7 +2339,7 @@ } #endif -#if LONGLONG_CODE +#if LONGLONG_CODE||FLOAT_CODE static void lload(int creg,int reg,int offset) @@ -3152,9 +3150,13 @@ int code_get_fixed_creg(int reg,int type) { switch(type) { +#if FLOAT_CODE case DOUBLE: use_float(1,reg); break; case FLOAT: use_float(0,reg); break; +#endif +#if LONGLONG_CODE case LONGLONG: case ULONGLONG: use_longlong(reg); break; +#endif default: if (reg==USE_CREG) { if (regs[CREG_REGISTER]==0||regs[CREG_REGISTER]==PTRC_REG) { @@ -3427,6 +3429,7 @@ #define lib_args(max) if (max_func_args<max) max_func_args=max +#if FLOAT_CODE||LONGLONG_CODE static void extern_conv(char *conv) { @@ -3436,6 +3439,7 @@ printf("\tjal %s\n",conv); lib_args(16); } +#endif #if FLOAT_CODE @@ -4266,20 +4270,6 @@ /* 64bit int part */ -#if 0 -static int -lcmp(int op,int cond) -{ - if (op==LOP+UGT||op==LOP+UGE) { - return UCMP; - } else if (op==LOP+LE||op==LOP+GE) { - return CMPGE; - } else { - return CMP; - } -} -#endif - int lrexpr(int e1, int e2,int l1, int op,int cond) { @@ -4321,23 +4311,8 @@ return l1; } -#if 0 -static -int emit_lpop_regvar() -{ - int xreg,reg; - xreg=lreg_stack[--lreg_sp]; - reg = cadr(get_lregister_var(0)); - if (xreg<= -REG_LVAR_OFFSET) { - code_lrlvar(REG_LVAR_OFFSET+xreg,reg); - free_lvar(REG_LVAR_OFFSET+xreg); - xreg = reg; - } else { - code_lassign_lregister(reg,xreg); - } - return xreg; -} #endif +#if LONGLONG_CODE||FLOAT_CODE int emit_lpop() @@ -4362,6 +4337,9 @@ } } +#endif +#if LONGLONG_CODE + void code_cmp_lregister(int reg,int label,int cond) { @@ -4389,6 +4367,8 @@ code_cmp_lregister(creg,label,cond); } +#endif +#if LONGLONG_CODE||FLOAT_CODE void code_lassign(int e2,int creg) { @@ -4439,6 +4419,46 @@ } } +void +code_lrgvar(int e1,int creg) +{ + int r; + char *crn_h; + char *crn_l; + use_longlong(creg); + crn_h = lregister_name_high(creg); + crn_l = lregister_name_low(creg); + r = get_ptr_cache((NMTBL*)caddr(e1)); +#if ENDIAN_L==0 + code_ldf("lw",crn_l,cadr(e1),r); + code_ldf("lw",crn_h,cadr(e1)+SIZE_OF_INT,r); +#else + code_ldf("lw",crn_h,cadr(e1),r); + code_ldf("lw",crn_l,cadr(e1)+SIZE_OF_INT,r); +#endif +} + +void +code_lrlvar(int e1,int creg) +{ + char *crn_h; + char *crn_l; + use_longlong(creg); + crn_h = lregister_name_high(creg); + crn_l = lregister_name_low(creg); + lvar_intro(e1); +#if ENDIAN_L==0 + printf("\tlw %s,",crn_l); lvar(e1); + printf("\tlw %s,",crn_h); lvar(e1+SIZE_OF_INT); +#else + printf("\tlw %s,",crn_h); lvar(e1); + printf("\tlw %s,",crn_l); lvar(e1+SIZE_OF_INT); +#endif +} + +#endif +#if LONGLONG_CODE + static long long ll0 = 1LL; static int @@ -4487,43 +4507,6 @@ set_lreg(dreg,0); } -void -code_lrgvar(int e1,int creg) -{ - int r; - char *crn_h; - char *crn_l; - use_longlong(creg); - crn_h = lregister_name_high(creg); - crn_l = lregister_name_low(creg); - r = get_ptr_cache((NMTBL*)caddr(e1)); -#if ENDIAN_L==0 - code_ldf("lw",crn_l,cadr(e1),r); - code_ldf("lw",crn_h,cadr(e1)+SIZE_OF_INT,r); -#else - code_ldf("lw",crn_h,cadr(e1),r); - code_ldf("lw",crn_l,cadr(e1)+SIZE_OF_INT,r); -#endif -} - -void -code_lrlvar(int e1,int creg) -{ - char *crn_h; - char *crn_l; - use_longlong(creg); - crn_h = lregister_name_high(creg); - crn_l = lregister_name_low(creg); - lvar_intro(e1); -#if ENDIAN_L==0 - printf("\tlw %s,",crn_l); lvar(e1); - printf("\tlw %s,",crn_h); lvar(e1+SIZE_OF_INT); -#else - printf("\tlw %s,",crn_h); lvar(e1); - printf("\tlw %s,",crn_l); lvar(e1+SIZE_OF_INT); -#endif -} - static void @@ -4914,6 +4897,8 @@ if (dx!=-1) free_register(dx); } +#endif +#if LONGLONG_CODE||FLOAT_CODE void emit_lpop_free(int xreg) @@ -4933,6 +4918,9 @@ lreg = creg = new_reg; } +#endif +#if LONGLONG_CODE + void code_i2ll(int reg) { @@ -5558,6 +5546,7 @@ // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); /* this implementation returns -1 for int i:1; */ if (l==1) { +#if LONGLONG_CODE use_int(adr); use_longlong(reg); lload(adr,reg,0); @@ -5567,6 +5556,7 @@ /* shift right */ if ((i=bitsz-bitsize)) loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); +#endif } else { use_int(adr); use_int(reg); @@ -5609,6 +5599,7 @@ size = bitsz/8; // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); if (l) { +#if LONGLONG_CODE use_int(adr); lvalue = get_lregister(); lload(adr,lvalue,0); @@ -5632,6 +5623,7 @@ make_mask_and_or(mask,tmp,trn,crn,lrn); } code_lassign(adr,value); +#endif } else { use_int(adr); use_int(value);
--- a/mc-code-powerpc.c Mon Nov 15 20:58:58 2004 +0900 +++ b/mc-code-powerpc.c Sat Nov 20 17:06:05 2004 +0900 @@ -2274,6 +2274,7 @@ } #endif +#if LONGLONG_CODE static void lload(int creg,int reg,int offset) { @@ -2300,7 +2301,6 @@ #endif } -#if LONGLONG_CODE int code_lrindirect(int e1, int reg, int offset, int us) { @@ -5328,6 +5328,7 @@ // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); /* this implementation returns -1 for int i:1; */ if (l==1) { +#if LONGLONG_CODE // use_int(adr); use_longlong(reg); lload(adr,reg,0); @@ -5337,6 +5338,7 @@ /* shift right */ if ((i=bitsz-bitsize)) loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i)); +#endif } else { // use_int(adr); use_int(reg); @@ -5384,6 +5386,7 @@ size = bitsz/8; // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz); if (l) { +#if LONGLONG_CODE // use_int(adr); lvalue = get_lregister(); lload(adr,lvalue,0); @@ -5409,6 +5412,7 @@ code_lassign(adr,value); free_register(lvalue); // free_register(adr); +#endif } else { // use_int(adr); use_int(value);
--- a/mc-codegen.c Mon Nov 15 20:58:58 2004 +0900 +++ b/mc-codegen.c Sat Nov 20 17:06:05 2004 +0900 @@ -19,7 +19,9 @@ int disp_align; static void assign(int e1); +#if ASM_CODE static void gen_asm(int asm0,int in,int out,int opt,int e); +#endif static void compatible(int t1, int t2); static int contains(int e,int type); static int contains_in_list(int e,int type); @@ -1644,11 +1646,11 @@ /* numerical type conversion */ +#if FLOAT_CODE static int double_value(int e2) { if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2); -#if FLOAT_CODE switch(car(e2)) { case LCONST: #if LONGLONG_CODE @@ -1670,9 +1672,6 @@ else { error(TYERR); e2 = dlist2(DCONST,1.0); } } } -#else - error(TYERR); type = DOUBLE; return list2(CONST,0); -#endif type = DOUBLE; return e2; } @@ -1682,7 +1681,6 @@ { if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2); if (0) ; -#if FLOAT_CODE #if LONGLONG_CODE else if (car(e2)==LCONST) e2 = dlist2(FCONST,(double)lcadr(e2)); #endif @@ -1700,19 +1698,17 @@ else { error(TYERR); e2 = dlist2(DCONST,1.0); } } } -#else - else { error(TYERR); e2 = list2(CONST,0); } -#endif type = FLOAT; return e2; } +#endif +#if LONGLONG_CODE static int longlong_value(int e2) { if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2); if (0) ; -#if LONGLONG_CODE else if (car(e2)==CONST) e2 = llist2(LCONST,(long long)cadr(e2)); else if (car(e2)==LCONST) ; #if FLOAT_CODE @@ -1731,9 +1727,6 @@ else { error(TYERR); e2 = llist2(LCONST,0LL); } } } -#else - else { error(TYERR); e2 = list2(CONST,0); } -#endif type = LONGLONG; return e2; } @@ -1743,7 +1736,6 @@ { if (type>0&&car(type)==BIT_FIELD) e2=rvalue(e2); if (0); -#if LONGLONG_CODE else if (car(e2)==CONST) e2 = llist2(LCONST,(unsigned long long)cadr(e2)); else if (car(e2)==LCONST) ; #if FLOAT_CODE @@ -1762,12 +1754,10 @@ else { error(TYERR); e2 = llist2(LCONST,0LL); } } } -#else - else unsigned_value(e2); -#endif type = ULONGLONG; return e2; } +#endif static int int_value(int e2) @@ -2479,9 +2469,13 @@ bit_field_disp=sbit_f; // default is 0, recover only here. // type = list4(BIT_FIELD,value type, // list3(store type,bit offset,bit_width)); +#if BIT_FIELD_CODE cadr(caddr(type)) = code_bit_field_disp( type,&disp,&bit_field_disp,&sz); /* bit_field_disp is next bit posision */ +#else + error(-1); +#endif } else { sz = size(type); } @@ -2744,7 +2738,9 @@ if (t>0&&car(t)==BIT_FIELD) { sz = 0; bfd = cadr(caddr(t)); /* bit_field_disp */ +#if BIT_FIELD_CODE code_bit_field_disp(t,&offset,&bfd,&sz); +#endif return offset+sz; } return offset+((t==EMPTY)?cadr(e):size(t)); @@ -3630,6 +3626,7 @@ code_bit_field(t, reg, USE_CREG); use=1; if (lo) { +#if LONGLONG_CODE if (post) { n1 = list2(LVAR,new_lvar(size_of_longlong)); code_lassign_lvar(cadr(n1),USE_CREG); @@ -3643,6 +3640,9 @@ g_expr(e3); code_register_lassop(USE_CREG,op+LOP); } +#else + error(TYERR); +#endif } else { if (post) { n1 = list2(LVAR,new_lvar(size_of_int));
--- a/mc-parse.c Mon Nov 15 20:58:58 2004 +0900 +++ b/mc-parse.c Sat Nov 20 17:06:05 2004 +0900 @@ -1947,6 +1947,7 @@ cslist = slist; } +#if CASE_CODE /* used in insert ascend */ static int docase_eq() @@ -1954,6 +1955,7 @@ error(-1); // duplicate case value return 0; // remove duplicate value } +#endif static void docase(void) @@ -1968,7 +1970,9 @@ conv->case_(0,0); checksym(COLON); } - if (retpending) { ret(); retpending=0; } + if (retpending) { + ret(); retpending=0; + } if (!cslabel) { if (!control) { // immediate after switch(i) (usual case) @@ -1999,7 +2003,9 @@ /* casading branch implementation */ int c,l,slfree; l = 0; - if (retpending) ret(); + if (retpending) { + ret(); retpending=0; + } slfree=lfree; c=0; while(sym==CASE) { @@ -2009,9 +2015,10 @@ conv->case_(c,0); checksym(COLON); } + l=fwdlabel(); if (control) { control=0; - gen_jmp(l=fwdlabel()); + gen_jmp(l); } if (cslabel) fwddef(cslabel); while(cadr(c)) { @@ -2518,8 +2525,8 @@ return(list3(FPREINC,e,dir)); case DOUBLE: return(list3(DPREINC,e,dir)); +#endif } -#endif if(integral(type)) return(list4(PREINC,e,dir,size_of_int)); if(type>0 && car(type)==BIT_FIELD) {
--- a/mc-parse.h Mon Nov 15 20:58:58 2004 +0900 +++ b/mc-parse.h Sat Nov 20 17:06:05 2004 +0900 @@ -10,9 +10,7 @@ extern int retlabel,retpending,retcont; extern int pending_jmp; extern int chk; -#if BIT_FIELD_CODE extern int bit_field_disp; -#endif extern int fields; extern int struct_return; extern int lastexp; @@ -81,8 +79,7 @@ extern void display_ntable(NMTBL *n, char *s); extern NMTBL * lsearch(char *name,int sc); #if FLOAT_CODE -extern int -dlist2(int e1, double d1); +extern int dlist2(int e1, double d1); #endif extern void error(int n); extern int glist2(int e1,int e2);
--- a/test/code-gen.c Mon Nov 15 20:58:58 2004 +0900 +++ b/test/code-gen.c Sat Nov 20 17:06:05 2004 +0900 @@ -2762,6 +2762,7 @@ case 1234: printf("#2761:code_switch 1 nn %d\n",i); break; case 2233: printf("#2762:code_switch 2 nn %d\n",i); break; case 3333: printf("#2763:code_switch 3 nn %d\n",i); + case -200: return; case -4: printf("#2764:code_switch 4 nn %d\n",i); break; case 733: case -5: printf("#2766:code_switch 5 nn %d\n",i); break;