Skip to content

Commit 2602fe5

Browse files
committed
Get the copilot generated tests to compile
1 parent c183ac6 commit 2602fe5

File tree

1 file changed

+125
-82
lines changed

1 file changed

+125
-82
lines changed

src/libraries/System.Runtime.Intrinsics/tests/Wasm/PackedSimdTests.cs

+125-82
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
using System.Tests;
99
using Xunit;
1010

11-
namespace System.Runtime.Intrinsics.Tests.PackedSimd
11+
namespace System.Runtime.Intrinsics.Wasm.Tests
1212
{
1313
[PlatformSpecific(TestPlatforms.Browser)]
1414
public sealed class PackedSimdTests
@@ -167,15 +167,14 @@ public unsafe void LoadScalarAndSplatTest()
167167
int value = 42;
168168
float fValue = 3.14f;
169169

170-
fixed (int* intPtr = &value)
171-
fixed (float* floatPtr = &fValue)
172-
{
173-
var intSplat = PackedSimd.LoadScalarAndSplatVector128(intPtr);
174-
var floatSplat = PackedSimd.LoadScalarAndSplatVector128(floatPtr);
170+
int* intPtr = &value;
171+
float* floatPtr = &fValue;
175172

176-
Assert.Equal(Vector128.Create(42, 42, 42, 42), intSplat);
177-
Assert.Equal(Vector128.Create(3.14f, 3.14f, 3.14f, 3.14f), floatSplat);
178-
}
173+
var intSplat = PackedSimd.LoadScalarAndSplatVector128(intPtr);
174+
var floatSplat = PackedSimd.LoadScalarAndSplatVector128(floatPtr);
175+
176+
Assert.Equal(Vector128.Create(42, 42, 42, 42), intSplat);
177+
Assert.Equal(Vector128.Create(3.14f, 3.14f, 3.14f, 3.14f), floatSplat);
179178
}
180179

181180
[Fact]
@@ -195,25 +194,21 @@ public unsafe void StoreSelectedScalarTest()
195194
{
196195
var v = Vector128.Create(1, 2, 3, 4);
197196
int value = 0;
197+
int* ptr = &value;
198198

199-
fixed (int* ptr = &value)
200-
{
201-
PackedSimd.StoreSelectedScalar(ptr, v, 2);
202-
Assert.Equal(3, value);
203-
}
199+
PackedSimd.StoreSelectedScalar(ptr, v, 2);
200+
Assert.Equal(3, value);
204201
}
205202

206203
[Fact]
207204
public unsafe void LoadScalarAndInsertTest()
208205
{
209206
var v = Vector128.Create(1, 2, 3, 4);
210207
int newValue = 42;
208+
int* ptr = &newValue;
211209

212-
fixed (int* ptr = &newValue)
213-
{
214-
var result = PackedSimd.LoadScalarAndInsert(ptr, v, 2);
215-
Assert.Equal(Vector128.Create(1, 2, 42, 4), result);
216-
}
210+
var result = PackedSimd.LoadScalarAndInsert(ptr, v, 2);
211+
Assert.Equal(Vector128.Create(1, 2, 42, 4), result);
217212
}
218213

219214
[Fact]
@@ -259,18 +254,6 @@ public unsafe void MultiplyWideningTest()
259254
Assert.Equal(Vector128.Create(100, 120, 140, 160), upperResult);
260255
}
261256

