@@ -2254,23 +2254,47 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
22542254
22552255 void compareFloatingPointVector (DoubleCondition cond, SIMDInfo simdInfo, FPRegisterID left, FPRegisterID right, FPRegisterID dest)
22562256 {
2257+ RELEASE_ASSERT (supportsAVXForSIMD ());
22572258 RELEASE_ASSERT (scalarTypeIsFloatingPoint (simdInfo.lane ));
2258- UNUSED_PARAM (left); UNUSED_PARAM (right); UNUSED_PARAM (dest);
2259+
2260+ using PackedCompareCondition = X86Assembler::PackedCompareCondition;
22592261
22602262 switch (cond) {
22612263 case DoubleEqualAndOrdered:
2264+ if (simdInfo.lane == SIMDLane::f32x4)
2265+ m_assembler.vcmpps_rr (PackedCompareCondition::Equal, left, right, dest);
2266+ else
2267+ m_assembler.vcmppd_rr (PackedCompareCondition::Equal, left, right, dest);
22622268 break ;
22632269 case DoubleNotEqualOrUnordered:
2270+ if (simdInfo.lane == SIMDLane::f32x4)
2271+ m_assembler.vcmpps_rr (PackedCompareCondition::NotEqual, left, right, dest);
2272+ else
2273+ m_assembler.vcmppd_rr (PackedCompareCondition::NotEqual, left, right, dest);
22642274 break ;
22652275 case DoubleGreaterThanAndOrdered:
2276+ if (simdInfo.lane == SIMDLane::f32x4)
2277+ m_assembler.vcmpps_rr (PackedCompareCondition::GreaterThan, left, right, dest);
2278+ else
2279+ m_assembler.vcmppd_rr (PackedCompareCondition::GreaterThan, left, right, dest);
22662280 break ;
22672281 case DoubleGreaterThanOrEqualAndOrdered:
2282+ if (simdInfo.lane == SIMDLane::f32x4)
2283+ m_assembler.vcmpps_rr (PackedCompareCondition::GreaterThanOrEqual, left, right, dest);
2284+ else
2285+ m_assembler.vcmppd_rr (PackedCompareCondition::GreaterThanOrEqual, left, right, dest);
22682286 break ;
22692287 case DoubleLessThanAndOrdered:
2270- // a < b => b > a
2288+ if (simdInfo.lane == SIMDLane::f32x4)
2289+ m_assembler.vcmpps_rr (PackedCompareCondition::LessThan, left, right, dest);
2290+ else
2291+ m_assembler.vcmppd_rr (PackedCompareCondition::LessThan, left, right, dest);
22712292 break ;
22722293 case DoubleLessThanOrEqualAndOrdered:
2273- // a <= b => b >= a
2294+ if (simdInfo.lane == SIMDLane::f32x4)
2295+ m_assembler.vcmpps_rr (PackedCompareCondition::LessThanOrEqual, left, right, dest);
2296+ else
2297+ m_assembler.vcmppd_rr (PackedCompareCondition::LessThanOrEqual, left, right, dest);
22742298 break ;
22752299 default :
22762300 RELEASE_ASSERT_NOT_REACHED ();
@@ -2279,33 +2303,166 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
22792303
22802304 void compareIntegerVector (RelationalCondition cond, SIMDInfo simdInfo, FPRegisterID left, FPRegisterID right, FPRegisterID dest)
22812305 {
2306+ RELEASE_ASSERT (supportsAVXForSIMD ());
22822307 RELEASE_ASSERT (scalarTypeIsIntegral (simdInfo.lane ));
2283- UNUSED_PARAM (left); UNUSED_PARAM (right); UNUSED_PARAM (dest);
22842308
22852309 switch (cond) {
22862310 case Equal:
2311+ switch (simdInfo.lane ) {
2312+ case SIMDLane::i8x16:
2313+ m_assembler.vpcmpeqb_rr (left, right, dest);
2314+ break ;
2315+ case SIMDLane::i16x8:
2316+ m_assembler.vpcmpeqw_rr (left, right, dest);
2317+ break ;
2318+ case SIMDLane::i32x4:
2319+ m_assembler.vpcmpeqd_rr (left, right, dest);
2320+ break ;
2321+ case SIMDLane::i64x2:
2322+ m_assembler.vpcmpeqq_rr (left, right, dest);
2323+ break ;
2324+ default :
2325+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Unsupported SIMD lane for comparison" );
2326+ }
22872327 break ;
22882328 case NotEqual:
2329+ // NotEqual comparisons are implemented by negating Equal on Intel, which should be
2330+ // handled before we ever reach this point.
2331+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Shouldn't emit integer vector NotEqual comparisons directly." );
22892332 break ;
22902333 case Above:
2334+ // Above comparisons are implemented by negating BelowOrEqual on Intel, which should be
2335+ // handled before we ever reach this point.
2336+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Shouldn't emit integer vector Above comparisons directly." );
22912337 break ;
22922338 case AboveOrEqual:
2339+ switch (simdInfo.lane ) {
2340+ case SIMDLane::i8x16:
2341+ m_assembler.vpmaxub_rr (left, right, dest);
2342+ m_assembler.vpcmpeqb_rr (left, dest, dest);
2343+ break ;
2344+ case SIMDLane::i16x8:
2345+ m_assembler.vpmaxuw_rr (left, right, dest);
2346+ m_assembler.vpcmpeqw_rr (left, dest, dest);
2347+ break ;
2348+ case SIMDLane::i32x4:
2349+ m_assembler.vpmaxud_rr (left, right, dest);
2350+ m_assembler.vpcmpeqd_rr (left, dest, dest);
2351+ break ;
2352+ case SIMDLane::i64x2:
2353+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" i64x2 unsigned comparisons are not supported." );
2354+ break ;
2355+ default :
2356+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Unsupported SIMD lane for comparison" );
2357+ }
22932358 break ;
22942359 case Below:
2295- // a < b => b > a
2360+ // Below comparisons are implemented by negating AboveOrEqual on Intel, which should be
2361+ // handled before we ever reach this point.
2362+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Shouldn't emit integer vector Below comparisons directly." );
22962363 break ;
22972364 case BelowOrEqual:
2298- // a <= b => b >= a
2365+ switch (simdInfo.lane ) {
2366+ case SIMDLane::i8x16:
2367+ m_assembler.vpminub_rr (left, right, dest);
2368+ m_assembler.vpcmpeqb_rr (left, dest, dest);
2369+ break ;
2370+ case SIMDLane::i16x8:
2371+ m_assembler.vpminuw_rr (left, right, dest);
2372+ m_assembler.vpcmpeqw_rr (left, dest, dest);
2373+ break ;
2374+ case SIMDLane::i32x4:
2375+ m_assembler.vpminud_rr (left, right, dest);
2376+ m_assembler.vpcmpeqd_rr (left, dest, dest);
2377+ break ;
2378+ case SIMDLane::i64x2:
2379+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" i64x2 unsigned comparisons are not supported." );
2380+ break ;
2381+ default :
2382+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Unsupported SIMD lane for comparison" );
2383+ }
22992384 break ;
23002385 case GreaterThan:
2386+ switch (simdInfo.lane ) {
2387+ case SIMDLane::i8x16:
2388+ m_assembler.vpcmpgtb_rr (left, right, dest);
2389+ break ;
2390+ case SIMDLane::i16x8:
2391+ m_assembler.vpcmpgtw_rr (left, right, dest);
2392+ break ;
2393+ case SIMDLane::i32x4:
2394+ m_assembler.vpcmpgtd_rr (left, right, dest);
2395+ break ;
2396+ case SIMDLane::i64x2:
2397+ m_assembler.vpcmpgtq_rr (left, right, dest);
2398+ break ;
2399+ default :
2400+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Unsupported SIMD lane for comparison" );
2401+ }
23012402 break ;
23022403 case GreaterThanOrEqual:
2404+ switch (simdInfo.lane ) {
2405+ case SIMDLane::i8x16:
2406+ m_assembler.vpmaxsb_rr (left, right, dest);
2407+ m_assembler.vpcmpeqb_rr (left, dest, dest);
2408+ break ;
2409+ case SIMDLane::i16x8:
2410+ m_assembler.vpmaxsw_rr (left, right, dest);
2411+ m_assembler.vpcmpeqw_rr (left, dest, dest);
2412+ break ;
2413+ case SIMDLane::i32x4:
2414+ m_assembler.vpmaxsd_rr (left, right, dest);
2415+ m_assembler.vpcmpeqd_rr (left, dest, dest);
2416+ break ;
2417+ case SIMDLane::i64x2:
2418+ // Intel doesn't support 64-bit packed maximum/minimum without AVX512, so this condition should have been transformed
2419+ // into a negated LessThan prior to reaching the macro assembler.
2420+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Shouldn't emit integer vector GreaterThanOrEqual comparisons directly." );
2421+ break ;
2422+ default :
2423+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Unsupported SIMD lane for comparison" );
2424+ }
23032425 break ;
23042426 case LessThan:
2305- // a < b => b > a
2427+ switch (simdInfo.lane ) {
2428+ case SIMDLane::i8x16:
2429+ m_assembler.vpcmpgtb_rr (right, left, dest);
2430+ break ;
2431+ case SIMDLane::i16x8:
2432+ m_assembler.vpcmpgtw_rr (right, left, dest);
2433+ break ;
2434+ case SIMDLane::i32x4:
2435+ m_assembler.vpcmpgtd_rr (right, left, dest);
2436+ break ;
2437+ case SIMDLane::i64x2:
2438+ m_assembler.vpcmpgtq_rr (right, left, dest);
2439+ break ;
2440+ default :
2441+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Unsupported SIMD lane for comparison" );
2442+ }
23062443 break ;
23072444 case LessThanOrEqual:
2308- // a <= b => b >= a
2445+ switch (simdInfo.lane ) {
2446+ case SIMDLane::i8x16:
2447+ m_assembler.vpminsb_rr (left, right, dest);
2448+ m_assembler.vpcmpeqb_rr (left, dest, dest);
2449+ break ;
2450+ case SIMDLane::i16x8:
2451+ m_assembler.vpminsw_rr (left, right, dest);
2452+ m_assembler.vpcmpeqw_rr (left, dest, dest);
2453+ break ;
2454+ case SIMDLane::i32x4:
2455+ m_assembler.vpminsd_rr (left, right, dest);
2456+ m_assembler.vpcmpeqd_rr (left, dest, dest);
2457+ break ;
2458+ case SIMDLane::i64x2:
2459+ // Intel doesn't support 64-bit packed maximum/minimum without AVX512, so this condition should have been transformed
2460+ // into a negated GreaterThan prior to reaching the macro assembler.
2461+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Shouldn't emit integer vector LessThanOrEqual comparisons directly." );
2462+ break ;
2463+ default :
2464+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Unsupported SIMD lane for comparison" );
2465+ }
23092466 break ;
23102467 default :
23112468 RELEASE_ASSERT_NOT_REACHED ();
0 commit comments