[LLVMdev] FP Intrinsics
sabre at nondot.org
Wed Mar 16 08:38:53 PST 2005
On Fri, 11 Mar 2005, Morten Ofstad wrote:
> I am trying to make the FP intrinsics (abs, sin, cos, sqrt) I've added work
> with the X86ISelPattern, but I'm having some difficulties understanding what
> needs to be done.
Cool. Here are a couple of requests:
1. I don't think we need an "llvm.abs" intrinsic at the llvm level. This
can be modeled as a pair of setcc/select instructions.
2. My objection to llvm.abs does not apply to the FP_ABS
node you added: it is fine. Additionally, the target-independent
selection dag machinery should be the one that notices the relevant
setcc/select pairs at the llvm level to fabricate the FP_ABS node.
3. On X86 at least, sin and cos are not defined over the full numeric
range. These instructions are useful for applications like yours, and
situations where a flag like "-ffast-math" has been provided. Because
of this, please name the intrinsics and nodes sin_approx and
cos_approx. I don't think that sqrt on the X86 has this limitation,
so its intrinsic can be named just "llvm.sqrt".
4. Don't forget a doc patch to docs/LangRef.html :-)
> I assume I have to add new nodetypes for the FP
> instructions to SelectionDAGNodes.h, and make nodes for these in
> SelectionDAGLowering::visitCall when I find the intrinsic...
This looks good.
> The part I don't quite understand is what to do for targets that don't have
> these instructions (although I'm only interested in X86 myself, I would like
> to see these patches in the official LLVM version as it's some work to
> maintain them)
Ok, sounds good.
> -- for me it would make most sense to lower the intrinsic to a
> call if it's not supported. However I notice that for other intrinsics
> (memcpy etc.) this is done in LegalizeDAG where the node is expanded to a
> call if it's not directly supported for the target.
Yup, this is what we want to do. There are two places to implement this:
LegalizeDAG for the SelectionDAG isels, and
lib/CodeGen/IntrinsicLowering.cpp for other isels.
> To illustrate what I have been doing so far I attach the diff to this mail --
> if someone could have a look at it and tell me what needs to be done to get
> it working I would be very grateful... (Note that if you use the
> X86ISelSimple it's already working...)
One of the problems that jumps out at me in the pattern version is that
you have code that looks like this:
+ case Intrinsic::sqrt:
+ setValue(&I, DAG.getNode(ISD::FP_SQRT, MVT::f64,
In your case, you're passing in an float, which is 32-bits. You probably
want the type argument for this to be whatever the input type is, not hard
coded to f64.
More information about the llvm-dev