262-
[Fact]
263-
public unsafe void ConvertNarrowingTest()
264-
{
265-
var lower = Vector128.Create(1, 2, 3, 4);
266-
var upper = Vector128.Create(5, 6, 7, 8);
267-
268-
var narrowed = PackedSimd.ConvertNarrowingSaturate(lower, upper);
269-
270-
Assert.Equal(Vector128.Create((short)1, (short)2, (short)3, (short)4,
271-
(short)5, (short)6, (short)7, (short)8), narrowed);
272-
}
273-
274257
[Fact]
275258
public unsafe void DotProductTest()
276259
{
@@ -393,16 +376,47 @@ public unsafe void MultiplyRoundedSaturateQ15Test()
393376
{
394377
// Q15 format represents values in [-1, 1) using 16-bit integers
395378
// Maximum positive value is 0x7FFF (32767) representing approximately 0.99997
396-
// Test with values that should saturate when multiplied
397-
var shorts1 = Vector128.Create((short)32767, (short)-32768, (short)32700, (short)-32700);
398-
var shorts2 = Vector128.Create((short)100, (short)-100, (short)100, (short)-100);
399-
400-
var addSat = PackedSimd.AddSaturate(shorts1, shorts2);
401-
var subSat = PackedSimd.SubtractSaturate(shorts1, shorts2);
402-
403-
// Verify saturation at max/min values
404-
Assert.Equal(Vector128.Create((short)32767, (short)-32768, (short)32767, (short)-32768), addSat);
405-
Assert.Equal(Vector128.Create((short)32767, (short)-32768, (short)32767, (short)-32768), subSat);
379+
// Minimum negative value is 0x8000 (-32768) representing -1.0
380+
var v1 = Vector128.Create(
381+
(short)32767, // ~1.0 (max positive)
382+
(short)-32768, // -1.0 (min negative)
383+
(short)16384, // 0.5
384+
(short)-16384, // -0.5
385+
(short)8192, // 0.25
386+
(short)-8192, // -0.25
387+
(short)0, // 0
388+
(short)16384 // 0.5
389+
);
390+
var v2 = Vector128.Create(
391+
(short)32767, // ~1.0 (max positive)
392+
(short)-32768, // -1.0 (min negative)
393+
(short)16384, // 0.5
394+
(short)16384, // 0.5
395+
(short)-16384, // -0.5
396+
(short)16384, // 0.5
397+
(short)32767, // ~1.0
398+
(short)-32768 // -1.0
399+
);
400+
401+
var result = PackedSimd.MultiplyRoundedSaturateQ15(v1, v2);
402+
403+
// Verify results:
404+
// 1.0 * 1.0 ≈ 1.0 (saturates to max positive)
405+
Assert.Equal((short)32767, result.GetElement(0));
406+
// -1.0 * -1.0 = 1.0 (saturates to max positive)
407+
Assert.Equal((short)32767, result.GetElement(1));
408+
// 0.5 * 0.5 = 0.25 (rounded)
409+
Assert.Equal((short)8192, result.GetElement(2));
410+
// -0.5 * 0.5 = -0.25 (rounded)
411+
Assert.Equal((short)-8192, result.GetElement(3));
412+
// 0.25 * -0.5 = -0.125 (rounded)
413+
Assert.Equal((short)-4096, result.GetElement(4));
414+
// -0.25 * 0.5 = -0.125 (rounded)
415+
Assert.Equal((short)-4096, result.GetElement(5));
416+
// 0 * 1.0 = 0
417+
Assert.Equal((short)0, result.GetElement(6));
418+
// 0.5 * -1.0 = -0.5
419+
Assert.Equal((short)-16384, result.GetElement(7));
406420
}
407421

408422
[Fact]
@@ -432,21 +446,20 @@ public unsafe void LoadScalarAndSplatInfinityTest()
432446
float fInf = float.PositiveInfinity;
433447
double dInf = double.PositiveInfinity;
434448

435-
fixed (float* fPtr = &fInf)
436-
fixed (double* dPtr = &dInf)
437-
{
438-
var floatSplat = PackedSimd.LoadScalarAndSplatVector128(fPtr);
439-
var doubleSplat = PackedSimd.LoadScalarAndSplatVector128(dPtr);
449+
float* fPtr = &fInf;
450+
double* dPtr = &dInf;
440451

441-
for (int i = 0; i < 4; i++)
442-
{
443-
Assert.True(float.IsPositiveInfinity(floatSplat.GetElement(i)));
444-
}
452+
var floatSplat = PackedSimd.LoadScalarAndSplatVector128(fPtr);
453+
var doubleSplat = PackedSimd.LoadScalarAndSplatVector128(dPtr);
445454

446-
for (int i = 0; i < 2; i++)
447-
{
448-
Assert.True(double.IsPositiveInfinity(doubleSplat.GetElement(i)));
449-
}
455+
for (int i = 0; i < 4; i++)
456+
{
457+
Assert.True(float.IsPositiveInfinity(floatSplat.GetElement(i)));
458+
}
459+
460+
for (int i = 0; i < 2; i++)
461+
{
462+
Assert.True(double.IsPositiveInfinity(doubleSplat.GetElement(i)));
450463
}
451464
}
452465

@@ -482,45 +495,75 @@ public unsafe void ComparisonWithNaNTest()
482495
[Fact]
483496
public unsafe void SignedSaturatedArithmeticTest()
484497
{
485-
var shorts1 = Vector128.Create((short)32767, (short)-32768, (short)32700, (short)-32700);
486-
var shorts2 = Vector128.Create((short)100, (short)-100, (short)100, (short)-100);
487-
488-
var addSat = PackedSimd.AddSaturate(shorts1, shorts2);
489-
var subSat = PackedSimd.SubtractSaturate(shorts1, shorts2);
490-
491-
// Verify saturation at max/min values
492-
Assert.Equal(Vector128.Create((short)32767, (short)-32768, (short)32767, (short)-32768), addSat);
493-
Assert.Equal(Vector128.Create((short)32767, (short)-32768, (short)32767, (short)-32768), subSat);
498+
// Test saturation for various edge cases in signed 16-bit arithmetic
499+
var v1 = Vector128.Create(
500+
(short)32767, (short)-32768, (short)30000, (short)-30000,
501+
(short)20000, (short)-20000, (short)10000, (short)-10000);
502+
var v2 = Vector128.Create(
503+
(short)10, (short)-10, (short)5000, (short)-5000,
504+
(short)20000, (short)-20000, (short)5000, (short)-5000);
505+
506+
var addResult = PackedSimd.AddSaturate(v1, v2);
507+
var subResult = PackedSimd.SubtractSaturate(v1, v2);
508+
509+
// Adding to max positive should saturate at max
510+
Assert.Equal((short)32767, addResult.GetElement(0));
511+
// Adding to min negative should saturate at min
512+
Assert.Equal((short)-32768, addResult.GetElement(1));
513+
// Large positive additions should saturate
514+
Assert.Equal((short)32767, addResult.GetElement(2));
515+
// Large negative additions should saturate
516+
Assert.Equal((short)-32768, addResult.GetElement(3));
517+
// More saturation cases with higher values
518+
Assert.Equal((short)32767, addResult.GetElement(4));
519+
Assert.Equal((short)-32768, addResult.GetElement(5));
520+
// Regular addition within range
521+
Assert.Equal((short)15000, addResult.GetElement(6));
522+
Assert.Equal((short)-15000, addResult.GetElement(7));
523+
524+
// Subtracting negative from max positive should saturate at max
525+
Assert.Equal((short)32767, subResult.GetElement(0));
526+
// Subtracting positive from min negative should saturate at min
527+
Assert.Equal((short)-32768, subResult.GetElement(1));
528+
// Regular subtraction within range shouldn't saturate
529+
Assert.Equal((short)25000, subResult.GetElement(2));
530+
Assert.Equal((short)-25000, subResult.GetElement(3));
531+
// Perfect zero result
532+
Assert.Equal((short)0, subResult.GetElement(4));
533+
Assert.Equal((short)0, subResult.GetElement(5));
534+
// More regular subtraction
535+
Assert.Equal((short)5000, subResult.GetElement(6));
536+
Assert.Equal((short)-5000, subResult.GetElement(7));
494537
}
495538

496539
[Fact]
497540
public unsafe void NativeIntegerArithmeticTest()
498541
{
499-
var v1 = Vector128.Create((nint)1, (nint)2, (nint)3, (nint)4);
500-
var v2 = Vector128.Create((nint)5, (nint)6, (nint)7, (nint)8);
542+
var v1 = Vector128.Create([(nint)1, (nint)2, (nint)3, (nint)4]);
543+
var v2 = Vector128.Create([(nint)5, (nint)6, (nint)7, (nint)8]);
501544

502545
var addResult = PackedSimd.Add(v1, v2);
503546
var subResult = PackedSimd.Subtract(v1, v2);
504547
var mulResult = PackedSimd.Multiply(v1, v2);
505548

506-
Assert.Equal(Vector128.Create((nint)6, (nint)8, (nint)10, (nint)12), addResult);
507-
Assert.Equal(Vector128.Create((nint)(-4), (nint)(-4), (nint)(-4), (nint)(-4)), subResult);
508-
Assert.Equal(Vector128.Create((nint)5, (nint)12, (nint)21, (nint)32), mulResult);
549+
Assert.Equal(Vector128.Create([(nint)6, (nint)8, (nint)10, (nint)12]), addResult);
550+
Assert.Equal(Vector128.Create([(nint)(-4), (nint)(-4), (nint)(-4), (nint)(-4)]), subResult);
551+
Assert.Equal(Vector128.Create([(nint)5, (nint)12, (nint)21, (nint)32]), mulResult);
509552
}
510553

511554
[Fact]
512555
public unsafe void NativeUnsignedIntegerArithmeticTest()
513556
{
514-
var v1 = Vector128.Create((nuint)1, (nuint)2, (nuint)3, (nuint)4);
515-
var v2 = Vector128.Create((nuint)5, (nuint)6, (nuint)7, (nuint)8);
557+
var v1 = Vector128.Create([(nuint)1, (nuint)2, (nuint)3, (nuint)4]);
558+
var v2 = Vector128.Create([(nuint)5, (nuint)6, (nuint)7, (nuint)8]);
516559

517560
var addResult = PackedSimd.Add(v1, v2);
518561
var subResult = PackedSimd.Subtract(v1, v2);
519562
var mulResult = PackedSimd.Multiply(v1, v2);
520563

521-
Assert.Equal(Vector128.Create((nuint)6, (nuint)8, (nuint)10, (nuint)12), addResult);
522-
Assert.Equal(Vector128.Create(unchecked((nuint) - 4), unchecked((nuint) - 4), unchecked((nuint) - 4), unchecked((nuint) - 4)), subResult);
523-
Assert.Equal(Vector128.Create((nuint)5, (nuint)12, (nuint)21, (nuint)32), mulResult);
564+
Assert.Equal(Vector128.Create([(nuint)6, (nuint)8, (nuint)10, (nuint)12]), addResult);
565+
Assert.Equal(Vector128.Create([unchecked((nuint)(-4)), unchecked((nuint)(-4)), unchecked((nuint)(-4)), unchecked((nuint)(-4))]), subResult);
566+
Assert.Equal(Vector128.Create([(nuint)5, (nuint)12, (nuint)21, (nuint)32]), mulResult);
524567
}
525568

526569
[Fact]
@@ -530,7 +573,7 @@ public unsafe void NativeIntegerLoadStoreTest()
530573
fixed (nint* ptr = values)
531574
{
532575
var loaded = PackedSimd.LoadVector128(ptr);
533-
Assert.Equal(Vector128.Create((nint)1, (nint)2, (nint)3, (nint)4), loaded);
576+
Assert.Equal(Vector128.Create(values.AsSpan()), loaded);
534577

535578
nint[] storeTarget = new nint[4];
536579
fixed (nint* storePtr = storeTarget)
@@ -548,7 +591,7 @@ public unsafe void NativeUnsignedIntegerLoadStoreTest()
548591
fixed (nuint* ptr = values)
549592
{
550593
var loaded = PackedSimd.LoadVector128(ptr);
551-
Assert.Equal(Vector128.Create((nuint)1, (nuint)2, (nuint)3, (nuint)4), loaded);
594+
Assert.Equal(Vector128.Create(values.AsSpan()), loaded);
552595

553596
nuint[] storeTarget = new nuint[4];
554597
fixed (nuint* storePtr = storeTarget)
@@ -562,27 +605,27 @@ public unsafe void NativeUnsignedIntegerLoadStoreTest()
562605
[Fact]
563606
public void NativeIntegerShiftTest()
564607
{
565-
var v = Vector128.Create((nint)16, (nint) - 16, (nint)32, (nint) - 32);
608+
var v = Vector128.Create([(nint)16, (nint)(-16), (nint)32, (nint)(-32)]);
566609

567610
var leftShift = PackedSimd.ShiftLeft(v, 2);
568611
var rightShiftArith = PackedSimd.ShiftRightArithmetic(v, 2);
569612
var rightShiftLogical = PackedSimd.ShiftRightLogical(v, 2);
570613

571-
Assert.Equal(Vector128.Create((nint)64, (nint) - 64, (nint)128, (nint) - 128), leftShift);
572-
Assert.Equal(Vector128.Create((nint)4, (nint) - 4, (nint)8, (nint) - 8), rightShiftArith);
573-
Assert.Equal(Vector128.Create((nint)4, (nint)1073741820, (nint)8, (nint)1073741816), rightShiftLogical);
614+
Assert.Equal(Vector128.Create([(nint)64, (nint)(-64), (nint)128, (nint)(-128)]), leftShift);
615+
Assert.Equal(Vector128.Create([(nint)4, (nint)(-4), (nint)8, (nint)(-8)]), rightShiftArith);
616+
Assert.Equal(Vector128.Create([(nint)4, (nint)1073741820, (nint)8, (nint)1073741816]), rightShiftLogical);
574617
}
575618

576619
[Fact]
577620
public void NativeUnsignedIntegerShiftTest()
578621
{
579-
var v = Vector128.Create((nuint)16, (nuint)unchecked(-16), (nuint)32, (nuint)unchecked(-32));
622+
var v = Vector128.Create([(nuint)16, unchecked((nuint)(-16)), (nuint)32, unchecked((nuint)(-32))]);
580623

581624
var leftShift = PackedSimd.ShiftLeft(v, 2);
582625
var rightShiftLogical = PackedSimd.ShiftRightLogical(v, 2);
583626

584-
Assert.Equal(Vector128.Create((nuint)64, unchecked((nuint) - 64), (nuint)128, unchecked((nuint) - 128)), leftShift);
585-
Assert.Equal(Vector128.Create((nuint)4, (nuint)1073741820, (nuint)8, (nuint)1073741816), rightShiftLogical);
627+
Assert.Equal(Vector128.Create([(nuint)64, unchecked((nuint)(-64)), (nuint)128, unchecked((nuint)(-128))]), leftShift);
628+
Assert.Equal(Vector128.Create([(nuint)4, (nuint)1073741820, (nuint)8, (nuint)1073741816]), rightShiftLogical);
586629
}
587630
}
588631
}

0 commit comments

Comments
 (0)