From: Tanner Gooding Date: Fri, 29 Dec 2017 03:11:51 +0000 (-0800) Subject: Adding support for the SSE Reciprocal, ReciprocalSqrt, and Sqrt scalar intrinsics X-Git-Tag: accepted/tizen/base/20180629.140029~127^2~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3fcdaf8dc2698f444625a9d1236d985b8860b1dc;p=platform%2Fupstream%2Fcoreclr.git Adding support for the SSE Reciprocal, ReciprocalSqrt, and Sqrt scalar intrinsics --- 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);