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 */