如何新增受限浮點內建函式

警告

這項功能仍在開發中。

新增內建函式

新增新的受限內建函式時,需要更新多個檔案。

將新的內建函式新增到內建函式表

include/llvm/IR/Intrinsics.td

新增 SelectionDAG 節點類型

將新的 STRICT 版本的節點類型新增到 ISD::NodeType 列舉

include/llvm/CodeGen/ISDOpcodes.h

嚴格版本名稱必須是前綴 STRICT_ 與對應非嚴格節點名稱的串聯。例如,節點 FADD 的嚴格版本必須是 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() 中的註冊方式。根據預設,所有嚴格節點都註冊為 Expand 動作

lib/CodeGen/TargetLoweringBase.cpp

為了讓偵錯記錄易於閱讀,建議更新 SelectionDAG 的偵錯記錄器:

lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp

新增文件和測試

docs/LangRef.rst