Index: test/mjsunit/simd/float32x4.js |
diff --git a/test/mjsunit/simd/float32x4.js b/test/mjsunit/simd/float32x4.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..25821f4a00791bcd721fde64a1515db9c5524950 |
--- /dev/null |
+++ b/test/mjsunit/simd/float32x4.js |
@@ -0,0 +1,907 @@ |
+// Copyright 2011 the V8 project authors. All rights reserved. |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions are |
+// met: |
+// |
+// * Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// * Redistributions in binary form must reproduce the above |
+// copyright notice, this list of conditions and the following |
+// disclaimer in the documentation and/or other materials provided |
+// with the distribution. |
+// * Neither the name of Google Inc. nor the names of its |
+// contributors may be used to endorse or promote products derived |
+// from this software without specific prior written permission. |
+// |
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+// Flags: --simd_object --allow-natives-syntax |
+ |
+function testConstructor() { |
+ var f4 = float32x4(1.0, 2.0, 3.0, 4.0); |
+ assertEquals(1.0, f4.x); |
+ assertEquals(2.0, f4.y); |
+ assertEquals(3.0, f4.z); |
+ assertEquals(4.0, f4.w); |
+ |
+ var new_f4 = new float32x4(1.0, 2.0, 3.0, 4.0); |
+ assertEquals(1.0, new_f4.x); |
+ assertEquals(2.0, new_f4.y); |
+ assertEquals(3.0, new_f4.z); |
+ assertEquals(4.0, new_f4.w); |
+ |
+ f4 = float32x4(1.1, 2.2, 3.3, 4.4); |
+ assertEquals(1.100000023841858, f4.x); |
+ assertEquals(2.200000047683716, f4.y); |
+ assertEquals(3.299999952316284, f4.z); |
+ assertEquals(4.400000095367432, f4.w); |
+ |
+ new_f4 = new float32x4(1.1, 2.2, 3.3, 4.4); |
+ assertEquals(1.100000023841858, new_f4.x); |
+ assertEquals(2.200000047683716, new_f4.y); |
+ assertEquals(3.299999952316284, new_f4.z); |
+ assertEquals(4.400000095367432, new_f4.w); |
+} |
+ |
+testConstructor(); |
+ |
+function testZeroConstructor() { |
+ var z4 = float32x4.zero(); |
+ assertEquals(0.0, z4.x); |
+ assertEquals(0.0, z4.y); |
+ assertEquals(0.0, z4.z); |
+ assertEquals(0.0, z4.w); |
+ |
+ var new_z4 = new float32x4.zero(); |
+ assertEquals(0.0, new_z4.x); |
+ assertEquals(0.0, new_z4.y); |
+ assertEquals(0.0, new_z4.z); |
+ assertEquals(0.0, new_z4.w); |
+} |
+ |
+testZeroConstructor(); |
+testZeroConstructor(); |
+%OptimizeFunctionOnNextCall(testZeroConstructor); |
+testZeroConstructor(); |
+ |
+function testSplatConstructor() { |
+ var z4 = float32x4.splat(5.0); |
+ assertEquals(5.0, z4.x); |
+ assertEquals(5.0, z4.y); |
+ assertEquals(5.0, z4.z); |
+ assertEquals(5.0, z4.w); |
+} |
+ |
+testSplatConstructor(); |
+testSplatConstructor(); |
+%OptimizeFunctionOnNextCall(testSplatConstructor); |
+testSplatConstructor(); |
+ |
+function testTypeof() { |
+ var z4 = float32x4.zero(); |
+ assertEquals(typeof(z4), "float32x4"); |
+ |
+ var new_z4 = new float32x4.zero(); |
+ assertEquals(typeof(new_z4), "object"); |
+ assertEquals(typeof(new_z4.valueOf()), "float32x4"); |
+ assertEquals(Object.prototype.toString.call(new_z4), "[object float32x4]"); |
+} |
+ |
+testTypeof(); |
+ |
+function testSignMaskGetter() { |
+ var a = float32x4(-1.0, -2.0, -3.0, -4.0); |
+ assertEquals(0xf, a.signMask); |
+ var b = float32x4(1.0, 2.0, 3.0, 4.0); |
+ assertEquals(0x0, b.signMask); |
+ var c = float32x4(1.0, -2.0, -3.0, 4.0); |
+ assertEquals(0x6, c.signMask); |
+} |
+ |
+testSignMaskGetter(); |
+testSignMaskGetter(); |
+%OptimizeFunctionOnNextCall(testSignMaskGetter); |
+testSignMaskGetter(); |
+ |
+function testSIMDAbs() { |
+ var a4 = float32x4(1.0, -1.0, 1.0, -1.0); |
+ var b4 = SIMD.float32x4.abs(a4); |
+ |
+ assertEquals(1.0, b4.x); |
+ assertEquals(1.0, b4.y); |
+ assertEquals(1.0, b4.z); |
+ assertEquals(1.0, b4.w); |
+ |
+ var new_a4 = new float32x4(1.0, -1.0, 1.0, -1.0); |
+ var new_b4 = SIMD.float32x4.abs(new_a4); |
+ |
+ assertEquals(1.0, new_b4.x); |
+ assertEquals(1.0, new_b4.y); |
+ assertEquals(1.0, new_b4.z); |
+ assertEquals(1.0, new_b4.w); |
+} |
+ |
+testSIMDAbs(); |
+testSIMDAbs(); |
+%OptimizeFunctionOnNextCall(testSIMDAbs); |
+testSIMDAbs(); |
+ |
+function testSIMDNeg() { |
+ var a4 = float32x4(1.0, -1.0, 1.0, -1.0); |
+ var b4 = SIMD.float32x4.neg(a4); |
+ |
+ assertEquals(-1.0, b4.x); |
+ assertEquals(1.0, b4.y); |
+ assertEquals(-1.0, b4.z); |
+ assertEquals(1.0, b4.w); |
+ |
+ var new_a4 = new float32x4(1.0, -1.0, 1.0, -1.0); |
+ b4 = SIMD.float32x4.neg(new_a4); |
+ |
+ assertEquals(-1.0, b4.x); |
+ assertEquals(1.0, b4.y); |
+ assertEquals(-1.0, b4.z); |
+ assertEquals(1.0, b4.w); |
+} |
+ |
+testSIMDNeg(); |
+testSIMDNeg(); |
+%OptimizeFunctionOnNextCall(testSIMDNeg); |
+testSIMDNeg(); |
+ |
+function testSIMDAdd() { |
+ var a4 = float32x4(1.0, 1.0, 1.0, 1.0); |
+ var b4 = float32x4(2.0, 2.0, 2.0, 2.0); |
+ var c4 = SIMD.float32x4.add(a4, b4); |
+ |
+ assertEquals(3.0, c4.x); |
+ assertEquals(3.0, c4.y); |
+ assertEquals(3.0, c4.z); |
+ assertEquals(3.0, c4.w); |
+ |
+ var new_a4 = new float32x4(1.0, 1.0, 1.0, 1.0); |
+ var new_b4 = new float32x4(2.0, 2.0, 2.0, 2.0); |
+ c4 = SIMD.float32x4.add(new_a4, new_b4); |
+ |
+ assertEquals(3.0, c4.x); |
+ assertEquals(3.0, c4.y); |
+ assertEquals(3.0, c4.z); |
+ assertEquals(3.0, c4.w); |
+} |
+ |
+testSIMDAdd(); |
+testSIMDAdd(); |
+%OptimizeFunctionOnNextCall(testSIMDAdd); |
+testSIMDAdd(); |
+ |
+function testSIMDSub() { |
+ var a4 = float32x4(1.0, 1.0, 1.0, 1.0); |
+ var b4 = float32x4(2.0, 2.0, 2.0, 2.0); |
+ var c4 = SIMD.float32x4.sub(a4, b4); |
+ |
+ assertEquals(-1.0, c4.x); |
+ assertEquals(-1.0, c4.y); |
+ assertEquals(-1.0, c4.z); |
+ assertEquals(-1.0, c4.w); |
+ |
+ var new_a4 = new float32x4(1.0, 1.0, 1.0, 1.0); |
+ var new_b4 = new float32x4(2.0, 2.0, 2.0, 2.0); |
+ c4 = SIMD.float32x4.sub(new_a4, new_b4); |
+ |
+ assertEquals(-1.0, c4.x); |
+ assertEquals(-1.0, c4.y); |
+ assertEquals(-1.0, c4.z); |
+ assertEquals(-1.0, c4.w); |
+} |
+ |
+testSIMDSub(); |
+testSIMDSub(); |
+%OptimizeFunctionOnNextCall(testSIMDSub); |
+testSIMDSub(); |
+ |
+function testSIMDMul() { |
+ var a4 = float32x4(1.0, 1.0, 1.0, 1.0); |
+ var b4 = float32x4(2.0, 2.0, 2.0, 2.0); |
+ var c4 = SIMD.float32x4.mul(a4, b4); |
+ |
+ assertEquals(2.0, c4.x); |
+ assertEquals(2.0, c4.y); |
+ assertEquals(2.0, c4.z); |
+ assertEquals(2.0, c4.w); |
+ |
+ var new_a4 = new float32x4(1.0, 1.0, 1.0, 1.0); |
+ var new_b4 = new float32x4(2.0, 2.0, 2.0, 2.0); |
+ c4 = SIMD.float32x4.mul(new_a4, new_b4); |
+ |
+ assertEquals(2.0, c4.x); |
+ assertEquals(2.0, c4.y); |
+ assertEquals(2.0, c4.z); |
+ assertEquals(2.0, c4.w); |
+} |
+ |
+testSIMDMul(); |
+testSIMDMul(); |
+%OptimizeFunctionOnNextCall(testSIMDMul); |
+testSIMDMul(); |
+ |
+function testSIMDDiv() { |
+ var a4 = float32x4(1.0, 1.0, 1.0, 1.0); |
+ var b4 = float32x4(2.0, 2.0, 2.0, 2.0); |
+ var c4 = SIMD.float32x4.div(a4, b4); |
+ |
+ assertEquals(0.5, c4.x); |
+ assertEquals(0.5, c4.y); |
+ assertEquals(0.5, c4.z); |
+ assertEquals(0.5, c4.w); |
+ |
+ var new_a4 = new float32x4(1.0, 1.0, 1.0, 1.0); |
+ var new_b4 = new float32x4(2.0, 2.0, 2.0, 2.0); |
+ c4 = SIMD.float32x4.div(new_a4, new_b4); |
+ |
+ assertEquals(0.5, c4.x); |
+ assertEquals(0.5, c4.y); |
+ assertEquals(0.5, c4.z); |
+ assertEquals(0.5, c4.w); |
+} |
+ |
+testSIMDDiv(); |
+testSIMDDiv(); |
+%OptimizeFunctionOnNextCall(testSIMDDiv); |
+testSIMDDiv(); |
+ |
+function testSIMDClamp() { |
+ var m = float32x4(1.0, -2.0, 3.0, -4.0); |
+ var lo = float32x4(0.0, 0.0, 0.0, 0.0); |
+ var hi = float32x4(2.0, 2.0, 2.0, 2.0); |
+ m = SIMD.float32x4.clamp(m, lo, hi); |
+ assertEquals(1.0, m.x); |
+ assertEquals(0.0, m.y); |
+ assertEquals(2.0, m.z); |
+ assertEquals(0.0, m.w); |
+} |
+ |
+testSIMDClamp(); |
+testSIMDClamp(); |
+%OptimizeFunctionOnNextCall(testSIMDClamp); |
+testSIMDClamp(); |
+ |
+function testSIMDMin() { |
+ var m = float32x4(1.0, 2.0, 3.0, 4.0); |
+ var n = float32x4(1.0, 0.0, 2.5, 5.0); |
+ m = SIMD.float32x4.min(m, n); |
+ assertEquals(1.0, m.x); |
+ assertEquals(0.0, m.y); |
+ assertEquals(2.5, m.z); |
+ assertEquals(4.0, m.w); |
+} |
+ |
+testSIMDMin(); |
+testSIMDMin(); |
+%OptimizeFunctionOnNextCall(testSIMDMin); |
+testSIMDMin(); |
+ |
+function testSIMDMax() { |
+ var m = float32x4(1.0, 2.0, 3.0, 4.0); |
+ var n = float32x4(1.0, 0.0, 2.5, 5.0); |
+ m = SIMD.float32x4.max(m, n); |
+ assertEquals(1.0, m.x); |
+ assertEquals(2.0, m.y); |
+ assertEquals(3.0, m.z); |
+ assertEquals(5.0, m.w); |
+} |
+ |
+testSIMDMax(); |
+testSIMDMax(); |
+%OptimizeFunctionOnNextCall(testSIMDMax); |
+testSIMDMax(); |
+ |
+function testSIMDReciprocal() { |
+ var m = float32x4(1.0, 4.0, 9.0, 16.0); |
+ m = SIMD.float32x4.reciprocal(m); |
+ assertTrue(Math.abs(1.0 - m.x) <= 0.001); |
+ assertTrue(Math.abs(0.25 - m.y) <= 0.001); |
+ assertTrue(Math.abs(0.1111111 - m.z) <= 0.001); |
+ assertTrue(Math.abs(0.0625 - m.w) <= 0.001); |
+} |
+ |
+testSIMDReciprocal(); |
+testSIMDReciprocal(); |
+%OptimizeFunctionOnNextCall(testSIMDReciprocal); |
+testSIMDReciprocal(); |
+ |
+function testSIMDReciprocalSqrt() { |
+ var m = float32x4(1.0, 0.25, 0.111111, 0.0625); |
+ m = SIMD.float32x4.reciprocalSqrt(m); |
+ assertTrue(Math.abs(1.0 - m.x) <= 0.001); |
+ assertTrue(Math.abs(2.0 - m.y) <= 0.001); |
+ assertTrue(Math.abs(3.0 - m.z) <= 0.001); |
+ assertTrue(Math.abs(4.0 - m.w) <= 0.001); |
+} |
+ |
+testSIMDReciprocalSqrt(); |
+testSIMDReciprocalSqrt(); |
+%OptimizeFunctionOnNextCall(testSIMDReciprocalSqrt); |
+testSIMDReciprocalSqrt(); |
+ |
+function testSIMDScale() { |
+ var m = float32x4(1.0, -2.0, 3.0, -4.0); |
+ m = SIMD.float32x4.scale(m, 20.0); |
+ assertEquals(20.0, m.x); |
+ assertEquals(-40.0, m.y); |
+ assertEquals(60.0, m.z); |
+ assertEquals(-80.0, m.w); |
+} |
+ |
+testSIMDScale(); |
+testSIMDScale(); |
+%OptimizeFunctionOnNextCall(testSIMDScale); |
+testSIMDScale(); |
+ |
+function testSIMDSqrt() { |
+ var m = float32x4(1.0, 4.0, 9.0, 16.0); |
+ m = SIMD.float32x4.sqrt(m); |
+ assertEquals(1.0, m.x); |
+ assertEquals(2.0, m.y); |
+ assertEquals(3.0, m.z); |
+ assertEquals(4.0, m.w); |
+} |
+ |
+testSIMDSqrt(); |
+testSIMDSqrt(); |
+%OptimizeFunctionOnNextCall(testSIMDSqrt); |
+testSIMDSqrt(); |
+ |
+function testSIMDShuffle() { |
+ var m = float32x4(1.0, 2.0, 3.0, 4.0); |
+ var xxxx = SIMD.float32x4.shuffle(m, SIMD.XXXX); |
+ assertEquals(1.0, xxxx.x); |
+ assertEquals(1.0, xxxx.y); |
+ assertEquals(1.0, xxxx.z); |
+ assertEquals(1.0, xxxx.w); |
+ var yyyy = SIMD.float32x4.shuffle(m, SIMD.YYYY); |
+ assertEquals(2.0, yyyy.x); |
+ assertEquals(2.0, yyyy.y); |
+ assertEquals(2.0, yyyy.z); |
+ assertEquals(2.0, yyyy.w); |
+ var zzzz = SIMD.float32x4.shuffle(m, SIMD.ZZZZ); |
+ assertEquals(3.0, zzzz.x); |
+ assertEquals(3.0, zzzz.y); |
+ assertEquals(3.0, zzzz.z); |
+ assertEquals(3.0, zzzz.w); |
+ var wwww = SIMD.float32x4.shuffle(m, SIMD.WWWW); |
+ assertEquals(4.0, wwww.x); |
+ assertEquals(4.0, wwww.y); |
+ assertEquals(4.0, wwww.z); |
+ assertEquals(4.0, wwww.w); |
+ var wzyx = SIMD.float32x4.shuffle(m, SIMD.WZYX); |
+ assertEquals(4.0, wzyx.x); |
+ assertEquals(3.0, wzyx.y); |
+ assertEquals(2.0, wzyx.z); |
+ assertEquals(1.0, wzyx.w); |
+ var wwzz = SIMD.float32x4.shuffle(m, SIMD.WWZZ); |
+ assertEquals(4.0, wwzz.x); |
+ assertEquals(4.0, wwzz.y); |
+ assertEquals(3.0, wwzz.z); |
+ assertEquals(3.0, wwzz.w); |
+ var xxyy = SIMD.float32x4.shuffle(m, SIMD.XXYY); |
+ assertEquals(1.0, xxyy.x); |
+ assertEquals(1.0, xxyy.y); |
+ assertEquals(2.0, xxyy.z); |
+ assertEquals(2.0, xxyy.w); |
+ var yyww = SIMD.float32x4.shuffle(m, SIMD.YYWW); |
+ assertEquals(2.0, yyww.x); |
+ assertEquals(2.0, yyww.y); |
+ assertEquals(4.0, yyww.z); |
+ assertEquals(4.0, yyww.w); |
+} |
+ |
+testSIMDShuffle(); |
+testSIMDShuffle(); |
+%OptimizeFunctionOnNextCall(testSIMDShuffle); |
+testSIMDShuffle(); |
+ |
+function testSIMDShuffleMix() { |
+ var a = float32x4(1.0, 2.0, 3.0, 4.0); |
+ var b = float32x4(5.0, 6.0, 7.0, 8.0); |
+ var xxxx = SIMD.float32x4.shuffleMix(a, b, SIMD.XXXX); |
+ assertEquals(1.0, xxxx.x); |
+ assertEquals(1.0, xxxx.y); |
+ assertEquals(5.0, xxxx.z); |
+ assertEquals(5.0, xxxx.w); |
+ var yyyy = SIMD.float32x4.shuffleMix(a, b, SIMD.YYYY); |
+ assertEquals(2.0, yyyy.x); |
+ assertEquals(2.0, yyyy.y); |
+ assertEquals(6.0, yyyy.z); |
+ assertEquals(6.0, yyyy.w); |
+ var zzzz = SIMD.float32x4.shuffleMix(a, b, SIMD.ZZZZ); |
+ assertEquals(3.0, zzzz.x); |
+ assertEquals(3.0, zzzz.y); |
+ assertEquals(7.0, zzzz.z); |
+ assertEquals(7.0, zzzz.w); |
+ var wwww = SIMD.float32x4.shuffleMix(a, b, SIMD.WWWW); |
+ assertEquals(4.0, wwww.x); |
+ assertEquals(4.0, wwww.y); |
+ assertEquals(8.0, wwww.z); |
+ assertEquals(8.0, wwww.w); |
+ var wzyx = SIMD.float32x4.shuffleMix(a, b, SIMD.WZYX); |
+ assertEquals(4.0, wzyx.x); |
+ assertEquals(3.0, wzyx.y); |
+ assertEquals(6.0, wzyx.z); |
+ assertEquals(5.0, wzyx.w); |
+ var wwzz = SIMD.float32x4.shuffleMix(a, b, SIMD.WWZZ); |
+ assertEquals(4.0, wwzz.x); |
+ assertEquals(4.0, wwzz.y); |
+ assertEquals(7.0, wwzz.z); |
+ assertEquals(7.0, wwzz.w); |
+ var xxyy = SIMD.float32x4.shuffleMix(a, b, SIMD.XXYY); |
+ assertEquals(1.0, xxyy.x); |
+ assertEquals(1.0, xxyy.y); |
+ assertEquals(6.0, xxyy.z); |
+ assertEquals(6.0, xxyy.w); |
+ var yyww = SIMD.float32x4.shuffleMix(a, b, SIMD.YYWW); |
+ assertEquals(2.0, yyww.x); |
+ assertEquals(2.0, yyww.y); |
+ assertEquals(8.0, yyww.z); |
+ assertEquals(8.0, yyww.w); |
+} |
+ |
+testSIMDShuffleMix(); |
+testSIMDShuffleMix(); |
+%OptimizeFunctionOnNextCall(testSIMDShuffleMix); |
+testSIMDShuffleMix(); |
+ |
+function testSIMDSetters() { |
+ var f = float32x4.zero(); |
+ assertEquals(0.0, f.x); |
+ assertEquals(0.0, f.y); |
+ assertEquals(0.0, f.z); |
+ assertEquals(0.0, f.w); |
+ f = SIMD.float32x4.withX(f, 4.0); |
+ assertEquals(4.0, f.x); |
+ f = SIMD.float32x4.withY(f, 3.0); |
+ assertEquals(3.0, f.y); |
+ f = SIMD.float32x4.withZ(f, 2.0); |
+ assertEquals(2.0, f.z); |
+ f = SIMD.float32x4.withW(f, 1.0); |
+ assertEquals(1.0, f.w); |
+ f = float32x4.zero(); |
+} |
+ |
+testSIMDSetters(); |
+testSIMDSetters(); |
+%OptimizeFunctionOnNextCall(testSIMDSetters); |
+testSIMDSetters(); |
+ |
+function testSIMDConversion() { |
+ var m = int32x4(0x3F800000, 0x40000000, 0x40400000, 0x40800000); |
+ var n = SIMD.int32x4.bitsToFloat32x4(m); |
+ assertEquals(1.0, n.x); |
+ assertEquals(2.0, n.y); |
+ assertEquals(3.0, n.z); |
+ assertEquals(4.0, n.w); |
+ n = float32x4(5.0, 6.0, 7.0, 8.0); |
+ m = SIMD.float32x4.bitsToInt32x4(n); |
+ assertEquals(0x40A00000, m.x); |
+ assertEquals(0x40C00000, m.y); |
+ assertEquals(0x40E00000, m.z); |
+ assertEquals(0x41000000, m.w); |
+ // Flip sign using bit-wise operators. |
+ n = float32x4(9.0, 10.0, 11.0, 12.0); |
+ m = int32x4(0x80000000, 0x80000000, 0x80000000, 0x80000000); |
+ var nMask = SIMD.float32x4.bitsToInt32x4(n); |
+ nMask = SIMD.int32x4.xor(nMask, m); // flip sign. |
+ n = SIMD.int32x4.bitsToFloat32x4(nMask); |
+ assertEquals(-9.0, n.x); |
+ assertEquals(-10.0, n.y); |
+ assertEquals(-11.0, n.z); |
+ assertEquals(-12.0, n.w); |
+ nMask = SIMD.float32x4.bitsToInt32x4(n); |
+ nMask = SIMD.int32x4.xor(nMask, m); // flip sign. |
+ n = SIMD.int32x4.bitsToFloat32x4(nMask); |
+ assertEquals(9.0, n.x); |
+ assertEquals(10.0, n.y); |
+ assertEquals(11.0, n.z); |
+ assertEquals(12.0, n.w); |
+} |
+ |
+testSIMDConversion(); |
+testSIMDConversion(); |
+%OptimizeFunctionOnNextCall(testSIMDConversion); |
+testSIMDConversion(); |
+ |
+function testSIMDConversion2() { |
+ var m = int32x4(1, 2, 3, 4); |
+ var n = SIMD.int32x4.toFloat32x4(m); |
+ assertEquals(1.0, n.x); |
+ assertEquals(2.0, n.y); |
+ assertEquals(3.0, n.z); |
+ assertEquals(4.0, n.w); |
+ n = float32x4(5.0, 6.0, 7.0, 8.0); |
+ m = SIMD.float32x4.toInt32x4(n); |
+ assertEquals(5, m.x); |
+ assertEquals(6, m.y); |
+ assertEquals(7, m.z); |
+ assertEquals(8, m.w); |
+} |
+ |
+testSIMDConversion2(); |
+testSIMDConversion2(); |
+%OptimizeFunctionOnNextCall(testSIMDConversion2); |
+testSIMDConversion2(); |
+ |
+ |
+function testSIMDComparisons() { |
+ var m = float32x4(1.0, 2.0, 0.1, 0.001); |
+ var n = float32x4(2.0, 2.0, 0.001, 0.1); |
+ var cmp; |
+ cmp = SIMD.float32x4.lessThan(m, n); |
+ assertEquals(-1, cmp.x); |
+ assertEquals(0x0, cmp.y); |
+ assertEquals(0x0, cmp.z); |
+ assertEquals(-1, cmp.w); |
+ |
+ cmp = SIMD.float32x4.lessThanOrEqual(m, n); |
+ assertEquals(-1, cmp.x); |
+ assertEquals(-1, cmp.y); |
+ assertEquals(0x0, cmp.z); |
+ assertEquals(-1, cmp.w); |
+ |
+ cmp = SIMD.float32x4.equal(m, n); |
+ assertEquals(0x0, cmp.x); |
+ assertEquals(-1, cmp.y); |
+ assertEquals(0x0, cmp.z); |
+ assertEquals(0x0, cmp.w); |
+ |
+ cmp = SIMD.float32x4.notEqual(m, n); |
+ assertEquals(-1, cmp.x); |
+ assertEquals(0x0, cmp.y); |
+ assertEquals(-1, cmp.z); |
+ assertEquals(-1, cmp.w); |
+ |
+ cmp = SIMD.float32x4.greaterThanOrEqual(m, n); |
+ assertEquals(0x0, cmp.x); |
+ assertEquals(-1, cmp.y); |
+ assertEquals(-1, cmp.z); |
+ assertEquals(0x0, cmp.w); |
+ |
+ cmp = SIMD.float32x4.greaterThan(m, n); |
+ assertEquals(0x0, cmp.x); |
+ assertEquals(0x0, cmp.y); |
+ assertEquals(-1, cmp.z); |
+ assertEquals(0x0, cmp.w); |
+} |
+ |
+testSIMDComparisons(); |
+testSIMDComparisons(); |
+%OptimizeFunctionOnNextCall(testSIMDComparisons); |
+testSIMDComparisons(); |
+ |
+function testFloat32x4ArrayBasic() { |
+ var a = new Float32x4Array(1); |
+ assertEquals(1, a.length); |
+ assertEquals(16, a.byteLength); |
+ assertEquals(16, a.BYTES_PER_ELEMENT); |
+ assertEquals(16, Float32x4Array.BYTES_PER_ELEMENT); |
+ assertEquals(0, a.byteOffset); |
+ assertTrue(undefined != a.buffer); |
+ var b = new Float32x4Array(4); |
+ assertEquals(4, b.length); |
+ assertEquals(64, b.byteLength); |
+ assertEquals(16, b.BYTES_PER_ELEMENT); |
+ assertEquals(16, Float32x4Array.BYTES_PER_ELEMENT); |
+ assertEquals(0, b.byteOffset); |
+ assertTrue(undefined != b.buffer); |
+} |
+ |
+testFloat32x4ArrayBasic(); |
+ |
+function testFloat32x4ArrayGetAndSet() { |
+ var a = new Float32x4Array(4); |
+ a[0] = float32x4(1, 2, 3, 4); |
+ a[1] = float32x4(5, 6, 7, 8); |
+ a[2] = float32x4(9, 10, 11, 12); |
+ a[3] = float32x4(13, 14, 15, 16); |
+ assertEquals(a[0].x, 1); |
+ assertEquals(a[0].y, 2); |
+ assertEquals(a[0].z, 3); |
+ assertEquals(a[0].w, 4); |
+ |
+ assertEquals(a[1].x, 5); |
+ assertEquals(a[1].y, 6); |
+ assertEquals(a[1].z, 7); |
+ assertEquals(a[1].w, 8); |
+ |
+ assertEquals(a[2].x, 9); |
+ assertEquals(a[2].y, 10); |
+ assertEquals(a[2].z, 11); |
+ assertEquals(a[2].w, 12); |
+ |
+ assertEquals(a[3].x, 13); |
+ assertEquals(a[3].y, 14); |
+ assertEquals(a[3].z, 15); |
+ assertEquals(a[3].w, 16); |
+ |
+ var b = new Float32x4Array(4); |
+ b.setAt(0, float32x4(1, 2, 3, 4)); |
+ b.setAt(1, float32x4(5, 6, 7, 8)); |
+ b.setAt(2, float32x4(9, 10, 11, 12)); |
+ b.setAt(3, float32x4(13, 14, 15, 16)); |
+ |
+ assertEquals(b.getAt(0).x, 1); |
+ assertEquals(b.getAt(0).y, 2); |
+ assertEquals(b.getAt(0).z, 3); |
+ assertEquals(b.getAt(0).w, 4); |
+ |
+ assertEquals(b.getAt(1).x, 5); |
+ assertEquals(b.getAt(1).y, 6); |
+ assertEquals(b.getAt(1).z, 7); |
+ assertEquals(b.getAt(1).w, 8); |
+ |
+ assertEquals(b.getAt(2).x, 9); |
+ assertEquals(b.getAt(2).y, 10); |
+ assertEquals(b.getAt(2).z, 11); |
+ assertEquals(b.getAt(2).w, 12); |
+ |
+ assertEquals(b.getAt(3).x, 13); |
+ assertEquals(b.getAt(3).y, 14); |
+ assertEquals(b.getAt(3).z, 15); |
+ assertEquals(b.getAt(3).w, 16); |
+} |
+ |
+testFloat32x4ArrayGetAndSet(); |
+testFloat32x4ArrayGetAndSet(); |
+%OptimizeFunctionOnNextCall(testFloat32x4ArrayGetAndSet); |
+testFloat32x4ArrayGetAndSet(); |
+ |
+function testFloat32x4ArraySwap() { |
+ var a = new Float32x4Array(4); |
+ a[0] = float32x4(1, 2, 3, 4); |
+ a[1] = float32x4(5, 6, 7, 8); |
+ a[2] = float32x4(9, 10, 11, 12); |
+ a[3] = float32x4(13, 14, 15, 16); |
+ |
+ // Swap element 0 and element 3 |
+ var t = a[0]; |
+ a[0] = a[3]; |
+ a[3] = t; |
+ |
+ assertEquals(a[3].x, 1); |
+ assertEquals(a[3].y, 2); |
+ assertEquals(a[3].z, 3); |
+ assertEquals(a[3].w, 4); |
+ |
+ assertEquals(a[1].x, 5); |
+ assertEquals(a[1].y, 6); |
+ assertEquals(a[1].z, 7); |
+ assertEquals(a[1].w, 8); |
+ |
+ assertEquals(a[2].x, 9); |
+ assertEquals(a[2].y, 10); |
+ assertEquals(a[2].z, 11); |
+ assertEquals(a[2].w, 12); |
+ |
+ assertEquals(a[0].x, 13); |
+ assertEquals(a[0].y, 14); |
+ assertEquals(a[0].z, 15); |
+ assertEquals(a[0].w, 16); |
+} |
+ |
+testFloat32x4ArraySwap(); |
+ |
+function testFloat32x4ArrayCopy() { |
+ var a = new Float32x4Array(4); |
+ a[0] = float32x4(1, 2, 3, 4); |
+ a[1] = float32x4(5, 6, 7, 8); |
+ a[2] = float32x4(9, 10, 11, 12); |
+ a[3] = float32x4(13, 14, 15, 16); |
+ var b = new Float32x4Array(a); |
+ assertEquals(a[0].x, b[0].x); |
+ assertEquals(a[0].y, b[0].y); |
+ assertEquals(a[0].z, b[0].z); |
+ assertEquals(a[0].w, b[0].w); |
+ |
+ assertEquals(a[1].x, b[1].x); |
+ assertEquals(a[1].y, b[1].y); |
+ assertEquals(a[1].z, b[1].z); |
+ assertEquals(a[1].w, b[1].w); |
+ |
+ assertEquals(a[2].x, b[2].x); |
+ assertEquals(a[2].y, b[2].y); |
+ assertEquals(a[2].z, b[2].z); |
+ assertEquals(a[2].w, b[2].w); |
+ |
+ assertEquals(a[3].x, b[3].x); |
+ assertEquals(a[3].y, b[3].y); |
+ assertEquals(a[3].z, b[3].z); |
+ assertEquals(a[3].w, b[3].w); |
+ |
+ a[2] = float32x4(17, 18, 19, 20); |
+ |
+ assertEquals(a[2].x, 17); |
+ assertEquals(a[2].y, 18); |
+ assertEquals(a[2].z, 19); |
+ assertEquals(a[2].w, 20); |
+ |
+ assertTrue(a[2].x != b[2].x); |
+ assertTrue(a[2].y != b[2].y); |
+ assertTrue(a[2].z != b[2].z); |
+ assertTrue(a[2].w != b[2].w); |
+} |
+ |
+testFloat32x4ArrayCopy(); |
+ |
+function testFloat32x4ArrayViewBasic() { |
+ var a = new Float32Array(8); |
+ // view with no offset. |
+ var b = new Float32x4Array(a.buffer, 0); |
+ // view with offset. |
+ var c = new Float32x4Array(a.buffer, 16); |
+ // view with no offset but shorter than original list. |
+ var d = new Float32x4Array(a.buffer, 0, 1); |
+ assertEquals(a.length, 8); |
+ assertEquals(b.length, 2); |
+ assertEquals(c.length, 1); |
+ assertEquals(d.length, 1); |
+ assertEquals(a.byteLength, 32); |
+ assertEquals(b.byteLength, 32); |
+ assertEquals(c.byteLength, 16); |
+ assertEquals(d.byteLength, 16) |
+ assertEquals(a.byteOffset, 0); |
+ assertEquals(b.byteOffset, 0); |
+ assertEquals(c.byteOffset, 16); |
+ assertEquals(d.byteOffset, 0); |
+} |
+ |
+testFloat32x4ArrayViewBasic(); |
+ |
+function testFloat32x4ArrayViewValues() { |
+ var a = new Float32Array(8); |
+ var b = new Float32x4Array(a.buffer, 0); |
+ var c = new Float32x4Array(a.buffer, 16); |
+ var d = new Float32x4Array(a.buffer, 0, 1); |
+ var start = 100; |
+ for (var i = 0; i < b.length; i++) { |
+ assertEquals(0.0, b[i].x); |
+ assertEquals(0.0, b[i].y); |
+ assertEquals(0.0, b[i].z); |
+ assertEquals(0.0, b[i].w); |
+ } |
+ for (var i = 0; i < c.length; i++) { |
+ assertEquals(0.0, c[i].x); |
+ assertEquals(0.0, c[i].y); |
+ assertEquals(0.0, c[i].z); |
+ assertEquals(0.0, c[i].w); |
+ } |
+ for (var i = 0; i < d.length; i++) { |
+ assertEquals(0.0, d[i].x); |
+ assertEquals(0.0, d[i].y); |
+ assertEquals(0.0, d[i].z); |
+ assertEquals(0.0, d[i].w); |
+ } |
+ for (var i = 0; i < a.length; i++) { |
+ a[i] = i+start; |
+ } |
+ for (var i = 0; i < b.length; i++) { |
+ assertTrue(0.0 != b[i].x); |
+ assertTrue(0.0 != b[i].y); |
+ assertTrue(0.0 != b[i].z); |
+ assertTrue(0.0 != b[i].w); |
+ } |
+ for (var i = 0; i < c.length; i++) { |
+ assertTrue(0.0 != c[i].x); |
+ assertTrue(0.0 != c[i].y); |
+ assertTrue(0.0 != c[i].z); |
+ assertTrue(0.0 != c[i].w); |
+ } |
+ for (var i = 0; i < d.length; i++) { |
+ assertTrue(0.0 != d[i].x); |
+ assertTrue(0.0 != d[i].y); |
+ assertTrue(0.0 != d[i].z); |
+ assertTrue(0.0 != d[i].w); |
+ } |
+ assertEquals(start+0, b[0].x); |
+ assertEquals(start+1, b[0].y); |
+ assertEquals(start+2, b[0].z); |
+ assertEquals(start+3, b[0].w); |
+ assertEquals(start+4, b[1].x); |
+ assertEquals(start+5, b[1].y); |
+ assertEquals(start+6, b[1].z); |
+ assertEquals(start+7, b[1].w); |
+ |
+ assertEquals(start+4, c[0].x); |
+ assertEquals(start+5, c[0].y); |
+ assertEquals(start+6, c[0].z); |
+ assertEquals(start+7, c[0].w); |
+ |
+ assertEquals(start+0, d[0].x); |
+ assertEquals(start+1, d[0].y); |
+ assertEquals(start+2, d[0].z); |
+ assertEquals(start+3, d[0].w); |
+} |
+ |
+testFloat32x4ArrayViewValues(); |
+ |
+function testViewOnFloat32x4Array() { |
+ var a = new Float32x4Array(4); |
+ a[0] = float32x4(1, 2, 3, 4); |
+ a[1] = float32x4(5, 6, 7, 8); |
+ a[2] = float32x4(9, 10, 11, 12); |
+ a[3] = float32x4(13, 14, 15, 16); |
+ assertEquals(a[0].x, 1); |
+ assertEquals(a[0].y, 2); |
+ assertEquals(a[0].z, 3); |
+ assertEquals(a[0].w, 4); |
+ |
+ assertEquals(a[1].x, 5); |
+ assertEquals(a[1].y, 6); |
+ assertEquals(a[1].z, 7); |
+ assertEquals(a[1].w, 8); |
+ |
+ assertEquals(a[2].x, 9); |
+ assertEquals(a[2].y, 10); |
+ assertEquals(a[2].z, 11); |
+ assertEquals(a[2].w, 12); |
+ |
+ assertEquals(a[3].x, 13); |
+ assertEquals(a[3].y, 14); |
+ assertEquals(a[3].z, 15); |
+ assertEquals(a[3].w, 16); |
+ |
+ // Create view on a. |
+ var b = new Float32Array(a.buffer); |
+ assertEquals(b.length, 16); |
+ assertEquals(b.byteLength, 64); |
+ b[2] = 99.0; |
+ b[6] = 1.0; |
+ |
+ // Observe changes in "a" |
+ assertEquals(a[0].x, 1); |
+ assertEquals(a[0].y, 2); |
+ assertEquals(a[0].z, 99); |
+ assertEquals(a[0].w, 4); |
+ |
+ assertEquals(a[1].x, 5); |
+ assertEquals(a[1].y, 6); |
+ assertEquals(a[1].z, 1); |
+ assertEquals(a[1].w, 8); |
+ |
+ assertEquals(a[2].x, 9); |
+ assertEquals(a[2].y, 10); |
+ assertEquals(a[2].z, 11); |
+ assertEquals(a[2].w, 12); |
+ |
+ assertEquals(a[3].x, 13); |
+ assertEquals(a[3].y, 14); |
+ assertEquals(a[3].z, 15); |
+ assertEquals(a[3].w, 16); |
+} |
+ |
+testViewOnFloat32x4Array(); |
+ |
+function testArrayOfFloat32x4() { |
+ var a = []; |
+ var a4 = new Float32x4Array(2); |
+ for (var i = 0; i < a4.length; i++) { |
+ a[i] = float32x4(i, i + 1, i + 2, i + 3); |
+ a4[i] = float32x4(i, i + 1, i + 2, i + 3); |
+ } |
+ |
+ for (var i = 0; i < a4.length; i++) { |
+ assertEquals(a[i].x, a4[i].x); |
+ assertEquals(a[i].y, a4[i].y); |
+ assertEquals(a[i].z, a4[i].z); |
+ assertEquals(a[i].w, a4[i].w); |
+ } |
+} |
+ |
+testArrayOfFloat32x4(); |