Adding support for the SSE Reciprocal, ReciprocalSqrt, and Sqrt scalar intrinsics
authorTanner Gooding <tagoo@outlook.com>
Fri, 29 Dec 2017 03:11:51 +0000 (19:11 -0800)
committerTanner Gooding <tagoo@outlook.com>
Wed, 17 Jan 2018 00:04:55 +0000 (16:04 -0800)
src/jit/hwintrinsiccodegenxarch.cpp
src/jit/hwintrinsicxarch.cpp

index 76f2706..1a9c493 100644 (file)
@@ -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)
index df0ca9c..cf7673c 100644 (file)
@@ -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);