Skip to content

Commit 0654416

Browse files
Add VMOVD VMOVW APIs in JIT (#115068)
Co-authored-by: Bruce Forstall <[email protected]>
1 parent 9e490ef commit 0654416

File tree

6 files changed

+76
-41
lines changed

6 files changed

+76
-41
lines changed

src/coreclr/jit/hwintrinsiclistxarch.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,9 +1466,11 @@ HARDWARE_INTRINSIC(AVX10v2, ConvertToVectorUInt64WithTruncationSaturatio
14661466
HARDWARE_INTRINSIC(AVX10v2, Divide, 32, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_divps, INS_divpd}, HW_Category_SimpleSIMD, HW_Flag_EmbBroadcastCompatible|HW_Flag_EmbMaskingCompatible|HW_Flag_EmbRoundingCompatible)
14671467
HARDWARE_INTRINSIC(AVX10v2, MinMax, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vminmaxps, INS_vminmaxpd}, HW_Category_IMM, HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbBroadcastCompatible|HW_Flag_EmbMaskingCompatible)
14681468
HARDWARE_INTRINSIC(AVX10v2, MinMaxScalar, -1, 3, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vminmaxss, INS_vminmaxsd}, HW_Category_IMM, HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbBroadcastCompatible|HW_Flag_EmbMaskingCompatible)
1469+
HARDWARE_INTRINSIC(AVX10v2, MoveScalar, 16, -1, {INS_invalid, INS_invalid, INS_vmovw, INS_vmovw, INS_vmovd, INS_vmovd, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMDScalar, HW_Flag_NoContainment)
14691470
HARDWARE_INTRINSIC(AVX10v2, Multiply, 32, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_mulps, INS_mulpd}, HW_Category_SimpleSIMD, HW_Flag_Commutative |HW_Flag_EmbBroadcastCompatible|HW_Flag_EmbMaskingCompatible|HW_Flag_EmbRoundingCompatible)
14701471
HARDWARE_INTRINSIC(AVX10v2, Scale, 32, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vscalefps, INS_vscalefpd}, HW_Category_SimpleSIMD, HW_Flag_EmbBroadcastCompatible|HW_Flag_EmbMaskingCompatible|HW_Flag_EmbRoundingCompatible)
14711472
HARDWARE_INTRINSIC(AVX10v2, Sqrt, 32, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sqrtps, INS_sqrtpd}, HW_Category_SimpleSIMD, HW_Flag_EmbBroadcastCompatible|HW_Flag_EmbMaskingCompatible|HW_Flag_EmbRoundingCompatible)
1473+
HARDWARE_INTRINSIC(AVX10v2, StoreScalar, 16, 2, {INS_invalid, INS_invalid, INS_vmovw, INS_vmovw, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_MemoryStore, HW_Flag_NoRMWSemantics|HW_Flag_BaseTypeFromSecondArg)
14721474
HARDWARE_INTRINSIC(AVX10v2, Subtract, 32, -1, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_subps, INS_subpd}, HW_Category_SimpleSIMD, HW_Flag_EmbBroadcastCompatible|HW_Flag_EmbMaskingCompatible|HW_Flag_EmbRoundingCompatible)
14731475
#define LAST_NI_AVX10v2 NI_AVX10v2_Subtract
14741476

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx10v2.PlatformNotSupported.cs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,6 @@ internal Avx10v2() { }
119119
/// </summary>
120120
public static Vector256<int> ConvertToByteWithTruncatedSaturationAndZeroExtendToInt32(Vector256<float> value) { throw new PlatformNotSupportedException(); }
121121

