summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jit/codegenarmarch.cpp13
-rw-r--r--src/jit/emit.h9
-rw-r--r--src/jit/importer.cpp2
-rw-r--r--src/jit/lsraarm64.cpp4
-rw-r--r--src/jit/valuenum.cpp12
5 files changed, 33 insertions, 7 deletions
diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp
index 9b16fadc56..0c609b222d 100644
--- a/src/jit/codegenarmarch.cpp
+++ b/src/jit/codegenarmarch.cpp
@@ -445,7 +445,7 @@ void CodeGen::genIntrinsic(GenTreePtr treeNode)
assert(varTypeIsFloating(srcNode));
assert(srcNode->TypeGet() == treeNode->TypeGet());
- // Right now only Abs/Round/Sqrt are treated as math intrinsics.
+ // Right now only Abs/Ceiling/Floor/Round/Sqrt are treated as math intrinsics.
//
switch (treeNode->gtIntrinsic.gtIntrinsicId)
{
@@ -454,6 +454,17 @@ void CodeGen::genIntrinsic(GenTreePtr treeNode)
getEmitter()->emitInsBinary(INS_ABS, emitTypeSize(treeNode), treeNode, srcNode);
break;
+#ifdef _TARGET_ARM64_
+ case CORINFO_INTRINSIC_Ceiling:
+ genConsumeOperands(treeNode->AsOp());
+ getEmitter()->emitInsBinary(INS_frintp, emitActualTypeSize(treeNode), treeNode, srcNode);
+ break;
+
+ case CORINFO_INTRINSIC_Floor:
+ genConsumeOperands(treeNode->AsOp());
+ getEmitter()->emitInsBinary(INS_frintm, emitActualTypeSize(treeNode), treeNode, srcNode);
+ break;
+#endif
case CORINFO_INTRINSIC_Round:
NYI_ARM("genIntrinsic for round - not implemented yet");
genConsumeOperands(treeNode->AsOp());
diff --git a/src/jit/emit.h b/src/jit/emit.h
index a9dc076958..8c2b825fe7 100644
--- a/src/jit/emit.h
+++ b/src/jit/emit.h
@@ -2382,11 +2382,12 @@ inline emitAttr emitTypeSize(T type)
extern const unsigned short emitTypeActSz[TYP_COUNT];
-inline emitAttr emitActualTypeSize(var_types type)
+template <class T>
+inline emitAttr emitActualTypeSize(T type)
{
- assert(type < TYP_COUNT);
- assert(emitTypeActSz[type] > 0);
- return (emitAttr)emitTypeActSz[type];
+ assert(TypeGet(type) < TYP_COUNT);
+ assert(emitTypeActSz[TypeGet(type)] > 0);
+ return (emitAttr)emitTypeActSz[TypeGet(type)];
}
/*****************************************************************************
diff --git a/src/jit/importer.cpp b/src/jit/importer.cpp
index ddee0aba5b..e10ae6a3c4 100644
--- a/src/jit/importer.cpp
+++ b/src/jit/importer.cpp
@@ -18701,6 +18701,8 @@ bool Compiler::IsTargetIntrinsic(CorInfoIntrinsics intrinsicId)
case CORINFO_INTRINSIC_Sqrt:
case CORINFO_INTRINSIC_Abs:
case CORINFO_INTRINSIC_Round:
+ case CORINFO_INTRINSIC_Floor:
+ case CORINFO_INTRINSIC_Ceiling:
return true;
default:
diff --git a/src/jit/lsraarm64.cpp b/src/jit/lsraarm64.cpp
index e39c0d9332..0b6891ae65 100644
--- a/src/jit/lsraarm64.cpp
+++ b/src/jit/lsraarm64.cpp
@@ -260,9 +260,9 @@ void LinearScan::TreeNodeInfoInit(GenTree* tree)
case GT_INTRINSIC:
{
- // TODO-ARM64-NYI
- // Right now only Abs/Round/Sqrt are treated as math intrinsics
noway_assert((tree->gtIntrinsic.gtIntrinsicId == CORINFO_INTRINSIC_Abs) ||
+ (tree->gtIntrinsic.gtIntrinsicId == CORINFO_INTRINSIC_Ceiling) ||
+ (tree->gtIntrinsic.gtIntrinsicId == CORINFO_INTRINSIC_Floor) ||
(tree->gtIntrinsic.gtIntrinsicId == CORINFO_INTRINSIC_Round) ||
(tree->gtIntrinsic.gtIntrinsicId == CORINFO_INTRINSIC_Sqrt));
diff --git a/src/jit/valuenum.cpp b/src/jit/valuenum.cpp
index e4990d635a..473f0cec8e 100644
--- a/src/jit/valuenum.cpp
+++ b/src/jit/valuenum.cpp
@@ -3514,6 +3514,12 @@ ValueNum ValueNumStore::EvalMathFuncUnary(var_types typ, CorInfoIntrinsics gtMat
case CORINFO_INTRINSIC_Abs:
res = fabs(arg0Val);
break;
+ case CORINFO_INTRINSIC_Ceiling:
+ res = ceil(arg0Val);
+ break;
+ case CORINFO_INTRINSIC_Floor:
+ res = floor(arg0Val);
+ break;
case CORINFO_INTRINSIC_Round:
res = FloatingPointUtils::round(arg0Val);
break;
@@ -3544,6 +3550,12 @@ ValueNum ValueNumStore::EvalMathFuncUnary(var_types typ, CorInfoIntrinsics gtMat
case CORINFO_INTRINSIC_Abs:
res = fabsf(arg0Val);
break;
+ case CORINFO_INTRINSIC_Ceiling:
+ res = ceilf(arg0Val);
+ break;
+ case CORINFO_INTRINSIC_Floor:
+ res = floorf(arg0Val);
+ break;
case CORINFO_INTRINSIC_Round:
res = FloatingPointUtils::round(arg0Val);
break;