Sin descripción
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

400-IntrinsicsManagedFallbacks.cs 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. using NUnit.Framework;
  2. using Unity.Burst.Intrinsics;
  3. using static Unity.Burst.Intrinsics.X86.Avx;
  4. using static Unity.Burst.Intrinsics.X86.Sse;
  5. using static Unity.Burst.Intrinsics.X86.Sse4_1;
  6. // These tests exist because of a Mono "bug" in the managed fallback versions of some CPU intrinsics.
  7. // Specifically, the version of Mono used in Unity widens all floats to 64-bit when doing any
  8. // operation on them. This can result in the bit representation of float values not being maintained.
  9. // It doesn't happen for all float values, but it happens for e.g. NaN values. It's more likely
  10. // to happen when the source value was actually a uint that we are "viewing" as a float, which is
  11. // what the tests below do.
  12. namespace Burst.Compiler.IL.Tests
  13. {
  14. internal unsafe class TestInstrinsicsManagedFallbacks
  15. {
  16. [Test]
  17. public static unsafe void Test_shuffle_ps_Managed()
  18. {
  19. uint uintValue = 0x7F80_ABCD;
  20. v128 x = new v128(uintValue);
  21. v128 y = new v128(uintValue);
  22. v128 result = shuffle_ps(x, y, SHUFFLE(1, 2, 1, 2));
  23. Assert.AreEqual(uintValue, result.UInt0);
  24. Assert.AreEqual(uintValue, result.UInt1);
  25. Assert.AreEqual(uintValue, result.UInt2);
  26. Assert.AreEqual(uintValue, result.UInt3);
  27. }
  28. [Test]
  29. public static unsafe void Test_blend_ps_Managed()
  30. {
  31. uint uintValue = 0x7F80_ABCD;
  32. v128 x = new v128(uintValue);
  33. v128 y = new v128(uintValue);
  34. v128 result = blend_ps(x, y, 0b1010);
  35. Assert.AreEqual(uintValue, result.UInt0);
  36. Assert.AreEqual(uintValue, result.UInt1);
  37. Assert.AreEqual(uintValue, result.UInt2);
  38. Assert.AreEqual(uintValue, result.UInt3);
  39. }
  40. [Test]
  41. public static unsafe void Test_blendv_ps_Managed()
  42. {
  43. uint uintValue = 0x7F80_ABCD;
  44. v128 x = new v128(uintValue);
  45. v128 y = new v128(uintValue);
  46. v128 mask = new v128(1, 0, 1, 0);
  47. v128 result = blendv_ps(x, y, mask);
  48. Assert.AreEqual(uintValue, result.UInt0);
  49. Assert.AreEqual(uintValue, result.UInt1);
  50. Assert.AreEqual(uintValue, result.UInt2);
  51. Assert.AreEqual(uintValue, result.UInt3);
  52. }
  53. // There's no way to make this test pass on Mono, at least that I can find.
  54. [Test, Ignore("A Mono bug causes this test to fail")]
  55. public static unsafe void Test_extractf_ps_Managed()
  56. {
  57. uint uintValue = 0x7F80_ABCD;
  58. v128 x = new v128(uintValue);
  59. float result = extractf_ps(x, 1);
  60. Assert.AreEqual(uintValue, *(uint*)&result);
  61. }
  62. [Test]
  63. public static unsafe void Test_mm256_broadcast_ss_Managed()
  64. {
  65. uint uintValue = 0x7F80_ABCD;
  66. v256 result = mm256_broadcast_ss(&uintValue);
  67. Assert.AreEqual(uintValue, result.UInt0);
  68. Assert.AreEqual(uintValue, result.UInt1);
  69. Assert.AreEqual(uintValue, result.UInt2);
  70. Assert.AreEqual(uintValue, result.UInt3);
  71. Assert.AreEqual(uintValue, result.UInt4);
  72. Assert.AreEqual(uintValue, result.UInt5);
  73. Assert.AreEqual(uintValue, result.UInt6);
  74. Assert.AreEqual(uintValue, result.UInt7);
  75. }
  76. [Test]
  77. public static unsafe void Test_broadcast_ss_Managed()
  78. {
  79. uint uintValue = 0x7F80_ABCD;
  80. v128 result = broadcast_ss(&uintValue);
  81. Assert.AreEqual(uintValue, result.UInt0);
  82. Assert.AreEqual(uintValue, result.UInt1);
  83. Assert.AreEqual(uintValue, result.UInt2);
  84. Assert.AreEqual(uintValue, result.UInt3);
  85. }
  86. }
  87. }