comparison s-code-intel-r.c @ 19:0a1507c12f9a

O_DIVR broken
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 28 Oct 2016 15:35:31 +0900
parents e5c8532ab38d
children
comparison
equal deleted inserted replaced
18:230d5ca49f9f 19:0a1507c12f9a
81 81
82 reg_name[creg] register name 82 reg_name[creg] register name
83 */ 83 */
84 84
85 #define MAX_MAX 20 85 #define MAX_MAX 20
86 static int regs[MAX_MAX]; /* 使われているレジスタを示すフラグ */ 86 static int regs[MAX_MAX]; /* 篏帥吾鴻帥腓冴 */
87 static int reg_stack[MAX_MAX]; /* 実際のレジスタの領域 */ 87 static int reg_stack[MAX_MAX]; /* 絎吾鴻帥 */
88 88
89 const int MAX_REGISTER=6; 89 const int MAX_REGISTER=6;
90 const int MAX_DATA_REG=4; 90 const int MAX_DATA_REG=4;
91 const int MAX_POINTER=3; 91 const int MAX_POINTER=3;
92 92
101 // return reg_name[i]; 101 // return reg_name[i];
102 //} 102 //}
103 103
104 static int 104 static int
105 get_register() 105 get_register()
106 { /* 使われていないレジスタを調べる */ 106 { /* 篏帥吾鴻帥茯帥鴻 */
107 int i; 107 int i;
108 for(i=0;i<MAX_REGISTER;i++) { 108 for(i=0;i<MAX_REGISTER;i++) {
109 if (! regs[i]) { /* 使われていないなら */ 109 if (! regs[i]) { /* 篏帥 */
110 regs[i]=1; /* そのレジスタを使うことを宣言し */ 110 regs[i]=1; /* 吾鴻帥篏帥絎h */
111 return i; /* その場所を表す番号を返す */ 111 return i; /* 贋茵垩菴 */
112 } 112 }
113 } 113 }
114 return -1; /* 空いている場所がないなら、それを表す -1 を返す */ 114 return -1; /* 腥冴贋茵 -1 菴 */
115 } 115 }
116 116
117 static void 117 static void
118 free_register(i) { /* いらなくなったレジスタを開放 */ 118 free_register(i) { /* c吾鴻帥 */
119 regs[i]=0; 119 regs[i]=0;
120 } 120 }
121 121
122 /* 122 /*
123 static int 123 static int
138 { 138 {
139 int i; 139 int i;
140 for(i=0;i<MAX_REGISTER;i++) regs[i]=0; 140 for(i=0;i<MAX_REGISTER;i++) regs[i]=0;
141 creg = get_register(); 141 creg = get_register();
142 crn = reg_name[creg]; 142 crn = reg_name[creg];
143 dreg = REG_EDX; /* これは割算などで特別に使われる */ 143 dreg = REG_EDX; /* 牙х劫ャ篏帥 */
144 regs[dreg]=1; 144 regs[dreg]=1;
145 drn = reg_name[dreg]; 145 drn = reg_name[dreg];
146 reg_sp = 0; 146 reg_sp = 0;
147 } 147 }
148 148
149 static int 149 static int
150 pop_register() 150 pop_register()
151 { /* レジスタから値を取り出す */ 151 { /* 吾鴻帥ゃ冴 */
152 int i,j; 152 int i,j;
153 153
154 j = creg; 154 j = creg;
155 i = reg_stack[--reg_sp]; 155 i = reg_stack[--reg_sp];
156 156
167 void 167 void
168 emit_push() 168 emit_push()
169 { 169 {
170 int new_reg; 170 int new_reg;
171 new_reg = get_register(); 171 new_reg = get_register();
172 if(new_reg<0) { /* もうレジスタがない */ 172 if(new_reg<0) { /* 吾鴻帥 */
173 if (reg_sp==MAX_MAX-1) { 173 if (reg_sp==MAX_MAX-1) {
174 printf("Compilation error: too complex expression\n"); 174 printf("Compilation error: too complex expression\n");
175 } else { 175 } else {
176 reg_stack[reg_sp++] = -1; 176 reg_stack[reg_sp++] = -1;
177 printf("\tpushl %s\n",crn); 177 printf("\tpushl %s\n",crn);
178 } 178 }
179 } else { 179 } else {
180 reg_stack[reg_sp++] = creg; /* push するかわりにレジスタを使う */ 180 reg_stack[reg_sp++] = creg; /* push 吾鴻帥篏帥 */
181 creg = new_reg; 181 creg = new_reg;
182 crn = reg_name[creg]; 182 crn = reg_name[creg];
183 } 183 }
184 } 184 }
185 185