Mercurial > hg > Members > kono > compiler-examples
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 |