Mercurial > hg > CbC > old > device
changeset 635:e4fffa4bf9cf
Intel Mac complete
author | kono |
---|---|
date | Wed, 11 Oct 2006 17:09:48 +0900 |
parents | 62c4da637548 |
children | 72c4a8137fff |
files | Changes mc-code-ia32.c |
diffstat | 2 files changed, 24 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Wed Oct 11 11:14:46 2006 +0900 +++ b/Changes Wed Oct 11 17:09:48 2006 +0900 @@ -8925,3 +8925,11 @@ あ、そうか。ebp が-12 offset だと、16byte alignment に一致しない。 +use_data_register() と ptr_cache() の相性が良くないらしい。 + +偶然動いたりするのか... しくしく。 + + +use_data_reg() で初期化してない変数を使ってました。 + +"hoge" "hage" を #ifdef で挟むと動かない... (ふーん...)
--- a/mc-code-ia32.c Wed Oct 11 11:14:46 2006 +0900 +++ b/mc-code-ia32.c Wed Oct 11 17:09:48 2006 +0900 @@ -130,6 +130,7 @@ #ifdef __APPLE__ "#define __APPLE__ 1\n" "#define __GNUC__ 4\n" +"#define __BIG_ENDIAN__ 1\n" #endif ; @@ -413,21 +414,25 @@ } #define use_data_reg(reg,keep) \ - if (reg==-1||!is_data_reg(reg)) reg=use_data_reg0(keep) + if (reg==-1||!is_data_reg(reg)) reg=use_data_reg0(keep,reg) int -use_data_reg0(int keep) +use_data_reg0(int keep,int reg) { - int i = creg; int ptreg =0; + int i; if (is_pointer_reg(creg)) { free_register(ptreg=creg); - creg = 0; + ireg = creg = 0; } if (is_pointer_reg(ireg)) { free_register(ireg); ireg = 0; } + i = reg==USING_REG?creg:reg; +#ifdef __APPLE__ + if (regs[i]==PTRC_REG) clear_ptr_cache_reg(i); +#endif if (!i||!ireg||!is_data_reg(i)) { if (lreg) { if (regs[lreg]) free_register(lreg); lreg = 0; } if (!ireg) { @@ -447,9 +452,10 @@ set_ireg(int reg,int mode) { if (!is_int_reg(reg)) error(-1); - if (reg!=creg) { + if (creg > 0 && reg!=creg) { #ifdef __APPLE__ - clear_ptr_cache_reg(reg); + if (regs[reg]==PTRC_REG) + clear_ptr_cache_reg(reg); #endif if (ireg && reg!=ireg ) { if (regs[ireg]!=REG_VAR) free_register(ireg); @@ -1489,6 +1495,7 @@ else { printf("\tpushl %d(%s)\n", length-SIZE_OF_INT,register_name(creg,0)); + stack_depth += SIZE_OF_INT; } } // alignment may remain @@ -1649,8 +1656,8 @@ printf("\tmovl %%esp,%s\n",drn); printf("\tsubl %s,%%esp\n",crn); printf("\tmovl %%esp,%s\n",crn); - free_register(edx); emit_copy(edx,creg,stack_depth,0,1,1); + free_register(edx); // should be free before emit copy but... printf("\taddl $%d,%s\n",stack_depth,register_name(creg,0)); } else { @@ -4320,7 +4327,7 @@ mask = make_mask(32-bitpos-bitsize,31-bitpos); make_mask_and_or(mask,value,adr); printf("\tpopl %s\n",register_name(adr,0)); - code_assign(adr,size,value); + code_assign(adr,size==4?0:size,value); } if (use) { code_bit_field(type,adr,USE_CREG); @@ -4409,7 +4416,7 @@ /* make and-mask */ mask = make_mask(32-bitpos-bitsize,31-bitpos); make_mask_and_or_const(mask,lvalue,c); - code_assign(adr,size,lvalue); + code_assign(adr,size==4?0:size,lvalue); free_register(lvalue); } if (use)