制約付き浮動小数点組込み関数の追加方法¶
警告
これは開発中の作業です。
組込み関数の追加¶
新しい制約付き組込み関数を追加する際には、複数のファイルの更新が必要です。
組込み関数のテーブルに新しい組込み関数を追加します
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