mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
New document skeleton describing how to add a constrained floating-point
intrinsic. Reviewed by: andrew.w.kaylor, cameron.mcinally Differential Revision: https://reviews.llvm.org/D59833 llvm-svn: 358194
This commit is contained in:
parent
13cdef8a56
commit
d1b234bd1b
94
docs/AddingConstrainedIntrinsics.rst
Normal file
94
docs/AddingConstrainedIntrinsics.rst
Normal file
@ -0,0 +1,94 @@
|
||||
==================================================
|
||||
How To Add A Constrained Floating-Point Intrinsic
|
||||
==================================================
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
.. warning::
|
||||
This is a work in progress.
|
||||
|
||||
Add the intrinsic
|
||||
=================
|
||||
|
||||
Multiple files need to be updated when adding a new constrained intrinsic.
|
||||
|
||||
Add the new intrinsic to the table of intrinsics.::
|
||||
|
||||
include/llvm/IR/Intrinsics.td
|
||||
|
||||
Update class ConstrainedFPIntrinsic to know about the intrinsics.::
|
||||
|
||||
include/llvm/IR/IntrinsicInst.h
|
||||
|
||||
Functions like ConstrainedFPIntrinsic::isUnaryOp() or
|
||||
ConstrainedFPIntrinsic::isTernaryOp() may need to know about the new
|
||||
intrinsic.::
|
||||
|
||||
lib/IR/IntrinsicInst.cpp
|
||||
|
||||
Update the IR verifier::
|
||||
|
||||
lib/IR/Verifier.cpp
|
||||
|
||||
Add SelectionDAG node types
|
||||
===========================
|
||||
|
||||
Add the new STRICT version of the node type to the ISD::NodeType enum.::
|
||||
|
||||
include/llvm/CodeGen/ISDOpcodes.h
|
||||
|
||||
In class SDNode update isStrictFPOpcode()::
|
||||
|
||||
include/llvm/CodeGen/SelectionDAGNodes.h
|
||||
|
||||
A mapping from the STRICT SDnode type to the non-STRICT is done in
|
||||
TargetLoweringBase::getStrictFPOperationAction(). This allows STRICT
|
||||
nodes to be legalized similarly to the non-STRICT node type.::
|
||||
|
||||
include/llvm/CodeGen/TargetLowering.h
|
||||
|
||||
Building the SelectionDAG
|
||||
-------------------------
|
||||
|
||||
The switch statement in SelectionDAGBuilder::visitIntrinsicCall() needs
|
||||
to be updated to call SelectionDAGBuilder::visitConstrainedFPIntrinsic().
|
||||
That function, in turn, needs to be updated to know how to create the
|
||||
SDNode for the intrinsic. The new STRICT node will eventually be converted
|
||||
to the matching non-STRICT node. For this reason it should have the same
|
||||
operands and values as the non-STRICT version but should also use the chain.
|
||||
This makes subsequent sharing of code for STRICT and non-STRICT code paths
|
||||
easier.::
|
||||
|
||||
lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
|
||||
|
||||
Most of the STRICT nodes get legalized the same as their matching non-STRICT
|
||||
counterparts. A new STRICT node with this property must get added to the
|
||||
switch in SelectionDAGLegalize::LegalizeOp().::
|
||||
|
||||
lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
|
||||
|
||||
Other parts of the legalizer may need to be updated as well. Look for
|
||||
places where the non-STRICT counterpart is legalized and update as needed.
|
||||
Be careful of the chain since STRICT nodes use it but their counterparts
|
||||
often don't.::
|
||||
|
||||
The code to do the conversion or mutation of the STRICT node to a non-STRICT
|
||||
version of the node happens in SelectionDAG::mutateStrictFPToFP(). Be
|
||||
careful updating this function since some nodes have the same return type
|
||||
as their input operand, but some are different. Both of these cases must
|
||||
be properly handled.::
|
||||
|
||||
lib/CodeGen/SelectionDAG/SelectionDAG.cpp
|
||||
|
||||
To make debug logs readable it is helpful to update the SelectionDAG's
|
||||
debug logger:::
|
||||
|
||||
lib/CodeGen/SelectionDAG/SelectionDAGDumper.cpp
|
||||
|
||||
Add documentation and tests
|
||||
===========================
|
||||
|
||||
::
|
||||
|
||||
docs/LangRef.rst
|
@ -267,6 +267,7 @@ For API clients and LLVM developers.
|
||||
Bugpoint
|
||||
CodeGenerator
|
||||
ExceptionHandling
|
||||
AddingConstrainedIntrinsics
|
||||
LinkTimeOptimization
|
||||
SegmentedStacks
|
||||
TableGenFundamentals
|
||||
@ -345,6 +346,10 @@ For API clients and LLVM developers.
|
||||
This document describes the design and implementation of exception handling
|
||||
in LLVM.
|
||||
|
||||
:doc:`AddingConstrainedIntrinsics`
|
||||
Gives the steps necessary when adding a new constrained math intrinsic
|
||||
to LLVM.
|
||||
|
||||
:doc:`Bugpoint`
|
||||
Automatic bug finder and test-case reducer description and usage
|
||||
information.
|
||||
|
Loading…
Reference in New Issue
Block a user