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)