From: Dan Gohman Date: Thu, 26 Jul 2012 17:43:27 +0000 (+0000) Subject: Add a floor intrinsic. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=27db99fcee85939f0b7580ad55303c4c60a3b98d;p=oota-llvm.git Add a floor intrinsic. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160791 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/LangRef.html b/docs/LangRef.html index 4d0539241f7..ef58b988172 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -258,6 +258,7 @@
  • 'llvm.log.*' Intrinsic
  • 'llvm.fma.*' Intrinsic
  • 'llvm.fabs.*' Intrinsic
  • +
  • 'llvm.floor.*' Intrinsic
  • Bit Manipulation Intrinsics @@ -7544,6 +7545,40 @@ LLVM.

    + +

    + 'llvm.floor.*' Intrinsic +

    + +
    + +
    Syntax:
    +

    This is an overloaded intrinsic. You can use llvm.floor on any + floating point or vector of floating point type. Not all targets support all + types however.

    + +
    +  declare float     @llvm.floor.f32(float  %Val)
    +  declare double    @llvm.floor.f64(double %Val)
    +  declare x86_fp80  @llvm.floor.f80(x86_fp80  %Val)
    +  declare fp128     @llvm.floor.f128(fp128 %Val)
    +  declare ppc_fp128 @llvm.floor.ppcf128(ppc_fp128  %Val)
    +
    + +
    Overview:
    +

    The 'llvm.floor.*' intrinsics return the floor of + the operand.

    + +
    Arguments:
    +

    The argument and return value are floating point numbers of the same + type.

    + +
    Semantics:
    +

    This function returns the same values as the libm floor functions + would, and handles error conditions in the same way.

    + +
    + diff --git a/include/llvm/Intrinsics.td b/include/llvm/Intrinsics.td index 06850c99999..f3c58acb2ac 100644 --- a/include/llvm/Intrinsics.td +++ b/include/llvm/Intrinsics.td @@ -261,6 +261,7 @@ let Properties = [IntrReadMem] in { def int_exp : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>; def int_exp2 : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>; def int_fabs : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>; + def int_floor : Intrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>; } let Properties = [IntrNoMem] in { diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 8cbe8182818..2cdc41b078e 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -4929,6 +4929,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) { getValue(I.getArgOperand(0)).getValueType(), getValue(I.getArgOperand(0)))); return 0; + case Intrinsic::floor: + setValue(&I, DAG.getNode(ISD::FFLOOR, dl, + getValue(I.getArgOperand(0)).getValueType(), + getValue(I.getArgOperand(0)))); + return 0; case Intrinsic::fma: setValue(&I, DAG.getNode(ISD::FMA, dl, getValue(I.getArgOperand(0)).getValueType(),