制約付き浮動小数点組込み関数の追加方法

警告

これは開発中の作業です。

組込み関数の追加

新しい制約付き組込み関数を追加する際には、複数のファイルの更新が必要です。

組込み関数のテーブルに新しい組込み関数を追加します

include/llvm/IR/Intrinsics.td

SelectionDAGノードタイプの追加

ノードタイプの新しいSTRICTバージョンをISD::NodeType列挙型に追加します。

include/llvm/CodeGen/ISDOpcodes.h

STRICTバージョンの名前は、接頭辞STRICT_と対応する非STRICTノード名の連結でなければなりません。たとえば、ノードFADDのSTRICTバージョンはSTRICT_FADDです。

マッピングの更新

命令と制約付き組込み関数およびDAGノードのマッピングに新しいレコードを追加します。

include/llvm/IR/ConstrainedOps.def

このファイルに記載されている手順に従ってください。

IRコンポーネントの更新

IR検証器を更新します。

lib/IR/Verifier.cpp

セレクタコンポーネントの更新

SelectionDAGの構築

関数SelectionDAGBuilder::visitConstrainedFPIntrinsicは、ConstrainedOps.defで指定されたマッピングを使用してDAGノードを構築します。しかし、このデフォルトの構築では不十分な場合、STRICT_FP_ROUNDの実装方法を参照して構築を変更できます。新しいSTRICTノードは最終的に対応する非STRICTノードに変換されます。このため、非STRICTバージョンと同じオペランドと値を持つ必要がありますが、チェーンも使用する必要があります。これにより、STRICTと非STRICTのコードパスのコード共有が容易になります。

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp

ほとんどのSTRICTノードは、対応する非STRICTノードと同様に合法化されます。この特性を持つ新しいSTRICTノードをSelectionDAGLegalize::LegalizeOp()のswitchに追加する必要があります。

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

合法化器の他の部分も更新が必要になる場合があります。非STRICT対応物が合法化されている場所を探し、必要に応じて更新してください。STRICTノードはチェーンを使用しますが、対応物は多くの場合使用しないため、チェーンに注意してください。

STRICTノードをノードの非STRICTバージョンに変換または変更するコードは、SelectionDAG::mutateStrictFPToFP()にあります。ほとんどの場合、この関数はConstrainedOps.defの情報を使用して変換できます。この関数を更新する際には注意してください。一部のノードは入力オペランドと同じ戻り値型を持っていますが、一部は異なります。これらの両方のケースを適切に処理する必要があります。

lib/CodeGen/SelectionDAG/SelectionDAG.cpp

変更が発生するかどうかは、新しいノードがTargetLoweringBase::initActions()でどのように登録されているかによって異なります。デフォルトでは、すべてのstrictノードはExpandアクションで登録されています。

lib/CodeGen/TargetLoweringBase.cpp

デバッグログを読みやすくするために、SelectionDAGのデバッグロガーを更新することが役立ちます。

lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp

ドキュメントとテストの追加

docs/LangRef.rst