122-
/// <summary>
123-
/// <para> VMOVD xmm1, xmm2/m32</para>
124-
/// </summary>
125-
public static Vector128<uint> ConvertToVector128UInt32(Vector128<uint> value) { throw new PlatformNotSupportedException(); }
126-
127-
/// <summary>
128-
/// <para> VMOVW xmm1, xmm2/m16</para>
129-
/// </summary>
130-
public static Vector128<ushort> ConvertToVector128UInt16(Vector128<ushort> value) { throw new PlatformNotSupportedException(); }
131-
132122
/// <summary>
133123
/// <para> VCVTDQ2PS ymm1{k1}{z}, ymm2/m256/m32bcst {er}</para>
134124
/// </summary>
@@ -204,6 +194,26 @@ internal Avx10v2() { }
204194
/// </summary>
205195
public static Vector256<double> ConvertToVector256Double(Vector256<long> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
206196

197+
/// <summary>
198+
/// <para> VMOVD xmm1, xmm2/m32</para>
199+
/// </summary>
200+
public static Vector128<int> MoveScalar(Vector128<int> value) { throw new PlatformNotSupportedException(); }
201+
202+
/// <summary>
203+
/// <para> VMOVD xmm1, xmm2/m32</para>
204+
/// </summary>
205+
public static Vector128<uint> MoveScalar(Vector128<uint> value) { throw new PlatformNotSupportedException(); }
206+
207+
/// <summary>
208+
/// <para> VMOVW xmm1, xmm2/m16</para>
209+
/// </summary>
210+
public static Vector128<short> MoveScalar(Vector128<short> value) { throw new PlatformNotSupportedException(); }
211+
212+
/// <summary>
213+
/// <para> VMOVW xmm1, xmm2/m16</para>
214+
/// </summary>
215+
public static Vector128<ushort> MoveScalar(Vector128<ushort> value) { throw new PlatformNotSupportedException(); }
216+
207217
/// <summary>
208218
/// <para> VMULPD ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst {er}</para>
209219
/// </summary>
@@ -234,6 +244,16 @@ internal Avx10v2() { }
234244
/// </summary>
235245
public static Vector256<float> Sqrt(Vector256<float> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
236246

247+
/// <summary>
248+
/// <para> VMOVW xmm1/m16, xmm2</para>
249+
/// </summary>
250+
public static unsafe void StoreScalar(short* address, Vector128<short> source) { throw new PlatformNotSupportedException(); }
251+
252+
/// <summary>
253+
/// <para> VMOVW xmm1/m16, xmm2</para>
254+
/// </summary>
255+
public static unsafe void StoreScalar(ushort* address, Vector128<ushort> source) { throw new PlatformNotSupportedException(); }
256+
237257
/// <summary>
238258
/// <para> VSUBPD ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst {er}</para>
239259
/// </summary>

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx10v2.cs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -98,16 +98,6 @@ internal Avx10v2() { }
9898
/// </summary>
9999
public static Vector256<int> ConvertToByteWithTruncatedSaturationAndZeroExtendToInt32(Vector256<float> value) => ConvertToByteWithTruncatedSaturationAndZeroExtendToInt32(value);
100100

101-
/// <summary>
102-
/// <para> VMOVD xmm1, xmm2/m32</para>
103-
/// </summary>
104-
public static Vector128<uint> ConvertToVector128UInt32(Vector128<uint> value) => ConvertToVector128UInt32(value);
105-
106-
/// <summary>
107-
/// <para> VMOVW xmm1, xmm2/m16</para>
108-
/// </summary>
109-
public static Vector128<ushort> ConvertToVector128UInt16(Vector128<ushort> value) => ConvertToVector128UInt16(value);
110-
111101
/// <summary>
112102
/// <para> VADDPD ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst {er}</para>
113103
/// </summary>
@@ -203,6 +193,26 @@ internal Avx10v2() { }
203193
/// </summary>
204194
public static Vector256<double> ConvertToVector256Double(Vector256<long> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector256Double(value, mode);
205195

196+
/// <summary>
197+
/// <para> VMOVD xmm1, xmm2/m32</para>
198+
/// </summary>
199+
public static Vector128<int> MoveScalar(Vector128<int> value) => MoveScalar(value);
200+
201+
/// <summary>
202+
/// <para> VMOVD xmm1, xmm2/m32</para>
203+
/// </summary>
204+
public static Vector128<uint> MoveScalar(Vector128<uint> value) => MoveScalar(value);
205+
206+
/// <summary>
207+
/// <para> VMOVW xmm1, xmm2/m16</para>
208+
/// </summary>
209+
public static Vector128<short> MoveScalar(Vector128<short> value) => MoveScalar(value);
210+
211+
/// <summary>
212+
/// <para> VMOVW xmm1, xmm2/m16</para>
213+
/// </summary>
214+
public static Vector128<ushort> MoveScalar(Vector128<ushort> value) => MoveScalar(value);
215+
206216
/// <summary>
207217
/// <para> VMULPD ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst {er}</para>
208218
/// </summary>
@@ -233,6 +243,16 @@ internal Avx10v2() { }
233243
/// </summary>
234244
public static Vector256<float> Sqrt(Vector256<float> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => Sqrt(value, mode);
235245

246+
/// <summary>
247+
/// <para> VMOVW xmm1/m16, xmm2</para>
248+
/// </summary>
249+
public static unsafe void StoreScalar(short* address, Vector128<short> source) => StoreScalar(address, source);
250+
251+
/// <summary>
252+
/// <para> VMOVW xmm1/m16, xmm2</para>
253+
/// </summary>
254+
public static unsafe void StoreScalar(ushort* address, Vector128<ushort> source) => StoreScalar(address, source);
255+
236256
/// <summary>
237257
/// <para> VSUBPD ymm1{k1}{z}, ymm2, ymm3/m256/m64bcst {er}</para>
238258
/// </summary>

src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7251,8 +7251,6 @@ internal Avx10v2() { }
72517251
public static System.Runtime.Intrinsics.Vector256<int> ConvertToSByteWithTruncatedSaturationAndZeroExtendToInt32(System.Runtime.Intrinsics.Vector256<float> value) { throw null; }
72527252
public static System.Runtime.Intrinsics.Vector128<int> ConvertToByteWithTruncatedSaturationAndZeroExtendToInt32(System.Runtime.Intrinsics.Vector128<float> value) { throw null; }
72537253
public static System.Runtime.Intrinsics.Vector256<int> ConvertToByteWithTruncatedSaturationAndZeroExtendToInt32(System.Runtime.Intrinsics.Vector256<float> value) { throw null; }
7254-
public static System.Runtime.Intrinsics.Vector128<uint> ConvertToVector128UInt32(System.Runtime.Intrinsics.Vector128<uint> value) { throw null; }
7255-
public static System.Runtime.Intrinsics.Vector128<ushort> ConvertToVector128UInt16(System.Runtime.Intrinsics.Vector128<ushort> value) { throw null; }
72567254
public static System.Runtime.Intrinsics.Vector256<float> ConvertToVector256Single(System.Runtime.Intrinsics.Vector256<int> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72577255
public static System.Runtime.Intrinsics.Vector128<int> ConvertToVector128Int32(System.Runtime.Intrinsics.Vector256<double> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72587256
public static System.Runtime.Intrinsics.Vector128<float> ConvertToVector128Single(System.Runtime.Intrinsics.Vector256<double> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
@@ -7268,12 +7266,18 @@ internal Avx10v2() { }
72687266
public static System.Runtime.Intrinsics.Vector256<float> ConvertToVector256Single(System.Runtime.Intrinsics.Vector256<uint> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72697267
public static System.Runtime.Intrinsics.Vector128<float> ConvertToVector128Single(System.Runtime.Intrinsics.Vector256<long> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72707268
public static System.Runtime.Intrinsics.Vector256<double> ConvertToVector256Double(System.Runtime.Intrinsics.Vector256<long> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
7269+
public static System.Runtime.Intrinsics.Vector128<int> MoveScalar(System.Runtime.Intrinsics.Vector128<int> value) { throw null; }
7270+
public static System.Runtime.Intrinsics.Vector128<uint> MoveScalar(System.Runtime.Intrinsics.Vector128<uint> value) { throw null; }
7271+
public static System.Runtime.Intrinsics.Vector128<short> MoveScalar(System.Runtime.Intrinsics.Vector128<short> value) { throw null; }
7272+
public static System.Runtime.Intrinsics.Vector128<ushort> MoveScalar(System.Runtime.Intrinsics.Vector128<ushort> value) { throw null; }
72717273
public static System.Runtime.Intrinsics.Vector256<double> Multiply(System.Runtime.Intrinsics.Vector256<double> left, System.Runtime.Intrinsics.Vector256<double> right, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72727274
public static System.Runtime.Intrinsics.Vector256<float> Multiply(System.Runtime.Intrinsics.Vector256<float> left, System.Runtime.Intrinsics.Vector256<float> right, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72737275
public static System.Runtime.Intrinsics.Vector256<double> Scale(System.Runtime.Intrinsics.Vector256<double> left, System.Runtime.Intrinsics.Vector256<double> right, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72747276
public static System.Runtime.Intrinsics.Vector256<float> Scale(System.Runtime.Intrinsics.Vector256<float> left, System.Runtime.Intrinsics.Vector256<float> right, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72757277
public static System.Runtime.Intrinsics.Vector256<double> Sqrt(System.Runtime.Intrinsics.Vector256<double> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72767278
public static System.Runtime.Intrinsics.Vector256<float> Sqrt(System.Runtime.Intrinsics.Vector256<float> value, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
7279+
public static unsafe void StoreScalar(short* address, System.Runtime.Intrinsics.Vector128<short> source) { throw null; }
7280+
public static unsafe void StoreScalar(ushort* address, System.Runtime.Intrinsics.Vector128<ushort> source) { throw null; }
72777281
public static System.Runtime.Intrinsics.Vector256<double> Subtract(System.Runtime.Intrinsics.Vector256<double> left, System.Runtime.Intrinsics.Vector256<double> right, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72787282
public static System.Runtime.Intrinsics.Vector256<float> Subtract(System.Runtime.Intrinsics.Vector256<float> left, System.Runtime.Intrinsics.Vector256<float> right, [System.Diagnostics.CodeAnalysis.ConstantExpected(Max = System.Runtime.Intrinsics.X86.FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw null; }
72797283

0 commit comments

Comments
 (0)