Skip to content
This repository was archived by the owner on Jan 26, 2022. It is now read-only.

Commit fc70527

Browse files
committed
Handle typed array offsets.
Fix loadX and storeX handling of typed arrays with non-zero byteOffset fields.
1 parent 5f2b75c commit fc70527

File tree

2 files changed

+50
-35
lines changed

2 files changed

+50
-35
lines changed

src/ecmascript_simd.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,7 @@ SIMD.float32x4.storeX = function(tarray, index, value) {
888888
checkFloat32x4(value);
889889
if (bpe == 8) {
890890
// tarray's elements are too wide. Just create a new view; this is rare.
891-
var view = new Float32Array(tarray.buffer, index * 8, 1);
891+
var view = new Float32Array(tarray.buffer, tarray.byteOffset + index * 8, 1);
892892
view[0] = value.x;
893893
} else {
894894
_PRIVATE._f32x4[0] = value.x;
@@ -944,7 +944,7 @@ SIMD.float32x4.storeXYZ = function(tarray, index, value) {
944944
checkFloat32x4(value);
945945
if (bpe == 8) {
946946
// tarray's elements are too wide. Just create a new view; this is rare.
947-
var view = new Float32Array(tarray.buffer, index * 8, 3);
947+
var view = new Float32Array(tarray.buffer, tarray.byteOffset + index * 8, 3);
948948
view[0] = value.x;
949949
view[1] = value.y;
950950
view[2] = value.z;
@@ -1817,7 +1817,7 @@ SIMD.int32x4.storeX = function(tarray, index, value) {
18171817
checkInt32x4(value);
18181818
if (bpe == 8) {
18191819
// tarray's elements are too wide. Just create a new view; this is rare.
1820-
var view = new Int32Array(tarray.buffer, index * 8, 1);
1820+
var view = new Int32Array(tarray.buffer, tarray.byteOffset + index * 8, 1);
18211821
view[0] = value.x;
18221822
} else {
18231823
_PRIVATE._i32x4[0] = value.x;
@@ -1873,7 +1873,7 @@ SIMD.int32x4.storeXYZ = function(tarray, index, value) {
18731873
checkInt32x4(value);
18741874
if (bpe == 8) {
18751875
// tarray's elements are too wide. Just create a new view; this is rare.
1876-
var view = new Int32Array(tarray.buffer, index * 8, 3);
1876+
var view = new Int32Array(tarray.buffer, tarray.byteOffset + index * 8, 3);
18771877
view[0] = value.x;
18781878
view[1] = value.y;
18791879
view[2] = value.z;

src/ecmascript_simd_tests.js

Lines changed: 46 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -461,8 +461,9 @@ test('float32x4 load', function() {
461461
});
462462

463463
test('float32x4 overaligned load', function() {
464-
var a = new Float32Array(8);
465-
var af = new Float64Array(a.buffer);
464+
var b = new ArrayBuffer(40);
465+
var a = new Float32Array(b, 8);
466+
var af = new Float64Array(b, 8);
466467
for (var i = 0; i < a.length; i++) {
467468
a[i] = i;
468469
}
@@ -513,8 +514,9 @@ test('float32x4 loadX', function() {
513514
});
514515

515516
test('float32x4 overaligned loadX', function() {
516-
var a = new Float32Array(8);
517-
var af = new Float64Array(a.buffer);
517+
var b = new ArrayBuffer(40);
518+
var a = new Float32Array(b, 8);
519+
var af = new Float64Array(b, 8);
518520
for (var i = 0; i < a.length; i++) {
519521
a[i] = i;
520522
}
@@ -565,8 +567,9 @@ test('float32x4 loadXY', function() {
565567
});
566568

567569
test('float32x4 overaligned loadXY', function() {
568-
var a = new Float32Array(8);
569-
var af = new Float64Array(a.buffer);
570+
var b = new ArrayBuffer(40);
571+
var a = new Float32Array(b, 8);
572+
var af = new Float64Array(b, 8);
570573
for (var i = 0; i < a.length; i++) {
571574
a[i] = i;
572575
}
@@ -617,8 +620,9 @@ test('float32x4 loadXYZ', function() {
617620
});
618621

619622
test('float32x4 overaligned loadXYZ', function() {
620-
var a = new Float32Array(10);
621-
var af = new Float64Array(a.buffer);
623+
var b = new ArrayBuffer(48);
624+
var a = new Float32Array(b, 8);
625+
var af = new Float64Array(b, 8);
622626
for (var i = 0; i < a.length; i++) {
623627
a[i] = i;
624628
}
@@ -665,8 +669,9 @@ test('float32x4 store', function() {
665669
});
666670

667671
test('float32x4 overaligned store', function() {
668-
var a = new Float32Array(12);
669-
var af = new Float64Array(a.buffer);
672+
var b = new ArrayBuffer(56);
673+
var a = new Float32Array(b, 8);
674+
var af = new Float64Array(b, 8);
670675
SIMD.float32x4.store(af, 0, SIMD.float32x4(0, 1, 2, 3));
671676
SIMD.float32x4.store(af, 2, SIMD.float32x4(4, 5, 6, 7));
672677
SIMD.float32x4.store(af, 4, SIMD.float32x4(8, 9, 10, 11));
@@ -705,8 +710,9 @@ test('float32x4 storeX', function() {
705710
});
706711

707712
test('float32x4 overaligned storeX', function() {
708-
var a = new Float32Array(4);
709-
var af = new Float64Array(a.buffer);
713+
var b = new ArrayBuffer(24);
714+
var a = new Float32Array(b, 8);
715+
var af = new Float64Array(b, 8);
710716
a[1] = -2;
711717
a[3] = -2;
712718
SIMD.float32x4.storeX(af, 0, SIMD.float32x4(0, -1, -1, -1));
@@ -751,8 +757,9 @@ test('float32x4 storeXY', function() {
751757
});
752758

753759
test('float32x4 overaligned storeXY', function() {
754-
var a = new Float32Array(8);
755-
var af = new Float64Array(a.buffer);
760+
var b = new ArrayBuffer(40);
761+
var a = new Float32Array(b, 8);
762+
var af = new Float64Array(b, 8);
756763
SIMD.float32x4.storeXY(af, 0, SIMD.float32x4(0, 1, -1, -1));
757764
SIMD.float32x4.storeXY(af, 1, SIMD.float32x4(2, 3, -1, -1));
758765
SIMD.float32x4.storeXY(af, 2, SIMD.float32x4(4, 5, -1, -1));
@@ -792,8 +799,9 @@ test('float32x4 storeXYZ', function() {
792799
});
793800

794801
test('float32x4 overaligned storeXYZ', function() {
795-
var a = new Float32Array(12);
796-
var af = new Float64Array(a.buffer);
802+
var b = new ArrayBuffer(56);
803+
var a = new Float32Array(b, 8);
804+
var af = new Float64Array(b, 8);
797805
a[3] = -2;
798806
a[7] = -2;
799807
a[11] = -2;
@@ -1802,8 +1810,9 @@ test('int32x4 load', function() {
18021810
});
18031811

18041812
test('int32x4 overaligned load', function() {
1805-
var a = new Int32Array(8);
1806-
var af = new Float64Array(a.buffer);
1813+
var b = new ArrayBuffer(40);
1814+
var a = new Int32Array(b, 8);
1815+
var af = new Float64Array(b, 8);
18071816
for (var i = 0; i < a.length; i++) {
18081817
a[i] = i;
18091818
}
@@ -1854,12 +1863,13 @@ test('int32x4 loadX', function() {
18541863
});
18551864

18561865
test('int32x4 overaligned loadX', function() {
1857-
var a = new Int32Array(8);
1858-
var af = new Int32Array(a.buffer);
1866+
var b = new ArrayBuffer(40);
1867+
var a = new Int32Array(b, 8);
1868+
var af = new Int32Array(b, 8);
18591869
for (var i = 0; i < a.length; i++) {
18601870
a[i] = i;
18611871
}
1862-
for (var i = 0; i < a.length ; i++) {
1872+
for (var i = 0; i < a.length; i++) {
18631873
var v = SIMD.int32x4.loadX(af, i);
18641874
equal(i, v.x);
18651875
equal(0, v.y);
@@ -1906,8 +1916,9 @@ test('int32x4 loadXY', function() {
19061916
});
19071917

19081918
test('int32x4 overaligned loadXY', function() {
1909-
var a = new Int32Array(8);
1910-
var af = new Float64Array(a.buffer);
1919+
var b = new ArrayBuffer(40);
1920+
var a = new Int32Array(b, 8);
1921+
var af = new Float64Array(b, 8);
19111922
for (var i = 0; i < a.length; i++) {
19121923
a[i] = i;
19131924
}
@@ -1958,8 +1969,9 @@ test('int32x4 loadXYZ', function() {
19581969
});
19591970

19601971
test('int32x4 overaligned loadXYZ', function() {
1961-
var a = new Int32Array(10);
1962-
var af = new Float64Array(a.buffer);
1972+
var b = new ArrayBuffer(48);
1973+
var a = new Int32Array(b, 8);
1974+
var af = new Float64Array(b, 8);
19631975
for (var i = 0; i < a.length; i++) {
19641976
a[i] = i;
19651977
}
@@ -2006,8 +2018,9 @@ test('int32x4 store', function() {
20062018
});
20072019

20082020
test('int32x4 overaligned store', function() {
2009-
var a = new Int32Array(12);
2010-
var af = new Float64Array(a.buffer);
2021+
var b = new ArrayBuffer(56);
2022+
var a = new Int32Array(b, 8);
2023+
var af = new Float64Array(b, 8);
20112024
SIMD.int32x4.store(af, 0, SIMD.int32x4(0, 1, 2, 3));
20122025
SIMD.int32x4.store(af, 2, SIMD.int32x4(4, 5, 6, 7));
20132026
SIMD.int32x4.store(af, 4, SIMD.int32x4(8, 9, 10, 11));
@@ -2046,8 +2059,9 @@ test('int32x4 storeX', function() {
20462059
});
20472060

20482061
test('int32x4 overaligned storeX', function() {
2049-
var a = new Int32Array(4);
2050-
var af = new Float64Array(a.buffer);
2062+
var b = new ArrayBuffer(24);
2063+
var a = new Int32Array(b, 8);
2064+
var af = new Float64Array(b, 8);
20512065
a[1] = -2;
20522066
a[3] = -2;
20532067
SIMD.int32x4.storeX(af, 0, SIMD.int32x4(0, -1, -1, -1));
@@ -2133,8 +2147,9 @@ test('int32x4 storeXYZ', function() {
21332147
});
21342148

21352149
test('int32x4 overaligned storeXYZ', function() {
2136-
var a = new Int32Array(12);
2137-
var af = new Float64Array(a.buffer);
2150+
var b = new ArrayBuffer(56);
2151+
var a = new Int32Array(b, 8);
2152+
var af = new Float64Array(b, 8);
21382153
a[3] = -2;
21392154
a[7] = -2;
21402155
a[11] = -2;

0 commit comments

Comments
 (0)