@@ -2180,25 +2180,25 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
2180
2180
{
2181
2181
switch (simdLane) {
2182
2182
case SIMDLane::i8x16:
2183
- if (supportsAVX ())
2183
+ if (supportsAVXForSIMD ())
2184
2184
m_assembler.vpextrb_rr (lane.m_value , src, dest);
2185
2185
else
2186
2186
m_assembler.pextrb_rr (lane.m_value , src, dest);
2187
2187
break ;
2188
2188
case SIMDLane::i16x8:
2189
- if (supportsAVX ())
2189
+ if (supportsAVXForSIMD ())
2190
2190
m_assembler.vpextrw_rr (lane.m_value , src, dest);
2191
2191
else
2192
2192
m_assembler.pextrw_rr (lane.m_value , src, dest);
2193
2193
break ;
2194
2194
case SIMDLane::i32x4:
2195
- if (supportsAVX ())
2195
+ if (supportsAVXForSIMD ())
2196
2196
m_assembler.vpextrd_rr (lane.m_value , src, dest);
2197
2197
else
2198
2198
m_assembler.pextrd_rr (lane.m_value , src, dest);
2199
2199
break ;
2200
2200
case SIMDLane::i64x2:
2201
- if (supportsAVX ())
2201
+ if (supportsAVXForSIMD ())
2202
2202
m_assembler.vpextrq_rr (lane.m_value , src, dest);
2203
2203
else
2204
2204
m_assembler.pextrq_rr (lane.m_value , src, dest);
@@ -2320,35 +2320,99 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
2320
2320
2321
2321
void vectorAdd (SIMDInfo simdInfo, FPRegisterID left, FPRegisterID right, FPRegisterID dest)
2322
2322
{
2323
- if (scalarTypeIsFloatingPoint (simdInfo.lane ))
2324
- UNUSED_PARAM (left);
2325
- else
2326
- UNUSED_PARAM (left);
2327
- UNUSED_PARAM (left); UNUSED_PARAM (right); UNUSED_PARAM (dest);
2323
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2324
+
2325
+ switch (simdInfo.lane ) {
2326
+ case SIMDLane::f32x4:
2327
+ m_assembler.vaddps_rrr (left, right, dest);
2328
+ break ;
2329
+ case SIMDLane::f64x2:
2330
+ m_assembler.vaddpd_rrr (left, right, dest);
2331
+ break ;
2332
+ case SIMDLane::i8x16:
2333
+ m_assembler.vpaddb_rrr (left, right, dest);
2334
+ break ;
2335
+ case SIMDLane::i16x8:
2336
+ m_assembler.vpaddw_rrr (left, right, dest);
2337
+ break ;
2338
+ case SIMDLane::i32x4:
2339
+ m_assembler.vpaddd_rrr (left, right, dest);
2340
+ break ;
2341
+ case SIMDLane::i64x2:
2342
+ m_assembler.vpaddq_rrr (left, right, dest);
2343
+ break ;
2344
+ default :
2345
+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Invalid SIMD lane for vector add." );
2346
+ }
2328
2347
}
2329
2348
2330
2349
void vectorSub (SIMDInfo simdInfo, FPRegisterID left, FPRegisterID right, FPRegisterID dest)
2331
2350
{
2332
- if (scalarTypeIsFloatingPoint (simdInfo.lane ))
2333
- UNUSED_PARAM (left);
2334
- else
2335
- UNUSED_PARAM (left);
2336
- UNUSED_PARAM (left); UNUSED_PARAM (right); UNUSED_PARAM (dest);
2351
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2352
+
2353
+ switch (simdInfo.lane ) {
2354
+ case SIMDLane::f32x4:
2355
+ m_assembler.vsubps_rrr (left, right, dest);
2356
+ break ;
2357
+ case SIMDLane::f64x2:
2358
+ m_assembler.vsubpd_rrr (left, right, dest);
2359
+ break ;
2360
+ case SIMDLane::i8x16:
2361
+ m_assembler.vpsubb_rrr (left, right, dest);
2362
+ break ;
2363
+ case SIMDLane::i16x8:
2364
+ m_assembler.vpsubw_rrr (left, right, dest);
2365
+ break ;
2366
+ case SIMDLane::i32x4:
2367
+ m_assembler.vpsubd_rrr (left, right, dest);
2368
+ break ;
2369
+ case SIMDLane::i64x2:
2370
+ m_assembler.vpsubq_rrr (left, right, dest);
2371
+ break ;
2372
+ default :
2373
+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Invalid SIMD lane for vector subtract." );
2374
+ }
2337
2375
}
2338
2376
2339
2377
void vectorMul (SIMDInfo simdInfo, FPRegisterID left, FPRegisterID right, FPRegisterID dest)
2340
2378
{
2341
- if (scalarTypeIsFloatingPoint (simdInfo.lane ))
2342
- UNUSED_PARAM (left);
2343
- else
2344
- UNUSED_PARAM (left);
2345
- UNUSED_PARAM (left); UNUSED_PARAM (right); UNUSED_PARAM (dest);
2379
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2380
+
2381
+ switch (simdInfo.lane ) {
2382
+ case SIMDLane::f32x4:
2383
+ m_assembler.vmulps_rrr (left, right, dest);
2384
+ break ;
2385
+ case SIMDLane::f64x2:
2386
+ m_assembler.vmulpd_rrr (left, right, dest);
2387
+ break ;
2388
+ case SIMDLane::i16x8:
2389
+ m_assembler.vpmullw_rrr (left, right, dest);
2390
+ break ;
2391
+ case SIMDLane::i32x4:
2392
+ m_assembler.vpmulld_rrr (left, right, dest);
2393
+ break ;
2394
+ case SIMDLane::i64x2:
2395
+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" i64x2 multiply is not supported on Intel without AVX-512. This instruction should have been lowered before reaching the assembler." );
2396
+ break ;
2397
+ default :
2398
+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Invalid SIMD lane for vector multiply." );
2399
+ }
2346
2400
}
2347
2401
2348
2402
void vectorDiv (SIMDInfo simdInfo, FPRegisterID left, FPRegisterID right, FPRegisterID dest)
2349
2403
{
2404
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2350
2405
ASSERT (scalarTypeIsFloatingPoint (simdInfo.lane ));
2351
- UNUSED_PARAM (left); UNUSED_PARAM (right); UNUSED_PARAM (dest); UNUSED_PARAM (simdInfo);
2406
+ switch (simdInfo.lane ) {
2407
+ case SIMDLane::f32x4:
2408
+ m_assembler.vdivps_rrr (left, right, dest);
2409
+ break ;
2410
+ case SIMDLane::f64x2:
2411
+ m_assembler.vdivpd_rrr (left, right, dest);
2412
+ break ;
2413
+ default :
2414
+ RELEASE_ASSERT_NOT_REACHED_WITH_MESSAGE (" Invalid SIMD lane for vector divide." );
2415
+ }
2352
2416
}
2353
2417
2354
2418
void vectorMax (SIMDInfo simdInfo, FPRegisterID left, FPRegisterID right, FPRegisterID dest)
@@ -2576,37 +2640,42 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
2576
2640
}
2577
2641
}
2578
2642
2579
- void vectorNeg (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
2580
- {
2581
- if (scalarTypeIsFloatingPoint (simdInfo.lane ))
2582
- UNUSED_PARAM (dest);
2583
- else
2584
- UNUSED_PARAM (dest);
2585
- UNUSED_PARAM (input);
2586
- }
2587
-
2588
2643
void vectorPopcnt (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
2589
2644
{
2590
2645
ASSERT (simdInfo.lane == SIMDLane::i8x16);
2591
2646
UNUSED_PARAM (input); UNUSED_PARAM (dest); UNUSED_PARAM (simdInfo);
2592
2647
}
2593
2648
2649
+ using RoundingType = X86Assembler::RoundingType;
2650
+
2594
2651
void vectorCeil (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
2595
2652
{
2653
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2596
2654
ASSERT (scalarTypeIsFloatingPoint (simdInfo.lane ));
2597
- UNUSED_PARAM (input); UNUSED_PARAM (dest); UNUSED_PARAM (simdInfo);
2655
+ if (simdInfo.lane == SIMDLane::f32x4)
2656
+ m_assembler.vroundps_rr (input, dest, RoundingType::TowardInfiniti);
2657
+ else
2658
+ m_assembler.vroundpd_rr (input, dest, RoundingType::TowardInfiniti);
2598
2659
}
2599
2660
2600
2661
void vectorFloor (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
2601
2662
{
2663
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2602
2664
ASSERT (scalarTypeIsFloatingPoint (simdInfo.lane ));
2603
- UNUSED_PARAM (input); UNUSED_PARAM (dest); UNUSED_PARAM (simdInfo);
2665
+ if (simdInfo.lane == SIMDLane::f32x4)
2666
+ m_assembler.vroundps_rr (input, dest, RoundingType::TowardNegativeInfiniti);
2667
+ else
2668
+ m_assembler.vroundpd_rr (input, dest, RoundingType::TowardNegativeInfiniti);
2604
2669
}
2605
2670
2606
2671
void vectorTrunc (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
2607
2672
{
2673
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2608
2674
ASSERT (scalarTypeIsFloatingPoint (simdInfo.lane ));
2609
- UNUSED_PARAM (input); UNUSED_PARAM (dest); UNUSED_PARAM (simdInfo);
2675
+ if (simdInfo.lane == SIMDLane::f32x4)
2676
+ m_assembler.vroundps_rr (input, dest, RoundingType::TowardZero);
2677
+ else
2678
+ m_assembler.vroundpd_rr (input, dest, RoundingType::TowardZero);
2610
2679
}
2611
2680
2612
2681
void vectorTruncSat (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
@@ -2620,8 +2689,12 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
2620
2689
2621
2690
void vectorNearest (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
2622
2691
{
2692
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2623
2693
ASSERT (scalarTypeIsFloatingPoint (simdInfo.lane ));
2624
- UNUSED_PARAM (input); UNUSED_PARAM (dest); UNUSED_PARAM (simdInfo);
2694
+ if (simdInfo.lane == SIMDLane::f32x4)
2695
+ m_assembler.vroundps_rr (input, dest, RoundingType::ToNearestWithTiesToEven);
2696
+ else
2697
+ m_assembler.vroundpd_rr (input, dest, RoundingType::ToNearestWithTiesToEven);
2625
2698
}
2626
2699
2627
2700
void vectorSqrt (SIMDInfo simdInfo, FPRegisterID input, FPRegisterID dest)
@@ -2881,11 +2954,10 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
2881
2954
}
2882
2955
2883
2956
}
2884
- void vectorDotProductInt32 (FPRegisterID a, FPRegisterID b, FPRegisterID dest, FPRegisterID) { UNUSED_PARAM (a); UNUSED_PARAM (b); UNUSED_PARAM (dest); }
2885
2957
2886
2958
void vectorSwizzle (FPRegisterID a, FPRegisterID b, FPRegisterID dest)
2887
2959
{
2888
- if (supportsAVX ())
2960
+ if (supportsAVXForSIMD ())
2889
2961
m_assembler.vpshufb_rr (b, a, dest);
2890
2962
else {
2891
2963
if (a != dest)
@@ -2894,7 +2966,13 @@ class MacroAssemblerX86_64 : public MacroAssemblerX86Common {
2894
2966
}
2895
2967
}
2896
2968
2897
- void vectorShuffle (TrustedImm64 immLow, TrustedImm64 immHigh, FPRegisterID a, FPRegisterID b, FPRegisterID dest) { UNUSED_PARAM (immLow); UNUSED_PARAM (immHigh); UNUSED_PARAM (a); UNUSED_PARAM (b); UNUSED_PARAM (dest); }
2969
+ void vectorDotProductInt32 (FPRegisterID a, FPRegisterID b, FPRegisterID dest)
2970
+ {
2971
+ RELEASE_ASSERT (supportsAVXForSIMD ());
2972
+ m_assembler.vpmaddwd_rrr (a, b, dest);
2973
+ }
2974
+
2975
+ void vectorShuffle (TrustedImm64 immLow, TrustedImm64 immHigh, FPRegisterID a, FPRegisterID b, FPRegisterID dest) { (void ) immLow; (void ) immHigh; (void ) a; (void ) b; (void ) dest; }
2898
2976
2899
2977
// Misc helper functions.
2900
2978
0 commit comments