@@ -19273,21 +19273,59 @@ GenTree* Compiler::gtNewSimdCmpOpAllNode(genTreeOps op,
19273
19273
19274
19274
NamedIntrinsic intrinsic = NI_Illegal;
19275
19275
19276
+ #if defined(TARGET_XARCH)
19277
+ if (simdSize == 32)
19278
+ {
19279
+ assert(compIsaSupportedDebugOnly(InstructionSet_AVX));
19280
+ assert(varTypeIsFloating(simdBaseType) || compIsaSupportedDebugOnly(InstructionSet_AVX2));
19281
+ }
19282
+ #endif // TARGET_XARCH
19283
+
19276
19284
switch (op)
19277
19285
{
19278
19286
#if defined(TARGET_XARCH)
19279
19287
case GT_EQ:
19280
19288
{
19289
+ intrinsic = (simdSize == 32) ? NI_Vector256_op_Equality : NI_Vector128_op_Equality;
19290
+ break;
19291
+ }
19292
+
19293
+ case GT_GE:
19294
+ case GT_GT:
19295
+ case GT_LE:
19296
+ case GT_LT:
19297
+ {
19298
+ // We want to generate a comparison along the lines of
19299
+ // GT_XX(op1, op2).As<T, TInteger>() == Vector128<TInteger>.AllBitsSet
19300
+
19301
+ NamedIntrinsic getAllBitsSet = NI_Illegal;
19302
+
19281
19303
if (simdSize == 32)
19282
19304
{
19283
- assert(compIsaSupportedDebugOnly(InstructionSet_AVX));
19284
- assert(varTypeIsFloating(simdBaseType) || compIsaSupportedDebugOnly(InstructionSet_AVX2));
19285
- intrinsic = NI_Vector256_op_Equality;
19305
+ intrinsic = NI_Vector256_op_Equality;
19306
+ getAllBitsSet = NI_Vector256_get_AllBitsSet;
19286
19307
}
19287
19308
else
19288
19309
{
19289
- intrinsic = NI_Vector128_op_Equality;
19310
+ intrinsic = NI_Vector128_op_Equality;
19311
+ getAllBitsSet = NI_Vector128_get_AllBitsSet;
19312
+ }
19313
+
19314
+ op1 = gtNewSimdCmpOpNode(op, simdBaseType, op1, op2, simdBaseJitType, simdSize,
19315
+ /* isSimdAsHWIntrinsic */ false);
19316
+
19317
+ if (simdBaseType == TYP_FLOAT)
19318
+ {
19319
+ simdBaseType = TYP_INT;
19320
+ simdBaseJitType = CORINFO_TYPE_INT;
19321
+ }
19322
+ else if (simdBaseType == TYP_DOUBLE)
19323
+ {
19324
+ simdBaseType = TYP_LONG;
19325
+ simdBaseJitType = CORINFO_TYPE_LONG;
19290
19326
}
19327
+
19328
+ op2 = gtNewSimdHWIntrinsicNode(simdBaseType, getAllBitsSet, simdBaseJitType, simdSize);
19291
19329
break;
19292
19330
}
19293
19331
#elif defined(TARGET_ARM64)
@@ -19296,6 +19334,45 @@ GenTree* Compiler::gtNewSimdCmpOpAllNode(genTreeOps op,
19296
19334
intrinsic = (simdSize == 8) ? NI_Vector64_op_Equality : NI_Vector128_op_Equality;
19297
19335
break;
19298
19336
}
19337
+
19338
+ case GT_GE:
19339
+ case GT_GT:
19340
+ case GT_LE:
19341
+ case GT_LT:
19342
+ {
19343
+ // We want to generate a comparison along the lines of
19344
+ // GT_XX(op1, op2).As<T, TInteger>() == Vector128<TInteger>.AllBitsSet
19345
+
19346
+ NamedIntrinsic getAllBitsSet = NI_Illegal;
19347
+
19348
+ if (simdSize == 8)
19349
+ {
19350
+ intrinsic = NI_Vector64_op_Equality;
19351
+ getAllBitsSet = NI_Vector64_get_AllBitsSet;
19352
+ }
19353
+ else
19354
+ {
19355
+ intrinsic = NI_Vector128_op_Equality;
19356
+ getAllBitsSet = NI_Vector128_get_AllBitsSet;
19357
+ }
19358
+
19359
+ op1 = gtNewSimdCmpOpNode(op, simdBaseType, op1, op2, simdBaseJitType, simdSize,
19360
+ /* isSimdAsHWIntrinsic */ false);
19361
+
19362
+ if (simdBaseType == TYP_FLOAT)
19363
+ {
19364
+ simdBaseType = TYP_INT;
19365
+ simdBaseJitType = CORINFO_TYPE_INT;
19366
+ }
19367
+ else if (simdBaseType == TYP_DOUBLE)
19368
+ {
19369
+ simdBaseType = TYP_LONG;
19370
+ simdBaseJitType = CORINFO_TYPE_LONG;
19371
+ }
19372
+
19373
+ op2 = gtNewSimdHWIntrinsicNode(simdBaseType, getAllBitsSet, simdBaseJitType, simdSize);
19374
+ break;
19375
+ }
19299
19376
#else
19300
19377
#error Unsupported platform
19301
19378
#endif // !TARGET_XARCH && !TARGET_ARM64
@@ -19335,24 +19412,81 @@ GenTree* Compiler::gtNewSimdCmpOpAnyNode(genTreeOps op,
19335
19412
19336
19413
NamedIntrinsic intrinsic = NI_Illegal;
19337
19414
19415
+ #if defined(TARGET_XARCH)
19416
+ if (simdSize == 32)
19417
+ {
19418
+ assert(compIsaSupportedDebugOnly(InstructionSet_AVX));
19419
+ assert(varTypeIsFloating(simdBaseType) || compIsaSupportedDebugOnly(InstructionSet_AVX2));
19420
+ }
19421
+ #endif // TARGET_XARCH
19422
+
19338
19423
switch (op)
19339
19424
{
19340
19425
#if defined(TARGET_XARCH)
19341
- case GT_NE:
19426
+ case GT_EQ:
19427
+ case GT_GE:
19428
+ case GT_GT:
19429
+ case GT_LE:
19430
+ case GT_LT:
19342
19431
{
19343
- if (simdSize == 32)
19432
+ // We want to generate a comparison along the lines of
19433
+ // GT_XX(op1, op2).As<T, TInteger>() != Vector128<TInteger>.Zero
19434
+
19435
+ intrinsic = (simdSize == 32) ? NI_Vector256_op_Inequality : NI_Vector128_op_Inequality;
19436
+
19437
+ op1 = gtNewSimdCmpOpNode(op, simdBaseType, op1, op2, simdBaseJitType, simdSize,
19438
+ /* isSimdAsHWIntrinsic */ false);
19439
+
19440
+ if (simdBaseType == TYP_FLOAT)
19344
19441
{
19345
- assert(compIsaSupportedDebugOnly(InstructionSet_AVX));
19346
- assert(varTypeIsFloating(simdBaseType) || compIsaSupportedDebugOnly(InstructionSet_AVX2));
19347
- intrinsic = NI_Vector256_op_Inequality;
19442
+ simdBaseType = TYP_INT;
19443
+ simdBaseJitType = CORINFO_TYPE_INT;
19348
19444
}
19349
- else
19445
+ else if (simdBaseType == TYP_DOUBLE)
19350
19446
{
19351
- intrinsic = NI_Vector128_op_Inequality;
19447
+ simdBaseType = TYP_LONG;
19448
+ simdBaseJitType = CORINFO_TYPE_LONG;
19352
19449
}
19450
+
19451
+ op2 = gtNewSimdZeroNode(simdBaseType, simdBaseJitType, simdSize, /* isSimdAsHWIntrinsic */ false);
19452
+ break;
19453
+ }
19454
+
19455
+ case GT_NE:
19456
+ {
19457
+ intrinsic = (simdSize == 32) ? NI_Vector256_op_Inequality : NI_Vector128_op_Inequality;
19353
19458
break;
19354
19459
}
19355
19460
#elif defined(TARGET_ARM64)
19461
+ case GT_EQ:
19462
+ case GT_GE:
19463
+ case GT_GT:
19464
+ case GT_LE:
19465
+ case GT_LT:
19466
+ {
19467
+ // We want to generate a comparison along the lines of
19468
+ // GT_XX(op1, op2).As<T, TInteger>() != Vector128<TInteger>.Zero
19469
+
19470
+ intrinsic = (simdSize == 8) ? NI_Vector64_op_Inequality : NI_Vector128_op_Inequality;
19471
+
19472
+ op1 = gtNewSimdCmpOpNode(op, simdBaseType, op1, op2, simdBaseJitType, simdSize,
19473
+ /* isSimdAsHWIntrinsic */ false);
19474
+
19475
+ if (simdBaseType == TYP_FLOAT)
19476
+ {
19477
+ simdBaseType = TYP_INT;
19478
+ simdBaseJitType = CORINFO_TYPE_INT;
19479
+ }
19480
+ else if (simdBaseType == TYP_DOUBLE)
19481
+ {
19482
+ simdBaseType = TYP_LONG;
19483
+ simdBaseJitType = CORINFO_TYPE_LONG;
19484
+ }
19485
+
19486
+ op2 = gtNewSimdZeroNode(simdBaseType, simdBaseJitType, simdSize, /* isSimdAsHWIntrinsic */ false);
19487
+ break;
19488
+ }
19489
+
19356
19490
case GT_NE:
19357
19491
{
19358
19492
intrinsic = (simdSize == 8) ? NI_Vector64_op_Inequality : NI_Vector128_op_Inequality;
0 commit comments