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

Commit 402550c

Browse files
committed
Adding support for the SSE compare eq, gt, ge, lt, le, ne, ord, and unord intrinsics
1 parent 1cb5722 commit 402550c

File tree

4 files changed

+82
-0
lines changed

4 files changed

+82
-0
lines changed

src/jit/emitxarch.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5142,6 +5142,23 @@ void emitter::emitIns_SIMD_R_R_S(instruction ins, regNumber reg, regNumber reg1,
51425142
emitIns_R_S(ins, emitTypeSize(simdtype), reg, varx, offs);
51435143
}
51445144
}
5145+
5146+
void emitter::emitIns_SIMD_R_R_R_I(
5147+
instruction ins, regNumber reg, regNumber reg1, regNumber reg2, int ival, var_types simdtype)
5148+
{
5149+
if (UseVEXEncoding())
5150+
{
5151+
emitIns_R_R_R_I(ins, emitTypeSize(simdtype), reg, reg1, reg2, ival);
5152+
}
5153+
else
5154+
{
5155+
if (reg1 != reg)
5156+
{
5157+
emitIns_R_R(INS_movaps, emitTypeSize(simdtype), reg, reg1);
5158+
}
5159+
emitIns_R_R_I(ins, emitTypeSize(simdtype), reg, reg2, ival);
5160+
}
5161+
}
51455162
#endif
51465163

51475164
/*****************************************************************************

src/jit/emitxarch.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@ void emitIns_SIMD_R_R_C(
446446
instruction ins, regNumber reg, regNumber reg1, CORINFO_FIELD_HANDLE fldHnd, int offs, var_types simdtype);
447447
void emitIns_SIMD_R_R_R(instruction ins, regNumber reg, regNumber reg1, regNumber reg2, var_types simdtype);
448448
void emitIns_SIMD_R_R_S(instruction ins, regNumber reg, regNumber reg1, int varx, int offs, var_types simdtype);
449+
void emitIns_SIMD_R_R_R_I(instruction ins, regNumber reg, regNumber reg1, regNumber reg2, int ival, var_types simdtype);
449450
#endif
450451

451452
#if FEATURE_STACK_FP_X87

src/jit/hwintrinsiccodegenxarch.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,58 @@ void CodeGen::genSSEIntrinsic(GenTreeHWIntrinsic* node)
226226
emit->emitIns_SIMD_R_R_R(INS_andnps, targetReg, op1Reg, op2Reg, TYP_SIMD16);
227227
break;
228228

229+
case NI_SSE_CompareEqual:
230+
assert(baseType == TYP_FLOAT);
231+
op2Reg = op2->gtRegNum;
232+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 0, TYP_SIMD16);
233+
break;
234+
235+
case NI_SSE_CompareGreaterThan:
236+
case NI_SSE_CompareNotLessThanOrEqual:
237+
assert(baseType == TYP_FLOAT);
238+
op2Reg = op2->gtRegNum;
239+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 6, TYP_SIMD16);
240+
break;
241+
242+
case NI_SSE_CompareGreaterThanOrEqual:
243+
case NI_SSE_CompareNotLessThan:
244+
assert(baseType == TYP_FLOAT);
245+
op2Reg = op2->gtRegNum;
246+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 5, TYP_SIMD16);
247+
break;
248+
249+
case NI_SSE_CompareLessThan:
250+
case NI_SSE_CompareNotGreaterThanOrEqual:
251+
assert(baseType == TYP_FLOAT);
252+
op2Reg = op2->gtRegNum;
253+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 1, TYP_SIMD16);
254+
break;
255+
256+
case NI_SSE_CompareLessThanOrEqual:
257+
case NI_SSE_CompareNotGreaterThan:
258+
assert(baseType == TYP_FLOAT);
259+
op2Reg = op2->gtRegNum;
260+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 2, TYP_SIMD16);
261+
break;
262+
263+
case NI_SSE_CompareNotEqual:
264+
assert(baseType == TYP_FLOAT);
265+
op2Reg = op2->gtRegNum;
266+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 4, TYP_SIMD16);
267+
break;
268+
269+
case NI_SSE_CompareOrdered:
270+
assert(baseType == TYP_FLOAT);
271+
op2Reg = op2->gtRegNum;
272+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 7, TYP_SIMD16);
273+
break;
274+
275+
case NI_SSE_CompareUnordered:
276+
assert(baseType == TYP_FLOAT);
277+
op2Reg = op2->gtRegNum;
278+
emit->emitIns_SIMD_R_R_R_I(INS_cmpps, targetReg, op1Reg, op2Reg, 3, TYP_SIMD16);
279+
break;
280+
229281
case NI_SSE_Divide:
230282
assert(baseType == TYP_FLOAT);
231283
op2Reg = op2->gtRegNum;

src/jit/hwintrinsicxarch.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,18 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic intrinsic,
455455
case NI_SSE_Add:
456456
case NI_SSE_And:
457457
case NI_SSE_AndNot:
458+
case NI_SSE_CompareEqual:
459+
case NI_SSE_CompareGreaterThan:
460+
case NI_SSE_CompareGreaterThanOrEqual:
461+
case NI_SSE_CompareLessThan:
462+
case NI_SSE_CompareLessThanOrEqual:
463+
case NI_SSE_CompareNotEqual:
464+
case NI_SSE_CompareNotGreaterThan:
465+
case NI_SSE_CompareNotGreaterThanOrEqual:
466+
case NI_SSE_CompareNotLessThan:
467+
case NI_SSE_CompareNotLessThanOrEqual:
468+
case NI_SSE_CompareOrdered:
469+
case NI_SSE_CompareUnordered:
458470
case NI_SSE_Divide:
459471
case NI_SSE_Max:
460472
case NI_SSE_Min:

0 commit comments

Comments
 (0)