diff options
-rw-r--r-- | src/jit/codegenarmarch.cpp | 13 | ||||
-rw-r--r-- | src/jit/emit.h | 9 | ||||
-rw-r--r-- | src/jit/importer.cpp | 2 | ||||
-rw-r--r-- | src/jit/lsraarm64.cpp | 4 | ||||
-rw-r--r-- | src/jit/valuenum.cpp | 12 |
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; |