[llvm] r220341 - Add minnum / maxnum intrinsics

Pasi Parviainen pasi.parviainen at iki.fi
Wed Oct 22 06:19:35 PDT 2014


On 22.10.2014 2:00, Matt Arsenault wrote:
> Author: arsenm
> Date: Tue Oct 21 18:00:20 2014
> New Revision: 220341
>
> URL: http://llvm.org/viewvc/llvm-project?rev=220341&view=rev
> Log:
> Add minnum / maxnum intrinsics
>
> These are named following the IEEE-754 names for these
> functions, rather than the libm fmin / fmax to avoid
> possible ambiguities. Some languages may implement something
> resembling fmin / fmax which return NaN if either operand is
> to propagate errors. These implement the IEEE-754 semantics
> of returning the other operand if either is a NaN representing
> missing data.
>
> Added:
>      llvm/trunk/test/Transforms/InstCombine/maxnum.ll
>      llvm/trunk/test/Transforms/InstCombine/minnum.ll
> Modified:
>      llvm/trunk/docs/LangRef.rst
>      llvm/trunk/include/llvm/IR/Intrinsics.td
>      llvm/trunk/include/llvm/IR/PatternMatch.h
>      llvm/trunk/include/llvm/Target/TargetSelectionDAG.td
>      llvm/trunk/include/llvm/Transforms/Utils/VectorUtils.h
>      llvm/trunk/lib/Analysis/ConstantFolding.cpp
>      llvm/trunk/lib/Analysis/TargetTransformInfo.cpp
>      llvm/trunk/lib/Analysis/ValueTracking.cpp
>      llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
>      llvm/trunk/lib/Transforms/Vectorize/BBVectorize.cpp
>      llvm/trunk/test/Transforms/LoopVectorize/intrinsic.ll
>      llvm/trunk/test/Transforms/SimplifyCFG/speculate-math.ll
>
> Modified: llvm/trunk/docs/LangRef.rst
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=220341&r1=220340&r2=220341&view=diff
> ==============================================================================
> --- llvm/trunk/docs/LangRef.rst (original)
> +++ llvm/trunk/docs/LangRef.rst Tue Oct 21 18:00:20 2014
> @@ -8028,9 +8028,9 @@ all types however.
>
>         declare float     @llvm.fabs.f32(float  %Val)
>         declare double    @llvm.fabs.f64(double %Val)
> -      declare x86_fp80  @llvm.fabs.f80(x86_fp80  %Val)
> +      declare x86_fp80  @llvm.fabs.f80(x86_fp80 %Val)
>         declare fp128     @llvm.fabs.f128(fp128 %Val)
> -      declare ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128  %Val)
> +      declare ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128 %Val)
>
>   Overview:
>   """""""""
> @@ -8050,6 +8050,89 @@ Semantics:
>   This function returns the same values as the libm ``fabs`` functions
>   would, and handles error conditions in the same way.
>
> +'``llvm.minnum.*``' Intrinsic
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Syntax:
> +"""""""
> +
> +This is an overloaded intrinsic. You can use ``llvm.minnum`` on any
> +floating point or vector of floating point type. Not all targets support
> +all types however.
> +
> +::
> +
> +      declare float     @llvm.minnum.f32(float %Val)
> +      declare double    @llvm.minnum.f64(double %Val)
> +      declare x86_fp80  @llvm.minnum.f80(x86_fp80 %Val)
> +      declare fp128     @llvm.minnum.f128(fp128 %Val)
> +      declare ppc_fp128 @llvm.minnum.ppcf128(ppc_fp128 %Val)
> +
> +Overview:
> +"""""""""
> +
> +The '``llvm.minnum.*``' intrinsics return the minimum of the two
> +arguments.
> +

Syntax section implies that intrinsic only takes one argument, but 
overview section is talking about two arguments.

> +
> +Arguments:
> +""""""""""
> +
> +The arguments and return value are floating point numbers of the same
> +type.
> +
> +Semantics:
> +""""""""""
> +
> +Follows the IEEE-754 semantics for minNum, which also match for libm's
> +fmin.
> +
> +If either operand is a NaN, returns the other non-NaN operand. Returns
> +NaN only if both operands are NaN. If the operands compare equal,
> +returns a value that compares equal to both operands. This means that
> +fmin(+/-0.0, +/-0.0) could return either -0.0 or 0.0.
> +
> +'``llvm.maxnum.*``' Intrinsic
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Syntax:
> +"""""""
> +
> +This is an overloaded intrinsic. You can use ``llvm.maxnum`` on any
> +floating point or vector of floating point type. Not all targets support
> +all types however.
> +
> +::
> +
> +      declare float     @llvm.maxnum.f32(float  %Val)
> +      declare double    @llvm.maxnum.f64(double %Val)
> +      declare x86_fp80  @llvm.maxnum.f80(x86_fp80  %Val)
> +      declare fp128     @llvm.maxnum.f128(fp128 %Val)
> +      declare ppc_fp128 @llvm.maxnum.ppcf128(ppc_fp128  %Val)
> +
> +Overview:
> +"""""""""
> +
> +The '``llvm.maxnum.*``' intrinsics return the maximum of the two
> +arguments.
> +

Same here.

Pasi

> +
> +Arguments:
> +""""""""""
> +
> +The arguments and return value are floating point numbers of the same
> +type.
> +
> +Semantics:
> +""""""""""
> +Follows the IEEE-754 semantics for maxNum, which also match for libm's
> +fmax.
> +
> +If either operand is a NaN, returns the other non-NaN operand. Returns
> +NaN only if both operands are NaN. If the operands compare equal,
> +returns a value that compares equal to both operands. This means that
> +fmax(+/-0.0, +/-0.0) could return either -0.0 or 0.0.
> +
>   '``llvm.copysign.*``' Intrinsic
>   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
>





More information about the llvm-commits mailing list