Mercurial > hg > CbC > old > device
comparison mc-nop-386.c @ 40:060d1e549fec
*** empty log message ***
author | kono |
---|---|
date | Wed, 12 Feb 2003 04:45:53 +0900 |
parents | c63c4fdeb9a7 |
children | 886ca1f2cf15 |
comparison
equal
deleted
inserted
replaced
39:c63c4fdeb9a7 | 40:060d1e549fec |
---|---|
131 rname[creg] currrent real register | 131 rname[creg] currrent real register |
132 rname[lreg] operand real register | 132 rname[lreg] operand real register |
133 rname[dreg] spare real register | 133 rname[dreg] spare real register |
134 | 134 |
135 regs[] virtual register usage | 135 regs[] virtual register usage |
136 regv[] value in virtual register flag | |
136 | 137 |
137 reg_name[rname[creg]] | 138 reg_name[rname[creg]] |
138 */ | 139 */ |
139 | 140 |
140 #define MAX_MAX 10 | 141 #define MAX_MAX 10 |
141 static int rname[MAX_MAX]; | 142 static int rname[MAX_MAX]; |
142 static int regs[MAX_MAX]; /* 使われているレジスタを示すフラグ */ | 143 static int regs[MAX_MAX]; /* 使われているレジスタを示すフラグ */ |
143 static int reg_stack[MAX_MAX]; /* 実際のレジスタの領域 */ | 144 static int reg_stack[MAX_MAX]; /* 実際のレジスタの領域 */ |
145 static int regv[MAX_MAX]; /* 値が入っているかどうか */ | |
144 | 146 |
145 void | 147 void |
146 code_init(void) | 148 code_init(void) |
147 { | 149 { |
148 arg_offset = 8; | 150 arg_offset = 8; |
201 return -1; /* 空いている場所がないなら、それを表す -1 を返す */ | 203 return -1; /* 空いている場所がないなら、それを表す -1 を返す */ |
202 } | 204 } |
203 | 205 |
204 void | 206 void |
205 free_register(int i) { /* いらなくなったレジスタを開放 */ | 207 free_register(int i) { /* いらなくなったレジスタを開放 */ |
206 regs[i]=0; | 208 regv[i]=regs[i]=0; |
207 } | 209 } |
208 | 210 |
209 int | 211 int |
210 register_full(void) | 212 register_full(void) |
211 { | 213 { |
228 if (! regs[i]) count++; | 230 if (! regs[i]) count++; |
229 } | 231 } |
230 return count; | 232 return count; |
231 } | 233 } |
232 | 234 |
235 void | |
236 use_register_var(int i) { | |
237 regv[i]=1; | |
238 } | |
239 | |
240 static int creg_regvar = -1; | |
241 static int creg_regvar_back; | |
242 static int creg_back; | |
243 | |
244 void | |
245 creg_destroy() { | |
246 creg_back = creg; creg_regvar_back = creg_regvar; | |
247 if (creg_regvar>=0) | |
248 creg = creg_regvar; | |
249 creg_regvar=-1; | |
250 } | |
251 | |
252 void | |
253 creg_un_destroy() { | |
254 creg = creg_back; creg_regvar = creg_regvar_back; | |
255 } | |
256 | |
233 | 257 |
234 void | 258 void |
235 gexpr_init(void) | 259 gexpr_init(void) |
236 { | 260 { |
237 while(reg_sp > 0) { | 261 while(reg_sp > 0) { |
238 free_register(reg_stack[--reg_sp]); | 262 free_register(reg_stack[--reg_sp]); |
239 } | 263 } |
240 text_mode(); | 264 text_mode(); |
241 use_register(creg,REG_EAX,0); | 265 use_register(creg,REG_EAX,0); |
266 /* use_register(dreg,REG_EDX,0); */ | |
267 creg_regvar = -1; | |
242 } | 268 } |
243 | 269 |
244 void | 270 void |
245 emit_init(void) | 271 emit_init(void) |
246 { | 272 { |
247 int i; | 273 int i; |
248 for(i=0;i<REAL_MAX_REGISTER;i++) regs[i]=0; | 274 for(i=0;i<REAL_MAX_REGISTER;i++) { regs[i]=0; regv[i]=0;rname[i]=i;} |
249 for(i=0;i<REAL_MAX_REGISTER;i++) rname[i]=i; | 275 creg = get_register(); /* must be EAX */ |
250 creg = get_register(); | 276 dreg = get_register(); /* must be EBX */ |
251 dreg = get_register(); | |
252 reg_sp = 0; | 277 reg_sp = 0; |
253 text_mode(); | 278 text_mode(); |
254 } | 279 } |
255 | 280 |
256 int | 281 int |
796 int length,xreg,save; | 821 int length,xreg,save; |
797 g_expr(e4); | 822 g_expr(e4); |
798 length=size(t); | 823 length=size(t); |
799 if(length%size_of_int) { | 824 if(length%size_of_int) { |
800 length += size_of_int - (length%size_of_int); | 825 length += size_of_int - (length%size_of_int); |
826 } | |
827 if (length==4) { | |
828 printf("\tpushl (%s)\n",register_name(creg,0)); return 1; | |
829 } | |
830 if (length==8) { | |
831 printf("\tpushl 4(%s)\n",register_name(creg,0)); | |
832 printf("\tpushl (%s)\n",register_name(creg,0)); return 2; | |
801 } | 833 } |
802 /* I think, after g_expr, at least two registers are free */ | 834 /* I think, after g_expr, at least two registers are free */ |
803 printf("\tsubl $%d,%%esp\n",length); | 835 printf("\tsubl $%d,%%esp\n",length); |
804 if (register_full()) { | 836 if (register_full()) { |
805 /* this is wrong assumption */ | 837 /* this is wrong assumption */ |