@@ -1856,33 +1856,33 @@ ValueNum ValueNumStore::VNForByrefCon(target_size_t cnsVal)
1856
1856
}
1857
1857
1858
1858
#if defined(FEATURE_SIMD)
1859
- ValueNum ValueNumStore::VNForSimd8Con (simd8_t cnsVal)
1859
+ ValueNum ValueNumStore::VNForSimd8Con (const simd8_t & cnsVal)
1860
1860
{
1861
1861
return VnForConst (cnsVal, GetSimd8CnsMap (), TYP_SIMD8);
1862
1862
}
1863
1863
1864
- ValueNum ValueNumStore::VNForSimd12Con (simd12_t cnsVal)
1864
+ ValueNum ValueNumStore::VNForSimd12Con (const simd12_t & cnsVal)
1865
1865
{
1866
1866
return VnForConst (cnsVal, GetSimd12CnsMap (), TYP_SIMD12);
1867
1867
}
1868
1868
1869
- ValueNum ValueNumStore::VNForSimd16Con (simd16_t cnsVal)
1869
+ ValueNum ValueNumStore::VNForSimd16Con (const simd16_t & cnsVal)
1870
1870
{
1871
1871
return VnForConst (cnsVal, GetSimd16CnsMap (), TYP_SIMD16);
1872
1872
}
1873
1873
1874
1874
#if defined(TARGET_XARCH)
1875
- ValueNum ValueNumStore::VNForSimd32Con (simd32_t cnsVal)
1875
+ ValueNum ValueNumStore::VNForSimd32Con (const simd32_t & cnsVal)
1876
1876
{
1877
1877
return VnForConst (cnsVal, GetSimd32CnsMap (), TYP_SIMD32);
1878
1878
}
1879
1879
1880
- ValueNum ValueNumStore::VNForSimd64Con (simd64_t cnsVal)
1880
+ ValueNum ValueNumStore::VNForSimd64Con (const simd64_t & cnsVal)
1881
1881
{
1882
1882
return VnForConst (cnsVal, GetSimd64CnsMap (), TYP_SIMD64);
1883
1883
}
1884
1884
1885
- ValueNum ValueNumStore::VNForSimdMaskCon (simdmask_t cnsVal)
1885
+ ValueNum ValueNumStore::VNForSimdMaskCon (const simdmask_t & cnsVal)
1886
1886
{
1887
1887
return VnForConst (cnsVal, GetSimdMaskCnsMap (), TYP_MASK);
1888
1888
}
@@ -2217,70 +2217,59 @@ ValueNum ValueNumStore::VNAllBitsForType(var_types typ)
2217
2217
}
2218
2218
2219
2219
#ifdef FEATURE_SIMD
2220
- ValueNum ValueNumStore::VNOneForSimdType (var_types simdType, var_types simdBaseType)
2220
+ template <typename TSimd>
2221
+ TSimd BroadcastConstantToSimd (ValueNumStore* vns, var_types baseType, ValueNum argVN)
2221
2222
{
2222
- assert (varTypeIsSIMD (simdType));
2223
+ assert (vns->IsVNConstant (argVN));
2224
+ assert (!varTypeIsSIMD (vns->TypeOfVN (argVN)));
2223
2225
2224
- simd_t simdVal = {};
2225
- int simdSize = genTypeSize (simdType);
2226
+ TSimd result = {};
2226
2227
2227
- switch (simdBaseType )
2228
+ switch (baseType )
2228
2229
{
2229
- case TYP_BYTE:
2230
- case TYP_UBYTE:
2230
+ case TYP_FLOAT:
2231
2231
{
2232
- for (int i = 0 ; i < simdSize; i++)
2233
- {
2234
- simdVal.u8 [i] = 1 ;
2235
- }
2232
+ float arg = vns->GetConstantSingle (argVN);
2233
+ BroadcastConstantToSimd<TSimd, float >(&result, arg);
2236
2234
break ;
2237
2235
}
2238
2236
2239
- case TYP_SHORT:
2240
- case TYP_USHORT:
2237
+ case TYP_DOUBLE:
2241
2238
{
2242
- for (int i = 0 ; i < (simdSize / 2 ); i++)
2243
- {
2244
- simdVal.u16 [i] = 1 ;
2245
- }
2239
+ double arg = vns->GetConstantDouble (argVN);
2240
+ BroadcastConstantToSimd<TSimd, double >(&result, arg);
2246
2241
break ;
2247
2242
}
2248
2243
2249
- case TYP_INT :
2250
- case TYP_UINT :
2244
+ case TYP_BYTE :
2245
+ case TYP_UBYTE :
2251
2246
{
2252
- for (int i = 0 ; i < (simdSize / 4 ); i++)
2253
- {
2254
- simdVal.u32 [i] = 1 ;
2255
- }
2247
+ uint8_t arg = static_cast <uint8_t >(vns->GetConstantInt32 (argVN));
2248
+ BroadcastConstantToSimd<TSimd, uint8_t >(&result, arg);
2256
2249
break ;
2257
2250
}
2258
2251
2259
- case TYP_LONG :
2260
- case TYP_ULONG :
2252
+ case TYP_SHORT :
2253
+ case TYP_USHORT :
2261
2254
{
2262
- for (int i = 0 ; i < (simdSize / 8 ); i++)
2263
- {
2264
- simdVal.u64 [i] = 1 ;
2265
- }
2255
+ uint16_t arg = static_cast <uint16_t >(vns->GetConstantInt32 (argVN));
2256
+ BroadcastConstantToSimd<TSimd, uint16_t >(&result, arg);
2266
2257
break ;
2267
2258
}
2268
2259
2269
- case TYP_FLOAT:
2260
+ case TYP_INT:
2261
+ case TYP_UINT:
2270
2262
{
2271
- for (int i = 0 ; i < (simdSize / 4 ); i++)
2272
- {
2273
- simdVal.f32 [i] = 1 .0f ;
2274
- }
2263
+ uint32_t arg = static_cast <uint32_t >(vns->GetConstantInt32 (argVN));
2264
+ BroadcastConstantToSimd<TSimd, uint32_t >(&result, arg);
2275
2265
break ;
2276
2266
}
2277
2267
2278
- case TYP_DOUBLE:
2268
+ case TYP_LONG:
2269
+ case TYP_ULONG:
2279
2270
{
2280
- for (int i = 0 ; i < (simdSize / 8 ); i++)
2281
- {
2282
- simdVal.f64 [i] = 1.0 ;
2283
- }
2271
+ uint64_t arg = static_cast <uint64_t >(vns->GetConstantInt64 (argVN));
2272
+ BroadcastConstantToSimd<TSimd, uint64_t >(&result, arg);
2284
2273
break ;
2285
2274
}
2286
2275
@@ -2290,42 +2279,46 @@ ValueNum ValueNumStore::VNOneForSimdType(var_types simdType, var_types simdBaseT
2290
2279
}
2291
2280
}
2292
2281
2282
+ return result;
2283
+ }
2284
+
2285
+ ValueNum ValueNumStore::VNOneForSimdType (var_types simdType, var_types simdBaseType)
2286
+ {
2287
+ assert (varTypeIsSIMD (simdType));
2288
+
2289
+ ValueNum oneVN = VNOneForType (simdBaseType);
2290
+
2293
2291
switch (simdType)
2294
2292
{
2295
2293
case TYP_SIMD8:
2296
2294
{
2297
- simd8_t simd8Val;
2298
- memcpy (&simd8Val, &simdVal, sizeof (simd8_t ));
2299
- return VNForSimd8Con (simd8Val);
2295
+ simd8_t result = BroadcastConstantToSimd<simd8_t >(this , simdBaseType, oneVN);
2296
+ return VNForSimd8Con (result);
2300
2297
}
2301
2298
2302
2299
case TYP_SIMD12:
2303
2300
{
2304
- simd12_t simd12Val;
2305
- memcpy (&simd12Val, &simdVal, sizeof (simd12_t ));
2306
- return VNForSimd12Con (simd12Val);
2301
+ simd12_t result = BroadcastConstantToSimd<simd12_t >(this , simdBaseType, oneVN);
2302
+ return VNForSimd12Con (result);
2307
2303
}
2308
2304
2309
2305
case TYP_SIMD16:
2310
2306
{
2311
- simd16_t simd16Val;
2312
- memcpy (&simd16Val, &simdVal, sizeof (simd16_t ));
2313
- return VNForSimd16Con (simd16Val);
2307
+ simd16_t result = BroadcastConstantToSimd<simd16_t >(this , simdBaseType, oneVN);
2308
+ return VNForSimd16Con (result);
2314
2309
}
2315
2310
2316
2311
#if defined(TARGET_XARCH)
2317
2312
case TYP_SIMD32:
2318
2313
{
2319
- simd32_t simd32Val;
2320
- memcpy (&simd32Val, &simdVal, sizeof (simd32_t ));
2321
- return VNForSimd32Con (simd32Val);
2314
+ simd32_t result = BroadcastConstantToSimd<simd32_t >(this , simdBaseType, oneVN);
2315
+ return VNForSimd32Con (result);
2322
2316
}
2323
2317
2324
2318
case TYP_SIMD64:
2325
2319
{
2326
- simd64_t simd64Val;
2327
- memcpy (&simd64Val, &simdVal, sizeof (simd64_t ));
2328
- return VNForSimd64Con (simd64Val);
2320
+ simd64_t result = BroadcastConstantToSimd<simd64_t >(this , simdBaseType, oneVN);
2321
+ return VNForSimd64Con (result);
2329
2322
}
2330
2323
2331
2324
case TYP_MASK:
@@ -6870,71 +6863,6 @@ void ValueNumStore::SetVNIsCheckedBound(ValueNum vn)
6870
6863
}
6871
6864
6872
6865
#ifdef FEATURE_HW_INTRINSICS
6873
- template <typename TSimd>
6874
- TSimd BroadcastConstantToSimd (ValueNumStore* vns, var_types baseType, ValueNum argVN)
6875
- {
6876
- assert (vns->IsVNConstant (argVN));
6877
- assert (!varTypeIsSIMD (vns->TypeOfVN (argVN)));
6878
-
6879
- TSimd result = {};
6880
-
6881
- switch (baseType)
6882
- {
6883
- case TYP_FLOAT:
6884
- {
6885
- float arg = vns->GetConstantSingle (argVN);
6886
- BroadcastConstantToSimd<TSimd, float >(&result, arg);
6887
- break ;
6888
- }
6889
-
6890
- case TYP_DOUBLE:
6891
- {
6892
- double arg = vns->GetConstantDouble (argVN);
6893
- BroadcastConstantToSimd<TSimd, double >(&result, arg);
6894
- break ;
6895
- }
6896
-
6897
- case TYP_BYTE:
6898
- case TYP_UBYTE:
6899
- {
6900
- uint8_t arg = static_cast <uint8_t >(vns->GetConstantInt32 (argVN));
6901
- BroadcastConstantToSimd<TSimd, uint8_t >(&result, arg);
6902
- break ;
6903
- }
6904
-
6905
- case TYP_SHORT:
6906
- case TYP_USHORT:
6907
- {
6908
- uint16_t arg = static_cast <uint16_t >(vns->GetConstantInt32 (argVN));
6909
- BroadcastConstantToSimd<TSimd, uint16_t >(&result, arg);
6910
- break ;
6911
- }
6912
-
6913
- case TYP_INT:
6914
- case TYP_UINT:
6915
- {
6916
- uint32_t arg = static_cast <uint32_t >(vns->GetConstantInt32 (argVN));
6917
- BroadcastConstantToSimd<TSimd, uint32_t >(&result, arg);
6918
- break ;
6919
- }
6920
-
6921
- case TYP_LONG:
6922
- case TYP_ULONG:
6923
- {
6924
- uint64_t arg = static_cast <uint64_t >(vns->GetConstantInt64 (argVN));
6925
- BroadcastConstantToSimd<TSimd, uint64_t >(&result, arg);
6926
- break ;
6927
- }
6928
-
6929
- default :
6930
- {
6931
- unreached ();
6932
- }
6933
- }
6934
-
6935
- return result;
6936
- }
6937
-
6938
6866
simd8_t GetConstantSimd8 (ValueNumStore* vns, var_types baseType, ValueNum argVN)
6939
6867
{
6940
6868
assert (vns->IsVNConstant (argVN));
@@ -7126,7 +7054,7 @@ ValueNum EvaluateBinarySimd(ValueNumStore* vns,
7126
7054
}
7127
7055
7128
7056
template <typename TSimd>
7129
- ValueNum EvaluateSimdGetElement (ValueNumStore* vns, var_types baseType, TSimd arg0, int32_t arg1)
7057
+ ValueNum EvaluateSimdGetElement (ValueNumStore* vns, var_types baseType, const TSimd& arg0, int32_t arg1)
7130
7058
{
7131
7059
switch (baseType)
7132
7060
{
@@ -7617,7 +7545,8 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunBinary(GenTreeHWIntrinsic* tree,
7617
7545
if (TypeOfVN (arg1VN) == TYP_SIMD16)
7618
7546
{
7619
7547
if ((ni != NI_AVX2_ShiftLeftLogicalVariable) && (ni != NI_AVX2_ShiftRightArithmeticVariable) &&
7620
- (ni != NI_AVX512F_VL_ShiftRightArithmeticVariable) && (ni != NI_AVX2_ShiftRightLogicalVariable))
7548
+ (ni != NI_AVX512F_VL_ShiftRightArithmeticVariable) &&
7549
+ (ni != NI_AVX10v1_ShiftRightArithmeticVariable) && (ni != NI_AVX2_ShiftRightLogicalVariable))
7621
7550
{
7622
7551
// The xarch shift instructions support taking the shift amount as
7623
7552
// a simd16, in which case they take the shift amount from the lower
0 commit comments