From 27db99fcee85939f0b7580ad55303c4c60a3b98d Mon Sep 17 00:00:00 2001
From: Dan Gohman
Date: Thu, 26 Jul 2012 17:43:27 +0000
Subject: [PATCH] Add a floor intrinsic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160791 91177308-0d34-0410-b5e6-96231b3b80d8
---
docs/LangRef.html | 35 +++++++++++++++++++
include/llvm/Intrinsics.td | 1 +
.../SelectionDAG/SelectionDAGBuilder.cpp | 5 +++
3 files changed, 41 insertions(+)
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.
+
+
+
+
+
+
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(),
--
2.34.1