From 3fcdaf8dc2698f444625a9d1236d985b8860b1dc Mon Sep 17 00:00:00 2001 From: Tanner Gooding Date: Thu, 28 Dec 2017 19:11:51 -0800 Subject: [PATCH] Adding support for the SSE Reciprocal, ReciprocalSqrt, and Sqrt scalar intrinsics --- src/jit/hwintrinsiccodegenxarch.cpp | 18 ++++++++++++++++++ src/jit/hwintrinsicxarch.cpp | 3 +++ 2 files changed, 21 insertions(+) diff --git a/src/jit/hwintrinsiccodegenxarch.cpp b/src/jit/hwintrinsiccodegenxarch.cpp index 76f2706..1a9c493 100644 --- a/src/jit/hwintrinsiccodegenxarch.cpp +++ b/src/jit/hwintrinsiccodegenxarch.cpp @@ -422,12 +422,24 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node) emit->emitIns_SIMD_R_R(INS_rcpps, targetReg, op1Reg, TYP_SIMD16); break; + case NI_SSE_ReciprocalScalar: + assert(baseType == TYP_FLOAT); + assert(op2 == nullptr); + emit->emitIns_SIMD_R_R_R(INS_rcpss, targetReg, op1Reg, op1Reg, TYP_SIMD16); + break; + case NI_SSE_ReciprocalSqrt: assert(baseType == TYP_FLOAT); assert(op2 == nullptr); emit->emitIns_SIMD_R_R(INS_rsqrtps, targetReg, op1Reg, TYP_SIMD16); break; + case NI_SSE_ReciprocalSqrtScalar: + assert(baseType == TYP_FLOAT); + assert(op2 == nullptr); + emit->emitIns_SIMD_R_R_R(INS_rsqrtss, targetReg, op1Reg, op1Reg, TYP_SIMD16); + break; + case NI_SSE_SetAllVector128: assert(baseType == TYP_FLOAT); assert(op2 == nullptr); @@ -536,6 +548,12 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node) emit->emitIns_SIMD_R_R(INS_sqrtps, targetReg, op1Reg, TYP_SIMD16); break; + case NI_SSE_SqrtScalar: + assert(baseType == TYP_FLOAT); + assert(op2 == nullptr); + emit->emitIns_SIMD_R_R_R(INS_sqrtss, targetReg, op1Reg, op1Reg, TYP_SIMD16); + break; + case NI_SSE_StaticCast: assert(op2 == nullptr); if (op1Reg != targetReg) diff --git a/src/jit/hwintrinsicxarch.cpp b/src/jit/hwintrinsicxarch.cpp index df0ca9c..cf7673c 100644 --- a/src/jit/hwintrinsicxarch.cpp +++ b/src/jit/hwintrinsicxarch.cpp @@ -598,8 +598,11 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic intrinsic, break; case NI_SSE_Reciprocal: + case NI_SSE_ReciprocalScalar: case NI_SSE_ReciprocalSqrt: + case NI_SSE_ReciprocalSqrtScalar: case NI_SSE_Sqrt: + case NI_SSE_SqrtScalar: assert(sig->numArgs == 1); assert(getBaseTypeOfSIMDType(sig->retTypeSigClass) == TYP_FLOAT); op1 = impSIMDPopStack(TYP_SIMD16); -- 2.7.4