Scheme Compiler の勉強 (2) - fxupper

compiler.scm で tests-1.1-req.scm の二つのテストが通らない理由を追いかける。このテストは、前回決めた tagged pointer で表現できる最大と最小の整数(fxupper = 即値 536870911 (=2^29-1))を確認している。

そもそも手元の環境は PowerPC なので、命令がそもそも固定長、大きな数値では scheme から呼び出される gcc/llvm-gccコンパイルに失敗している。
問題解決は元の"Compilers: Backend to Frontend and Back to Front Again" のやり方で行く。つまり C で書いて、 gcc -S でアセンブラを確認する、という地味な方法。以下、PowerPC を知っている人にとっては超入門的内容のはず。

  • li 命令一つで書けているのは 32767 (111111111111111)まで。32768 以降は命令が lis, ori の二つになる。
  • 手元には暫く前に探した「32ビットPowerPCアーキテクチャプログラミング環境」のPDFがある。が、まだこれだけでは読み解けない。SIMM 「符合付きイミディエイト値」の範囲がどこかに書いていると思うのだが常識なのだろう、かえってど素人の自分には探せない。むむむ。
  • http://www.super-computing.org/~ysd/yuke/ こんなページを見つけた。おお、これで SIMM=16bit signed integer だ、ちゃんと整合性が取れたかな。
  • 次はこれをちゃんと compiler.scm に反映させなきゃ。
  • おっと。今頃気付いたけど、実は今のところ LLVM は無関係。llvm-gcc は -emit-llvm とすると全く違うコードが出てくる。LLVM 用にするには、上と同じく、llvm-gcc -S -emit-llvmアセンブラを確認し、それを出力するような scheme コードを書く。
  • 選択肢は二つ。1. gcc for PowerPC 、と同じコードが出せるようになるまで compiler.scm を修正。その後も PowerPC のことだけを意識。2. LLVM だけを気にして、 compiler.scm が LLVM のコードを吐くようにする。

続く