comparison presen/index.html @ 61:2c543a47737b

modify explanation of fastcall
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Mon, 26 Dec 2011 11:18:47 +0900
parents a21d16da431a
children 7087484574b0
comparison
equal deleted inserted replaced
60:a21d16da431a 61:2c543a47737b
208 <img src="./pix/ir.png" style="height: 6em;"> 208 <img src="./pix/ir.png" style="height: 6em;">
209 <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li> 209 <li>CbCの実装は主に Parser の部分と RTL を生成する部分に行われる。</li>
210 </div> 210 </div>
211 <!-- PAGE --> 211 <!-- PAGE -->
212 <div class="slide"> 212 <div class="slide">
213 <h1>CbC の実装</h1> 213 <h1>CbCの実装</h1>
214 <ul> 214 <ul>
215 <li>シンタックスの追加</li> 215 <li>シンタックスの追加</li>
216 <li>fastcall属性の付与</li> 216 <li>レジスタによる引数渡し(fastcall属性の付与)</li>
217 <li>Tail Call Elimination</li> 217 <li>Tail Call Elimination</li>
218 <li>環境付き継続</li> 218 <li>環境付き継続</li>
219 <li>__rectype の実装</li> 219 <li>__rectype の実装</li>
220 </ul> 220 </ul>
221 </div> 221 </div>
232 <ul> 232 <ul>
233 <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li> 233 <li>通常の goto に加え、コードセグメントを呼び出す処理を追加。</li>
234 <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li> 234 <li>コードセグメントへのgoto後は、 return の処理を自動で追加。</li>
235 </ul> 235 </ul>
236 </ul> 236 </ul>
237 <li class="incremental">gotoシンタックスの追加部分のソースは次のようになる。</li> 237 <li class="incremental">追加したgotoシンタックスの実際のソースは次のようになる。</li>
238 </div> 238 </div>
239 <!-- PAGE --> 239 <!-- PAGE -->
240 <div class="slide"> 240 <div class="slide">
241 <h1>CbCの実装:シンタックスの追加</h1> 241 <h1>CbCの実装:シンタックスの追加</h1>
242 <h2>gotoシンタックスの追加</h2> 242 <h2>gotoシンタックスの追加</h2>
262 <li>最後にc_finish_return関数によりreturn文を生成している。</li> 262 <li>最後にc_finish_return関数によりreturn文を生成している。</li>
263 </div> 263 </div>
264 <!-- PAGE --> 264 <!-- PAGE -->
265 <div class="slide"> 265 <div class="slide">
266 <h1>CbCの実装:シンタックスの追加</h1> 266 <h1>CbCの実装:シンタックスの追加</h1>
267 <h2>goto シンタックスの追加</h2> 267 <h2>gotoシンタックスの追加</h2>
268 <li>最後にリターン文を生成することにより、次へと制御を映させず。また末尾最適化がかかるようになる。</li> 268 <li>最後にリターン文を生成することにより、次へと制御を映させず。また末尾最適化がかかるようになる。</li>
269 <table border=1 width=100%> 269 <table border=1 width=100%>
270 <tr class="center"> 270 <tr class="center">
271 <small> 271 <small>
272 <td>実際のコード </td> 272 <td>実際のコード </td>
289 </table> 289 </table>
290 <li>末尾最適化(末尾除去)については後ほど詳しく説明する。</li> 290 <li>末尾最適化(末尾除去)については後ほど詳しく説明する。</li>
291 </div> 291 </div>
292 <!-- PAGE --> 292 <!-- PAGE -->
293 <div class="slide"> 293 <div class="slide">
294 <h1>引数渡し</h1> 294 <h1>CbCの実装:引数渡し</h1>
295 <li>当初、GCCを使ってコンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。</li> 295 <li>当初、GCCを使ってコンパイルしたCbCのプログラムはMicro-C版に速度面で勝てなかった。</li>
296 <ul> 296 <ul>
297 <li>Micro-Cでは関数呼び出しの際にできるだけレジスタを使うようにしていたため。</li> 297 <li>Micro-Cでは関数呼び出しの際にできるだけレジスタを使うようにしていたため。</li>
298 </ul> 298 </ul>
299 <li class="incremental">そこで、GCC版CbCコンパイラの引数渡しもできるだけレジスタで行うことに</li> 299 <li class="incremental">そこで、GCC版CbCコンパイラの引数渡しもできるだけレジスタで行うことに</li>
300 </div> 300 </div>
301 <!-- PAGE --> 301 <!-- PAGE -->
302 <div class="slide"> 302 <div class="slide">
303 <h1>引数渡し(fastcall属性の付与)</h1> 303 <h1>CbCの実装:引数渡し(fastcall)</h1>
304 <li>i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。</li> 304 <li>i386 において関数呼び出しの際、引数渡しをできるだけレジスタを用いるGCCの拡張機能。</li>
305 <li>__code で宣言された関数は自動でfastcall属性が付与される。</li> 305 <li>__code で宣言された関数は自動でfastcall属性が付与される。</li>
306 <small> 306 <small>
307 <pre> 307 <pre>
308 if(!TARGET_64BIT) { 308 if(!TARGET_64BIT) {
313 </small> 313 </small>
314 <p><small>Intel64 ではレジスタが増えている為、fastcallは標準でつくようになっている。</small></p> 314 <p><small>Intel64 ではレジスタが増えている為、fastcallは標準でつくようになっている。</small></p>
315 </div> 315 </div>
316 <!-- PAGE --> 316 <!-- PAGE -->
317 <div class="slide"> 317 <div class="slide">
318 <h1></h1> 318 <h1>CbCの実装:TCE</h1>
319 <li></li> 319 <h2>Tail Call Elimination(TCE):末尾除去</h2>
320 </div> 320 <li>callではなくjmpを行い関数を呼ぶことでreturnを1度で済ませる最適化。</li>
321 <!-- PAGE --> 321 <img src="./pix/continuation.png">
322 <div class="slide"> 322 <li></li>
323 <h1></h1> 323
324 <li></li> 324 </div>
325 </div> 325 <!-- PAGE -->
326 <!-- PAGE --> 326 <div class="slide">
327 <div class="slide"> 327 <h1>CbCの実装:TCE</h1>
328 <h1></h1> 328 <li></li>
329 <pre>
330 typedef struct node {
331 selftype *right;
332 selftype *left;
333 }*NODE
334 </pre>
335
336 <li></li>
337
338 </div> 329 </div>
339 <!-- PAGE --> 330 <!-- PAGE -->
340 <div class="slide"> 331 <div class="slide">
341 <h1>環境付き継続とは</h1> 332 <h1>環境付き継続とは</h1>
342 <li>コードセグメントを呼び出した C の関数に戻る機能</li> 333 <li>コードセグメントを呼び出した C の関数に戻る機能</li>