LLVM言語リファレンスマニュアルから始めたいと思うでしょう。
これらの線に沿って何かのように実装することから始めるかもしれませんtrunc( )
(警告、実際にはこれを使用しないでください。これは例として意図されており、正しくありません。以下の説明を参照してください)。
define float @trunc(float %x) {
%rounded = fptosi float %x to i32
%asFloat = sitofp i32 %rounded to float
ret float %asFloat
}
このfptosi ... to ...
命令は、浮動小数点値をゼロに丸める丸めモードに従って整数値に丸めることとして文書化されています。このsitofp ... to ...
命令は、その値を浮動小数点値に変換して返します。
ただし、この実装には問題があります。私がリンクした言語リファレンスを読んで、「fptosi ... to ...
最も近い整数への丸めの結果が宛先タイプに適合しない場合、の動作は未定義です。」
ただし、十分に大きい浮動小数点数はすべてすでに整数であり、丸める必要がないため、これは非常に簡単に回避できます。の絶対値がx
2^23以上の場合は、x自体を返すことができます。
(これはすべて単精度の場合です。倍精度の場合は、を使用する可能性が高くi64
、2 ^ 52のしきい値を使用する必要があります)
floor
およびのような他の操作については、round
から始めてtrunc
、残差を確認し、それx - trunc(x)
に応じて結果を調整することができます。
または、これらの関数がすでに含まれているホストプラットフォームのCライブラリを呼び出すこともできます。これは、多くのプログラミング言語で採用されているアプローチです。