Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit bfc992e

Browse files
committed
Adding support for the SSE Add, Divide, Max, Min, Move, Multiply, and Subtract scalar intrinsics
1 parent 1283d87 commit bfc992e

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

src/jit/hwintrinsiccodegenxarch.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,12 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
222222
break;
223223
}
224224

225+
case NI_SSE_AddScalar:
226+
assert(baseType == TYP_FLOAT);
227+
op2Reg = op2->gtRegNum;
228+
emit->emitIns_SIMD_R_R_R(INS_addss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
229+
break;
230+
225231
case NI_SSE_And:
226232
assert(baseType == TYP_FLOAT);
227233
op2Reg = op2->gtRegNum;
@@ -292,18 +298,36 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
292298
emit->emitIns_SIMD_R_R_R(INS_divps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
293299
break;
294300

301+
case NI_SSE_DivideScalar:
302+
assert(baseType == TYP_FLOAT);
303+
op2Reg = op2->gtRegNum;
304+
emit->emitIns_SIMD_R_R_R(INS_divss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
305+
break;
306+
295307
case NI_SSE_Max:
296308
assert(baseType == TYP_FLOAT);
297309
op2Reg = op2->gtRegNum;
298310
emit->emitIns_SIMD_R_R_R(INS_maxps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
299311
break;
300312

313+
case NI_SSE_MaxScalar:
314+
assert(baseType == TYP_FLOAT);
315+
op2Reg = op2->gtRegNum;
316+
emit->emitIns_SIMD_R_R_R(INS_maxss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
317+
break;
318+
301319
case NI_SSE_Min:
302320
assert(baseType == TYP_FLOAT);
303321
op2Reg = op2->gtRegNum;
304322
emit->emitIns_SIMD_R_R_R(INS_minps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
305323
break;
306324

325+
case NI_SSE_MinScalar:
326+
assert(baseType == TYP_FLOAT);
327+
op2Reg = op2->gtRegNum;
328+
emit->emitIns_SIMD_R_R_R(INS_minss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
329+
break;
330+
307331
case NI_SSE_MoveHighToLow:
308332
assert(baseType == TYP_FLOAT);
309333
op2Reg = op2->gtRegNum;
@@ -316,12 +340,24 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
316340
emit->emitIns_SIMD_R_R_R(INS_movlhps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
317341
break;
318342

343+
case NI_SSE_MoveScalar:
344+
assert(baseType == TYP_FLOAT);
345+
op2Reg = op2->gtRegNum;
346+
emit->emitIns_SIMD_R_R_R(INS_movss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
347+
break;
348+
319349
case NI_SSE_Multiply:
320350
assert(baseType == TYP_FLOAT);
321351
op2Reg = op2->gtRegNum;
322352
emit->emitIns_SIMD_R_R_R(INS_mulps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
323353
break;
324354

355+
case NI_SSE_MultiplyScalar:
356+
assert(baseType == TYP_FLOAT);
357+
op2Reg = op2->gtRegNum;
358+
emit->emitIns_SIMD_R_R_R(INS_mulss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
359+
break;
360+
325361
case NI_SSE_Or:
326362
assert(baseType == TYP_FLOAT);
327363
op2Reg = op2->gtRegNum;
@@ -462,6 +498,12 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
462498
emit->emitIns_SIMD_R_R_R(INS_subps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
463499
break;
464500

501+
case NI_SSE_SubtractScalar:
502+
assert(baseType == TYP_FLOAT);
503+
op2Reg = op2->gtRegNum;
504+
emit->emitIns_SIMD_R_R_R(INS_subss, targetReg, op1Reg, op2Reg, TYP_SIMD16);
505+
break;
506+
465507
case NI_SSE_UnpackHigh:
466508
assert(baseType == TYP_FLOAT);
467509
op2Reg = op2->gtRegNum;

src/jit/hwintrinsicxarch.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,7 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic intrinsic,
521521
}
522522

523523
case NI_SSE_Add:
524+
case NI_SSE_AddScalar:
524525
case NI_SSE_And:
525526
case NI_SSE_AndNot:
526527
case NI_SSE_CompareEqual:
@@ -536,13 +537,19 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic intrinsic,
536537
case NI_SSE_CompareOrdered:
537538
case NI_SSE_CompareUnordered:
538539
case NI_SSE_Divide:
540+
case NI_SSE_DivideScalar:
539541
case NI_SSE_Max:
542+
case NI_SSE_MaxScalar:
540543
case NI_SSE_Min:
544+
case NI_SSE_MinScalar:
541545
case NI_SSE_MoveHighToLow:
542546
case NI_SSE_MoveLowToHigh:
547+
case NI_SSE_MoveScalar:
543548
case NI_SSE_Multiply:
549+
case NI_SSE_MultiplyScalar:
544550
case NI_SSE_Or:
545551
case NI_SSE_Subtract:
552+
case NI_SSE_SubtractScalar:
546553
case NI_SSE_UnpackHigh:
547554
case NI_SSE_UnpackLow:
548555
case NI_SSE_Xor:

0 commit comments

Comments
 (0)