倍精度浮動小数点数の加減乗除をコンパイルした結果が実行できるようになりました。
実行例(倍精度浮動小数点数の加算)
double dadd(double x, double y) { return x + y; }
これをコンパイルすると以下のようなアセンブリ言語のコードが得られます。
_Z4dadddd: move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) jsr __adddf3 lea (16,%sp),%sp rts
これは __adddf3 のサブルーチンがないのでこのままでは実行できません。以下のような疑似関数を使えるようにします。
「*call_dadd」は「jsr __adddf3」の代わりに使えるものです。これを使うと以下のようになります。
_Z4dadddd: move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) *call_dadd lea (16,%sp),%sp rts
「*dadd」はサブルーチンの本体の代わりに使えるものです。これを使うと以下のようになります。
_Z4dadddd: move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) move.l 16(%sp),-(%sp) jsr __adddf3 lea (16,%sp),%sp rts __adddf3: *dadd rts
コマンドの追加
結果を表示するため以下のコマンドを追加します。
疑似関数
- *lmulu, *lmuls, *call_lmulu, *call_lmuls
- 乗算の関数の代わりに使う
- 「u」が付くものは符号なし、「s」が付くものは符号あり
- 「call_」が付くものは関数呼び出しの代わりに使う
- *ldivu, *ldivs, *call_ldivu, *call_ldivs
- 除算の関数の代わりに使う
- 「u」が付くものは符号なし、「s」が付くものは符号あり
- 「call_」が付くものは関数呼び出しの代わりに使う
- *dadd, *call_dadd
- 浮動小数点数の加算の関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う
- *dsub, *call_dsub
- 浮動小数点数の減算の関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う
- *dmul, *call_dmul
- 浮動小数点数の乗算の関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う
- *ddiv, *call_ddiv
- 浮動小数点数の除算の関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う
- *dsin, *call_dsin
- sin 関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う
- *dcos, *call_dcos
- cos 関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う
- *dsqrt, *call_dsqrt
- sqrt 関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う
- *itod, *call_itod
- 整数から浮動小数点数への変換関数の代わりに使う
- 「call_」が付くものは関数呼び出しの代わりに使う

