testConversions.js 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. this.WScript.LoadScriptFile("..\\UnitTestFramework\\SimdJsHelpers.js");
  6. function testInt32x4BitConversion() {
  7. var m = SIMD.Int32x4(0x3F800000, 0x40000000, 0x40400000, 0x40800000);
  8. var n = SIMD.Float32x4.fromInt32x4Bits(m);
  9. equalSimd(SIMD.Float32x4(1, 2, 3, 4), n, SIMD.Float32x4, "Test1");
  10. m = SIMD.Float32x4(5.0, 6.0, 7.0, 8.0);
  11. n = SIMD.Int32x4.fromFloat32x4Bits(m);
  12. equalSimd(SIMD.Int32x4(0x40A00000, 0x40C00000, 0x40E00000, 0x41000000), n, SIMD.Int32x4, "Test2");
  13. // Flip sign using bit-wise operators.
  14. n = SIMD.Float32x4(9.0, 10.0, 11.0, 12.0);
  15. m = SIMD.Int32x4(0x80000000, 0x80000000, 0x80000000, 0x80000000);
  16. var nMask = SIMD.Int32x4.fromFloat32x4Bits(n);
  17. nMask = SIMD.Int32x4.xor(nMask, m); // flip sign.
  18. n = SIMD.Float32x4.fromInt32x4Bits(nMask);
  19. equalSimd(SIMD.Float32x4(-9, -10, -11, -12), n, SIMD.Float32x4, "Test3");
  20. nMask = SIMD.Int32x4.fromFloat32x4Bits(n);
  21. nMask = SIMD.Int32x4.xor(nMask, m); // flip sign.
  22. n = SIMD.Float32x4.fromInt32x4Bits(nMask);
  23. equal(9.0, SIMD.Float32x4.extractLane(n, 0));
  24. equal(10.0, SIMD.Float32x4.extractLane(n, 1));
  25. equal(11.0, SIMD.Float32x4.extractLane(n, 2));
  26. equal(12.0, SIMD.Float32x4.extractLane(n, 3));
  27. equalSimd(SIMD.Float32x4(9, 10, 11, 12), n, SIMD.Float32x4, "Test4");
  28. // Should stay unmodified across bit conversions
  29. m = SIMD.Int32x4(0xFFFFFFFF, 0xFFFF0000, 0x80000000, 0x0);
  30. var m2 = SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.fromInt32x4Bits(m));
  31. equal(SIMD.Int32x4.extractLane(m, 0), SIMD.Int32x4.extractLane(m2, 0));
  32. equal(SIMD.Int32x4.extractLane(m, 1), SIMD.Int32x4.extractLane(m2, 1));
  33. equal(SIMD.Int32x4.extractLane(m, 2), SIMD.Int32x4.extractLane(m2, 2));
  34. equal(SIMD.Int32x4.extractLane(m, 3), SIMD.Int32x4.extractLane(m2, 3));
  35. equalSimd(m, m2, SIMD.Int32x4, "Test5");
  36. }
  37. function testFloat32x4Conversion() {
  38. var m = SIMD.Int32x4(1, 2, 3, 4);
  39. var n = SIMD.Float32x4.fromInt32x4(m);
  40. equalSimd(SIMD.Float32x4(1, 2, 3, 4), n, SIMD.Float32x4, "Test6");
  41. var a = SIMD.Float32x4(1.0, 2.0, 3.0, 4.0);
  42. var b = SIMD.Int32x4.fromFloat32x4(a);
  43. equalSimd(SIMD.Int32x4(1, 2, 3, 4), b, SIMD.Int32x4, "Test7");
  44. // in range
  45. a = SIMD.Float32x4(0x80000000 - 0x80, -0x80000000 + 0x80, 0x80000000 - 0x80, -0.0);
  46. try {b = SIMD.Int32x4.fromFloat32x4(a);} catch(e){print("Error8");}
  47. a = SIMD.Float32x4(0x80000000 - 0x80, 0x80000000 - 0x80, 0x80000000 - 0x80, -0.0);
  48. try {b = SIMD.Int32x4.fromFloat32x4(a);} catch(e){print("Error9");}
  49. a = SIMD.Float32x4(-0x80000000 + 0x80, -0x80000000 + 0x80, -0x80000000 + 0x80, -0.0);
  50. try {b = SIMD.Int32x4.fromFloat32x4(a);} catch(e){print("Error10");}
  51. // throws
  52. a = SIMD.Float32x4(0x80000000, -0x80000000, 0x80000000, -0.0);
  53. try {b = SIMD.Int32x4.fromFloat32x4(a); print("Error11");} catch(e){}
  54. a = SIMD.Float32x4(0x80000000, 0x80000000, 0x80000000, -0.0);
  55. try {b = SIMD.Int32x4.fromFloat32x4(a); print("Error12");} catch(e){}
  56. a = SIMD.Float32x4(-0x80000000 - 0x100, -0x80000000, -0x80000000, -0.0);
  57. try {b = SIMD.Int32x4.fromFloat32x4(a); print("Error13");} catch(e){}
  58. }
  59. testInt32x4BitConversion();
  60. testInt32x4BitConversion();
  61. testInt32x4BitConversion();
  62. testInt32x4BitConversion();
  63. testInt32x4BitConversion();
  64. testInt32x4BitConversion();
  65. testInt32x4BitConversion();
  66. testFloat32x4Conversion();
  67. testFloat32x4Conversion();
  68. testFloat32x4Conversion();
  69. testFloat32x4Conversion();
  70. testFloat32x4Conversion();
  71. testFloat32x4Conversion();
  72. testFloat32x4Conversion();
  73. testFloat32x4Conversion();
  74. print("PASS");