如何新增受限浮點內建函式¶
警告
這項功能仍在開發中。
新增內建函式¶
新增新的受限內建函式時,需要更新多個檔案。
將新的內建函式新增到內建函式表
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