[RISCV] Regenerate autogen test to remove spurious diff
[llvm-project.git] / llvm / docs / AddingConstrainedIntrinsics.rst
bloba6acb6b5153668dea4998501c52113517dbcd725
1 ==================================================
2 How To Add A Constrained Floating-Point Intrinsic
3 ==================================================
5 .. contents::
6    :local:
8 .. warning::
9   This is a work in progress.
11 Add the intrinsic
12 =================
14 Multiple files need to be updated when adding a new constrained intrinsic.
16 Add the new intrinsic to the table of intrinsics::
18   include/llvm/IR/Intrinsics.td
20 Add SelectionDAG node types
21 ===========================
23 Add the new STRICT version of the node type to the ISD::NodeType enum::
25   include/llvm/CodeGen/ISDOpcodes.h
27 Strict version name must be a concatenation of prefix ``STRICT_`` and the name
28 of corresponding non-strict node name. For instance, strict version of the
29 node FADD must be STRICT_FADD.
31 Update mappings
32 ===============
34 Add new record to the mapping of instructions to constrained intrinsic and
35 DAG nodes::
37   include/llvm/IR/ConstrainedOps.def
39 Follow instructions provided in this file.
41 Update IR components
42 ====================
44 Update the IR verifier::
46   lib/IR/Verifier.cpp
48 Update Selector components
49 ==========================
51 Building the SelectionDAG
52 -------------------------
54 The function SelectionDAGBuilder::visitConstrainedFPIntrinsic builds DAG nodes
55 using mappings specified in ConstrainedOps.def. If however this default build is
56 not sufficient, the build can be modified, see how it is implemented for
57 STRICT_FP_ROUND. The new STRICT node will eventually be converted
58 to the matching non-STRICT node. For this reason it should have the same
59 operands and values as the non-STRICT version but should also use the chain.
60 This makes subsequent sharing of code for STRICT and non-STRICT code paths
61 easier::
63   lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
65 Most of the STRICT nodes get legalized the same as their matching non-STRICT
66 counterparts. A new STRICT node with this property must get added to the
67 switch in SelectionDAGLegalize::LegalizeOp().::
69   lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
71 Other parts of the legalizer may need to be updated as well. Look for
72 places where the non-STRICT counterpart is legalized and update as needed.
73 Be careful of the chain since STRICT nodes use it but their counterparts
74 often don't.
76 The code to do the conversion or mutation of the STRICT node to a non-STRICT
77 version of the node happens in SelectionDAG::mutateStrictFPToFP(). In most cases
78 the function can do the conversion using information from ConstrainedOps.def. Be
79 careful updating this function since some nodes have the same return type
80 as their input operand, but some are different. Both of these cases must
81 be properly handled::
83   lib/CodeGen/SelectionDAG/SelectionDAG.cpp
85 Whether the mutation may happens or not, depends on how the new node has been
86 registered in TargetLoweringBase::initActions(). By default all strict nodes are
87 registered with Expand action::
89   lib/CodeGen/TargetLoweringBase.cpp
91 To make debug logs readable it is helpful to update the SelectionDAG's
92 debug logger:::
94   lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
96 Add documentation and tests
97 ===========================
101   docs/LangRef.rst