Adding support for the SSE Add, Divide, Max, Min, Move, Multiply, and Subtract scalar...
authorTanner Gooding <tagoo@outlook.com>
Fri, 29 Dec 2017 01:27:49 +0000 (17:27 -0800)
committerTanner Gooding <tagoo@outlook.com>
Wed, 17 Jan 2018 00:04:54 +0000 (16:04 -0800)
src/jit/hwintrinsiccodegenxarch.cpp
src/jit/hwintrinsicxarch.cpp

index 3db92af..4fcb00b 100644 (file)
@@ -222,6 +222,12 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
             break;
         }
 
+        case NI_SSE_AddScalar:
+            assert(baseType == TYP_FLOAT);
+            op2Reg = op2->gtRegNum;
+            emit->emitIns_SIMD_R_R_R(INS_addss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
+            break;
+
         case NI_SSE_And:
             assert(baseType == TYP_FLOAT);
             op2Reg = op2->gtRegNum;
@@ -292,18 +298,36 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
             emit->emitIns_SIMD_R_R_R(INS_divps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
             break;
 
+        case NI_SSE_DivideScalar:
+            assert(baseType == TYP_FLOAT);
+            op2Reg = op2->gtRegNum;
+            emit->emitIns_SIMD_R_R_R(INS_divss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
+            break;
+
         case NI_SSE_Max:
             assert(baseType == TYP_FLOAT);
             op2Reg = op2->gtRegNum;
             emit->emitIns_SIMD_R_R_R(INS_maxps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
             break;
 
+        case NI_SSE_MaxScalar:
+            assert(baseType == TYP_FLOAT);
+            op2Reg = op2->gtRegNum;
+            emit->emitIns_SIMD_R_R_R(INS_maxss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
+            break;
+
         case NI_SSE_Min:
             assert(baseType == TYP_FLOAT);
             op2Reg = op2->gtRegNum;
             emit->emitIns_SIMD_R_R_R(INS_minps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
             break;
 
+        case NI_SSE_MinScalar:
+            assert(baseType == TYP_FLOAT);
+            op2Reg = op2->gtRegNum;
+            emit->emitIns_SIMD_R_R_R(INS_minss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
+            break;
+
         case NI_SSE_MoveHighToLow:
             assert(baseType == TYP_FLOAT);
             op2Reg = op2->gtRegNum;
@@ -316,12 +340,24 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
             emit->emitIns_SIMD_R_R_R(INS_movlhps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
             break;
 
+        case NI_SSE_MoveScalar:
+            assert(baseType == TYP_FLOAT);
+            op2Reg = op2->gtRegNum;
+            emit->emitIns_SIMD_R_R_R(INS_movss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
+            break;
+
         case NI_SSE_Multiply:
             assert(baseType == TYP_FLOAT);
             op2Reg = op2->gtRegNum;
             emit->emitIns_SIMD_R_R_R(INS_mulps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
             break;
 
+        case NI_SSE_MultiplyScalar:
+            assert(baseType == TYP_FLOAT);
+            op2Reg = op2->gtRegNum;
+            emit->emitIns_SIMD_R_R_R(INS_mulss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
+            break;
+
         case NI_SSE_Or:
             assert(baseType == TYP_FLOAT);
             op2Reg = op2->gtRegNum;
@@ -462,6 +498,12 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
             emit->emitIns_SIMD_R_R_R(INS_subps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
             break;
 
+        case NI_SSE_SubtractScalar:
+            assert(baseType == TYP_FLOAT);
+            op2Reg = op2->gtRegNum;
+            emit->emitIns_SIMD_R_R_R(INS_subss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
+            break;
+
         case NI_SSE_UnpackHigh:
             assert(baseType == TYP_FLOAT);
             op2Reg = op2->gtRegNum;
index 4dfc9a8..7959956 100644 (file)
@@ -521,6 +521,7 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic        intrinsic,
         }
 
         case NI_SSE_Add:
+        case NI_SSE_AddScalar:
         case NI_SSE_And:
         case NI_SSE_AndNot:
         case NI_SSE_CompareEqual:
@@ -536,13 +537,19 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic        intrinsic,
         case NI_SSE_CompareOrdered:
         case NI_SSE_CompareUnordered:
         case NI_SSE_Divide:
+        case NI_SSE_DivideScalar:
         case NI_SSE_Max:
+        case NI_SSE_MaxScalar:
         case NI_SSE_Min:
+        case NI_SSE_MinScalar:
         case NI_SSE_MoveHighToLow:
         case NI_SSE_MoveLowToHigh:
+        case NI_SSE_MoveScalar:
         case NI_SSE_Multiply:
+        case NI_SSE_MultiplyScalar:
         case NI_SSE_Or:
         case NI_SSE_Subtract:
+        case NI_SSE_SubtractScalar:
         case NI_SSE_UnpackHigh:
         case NI_SSE_UnpackLow:
         case NI_SSE_Xor: