SIMD.%type%.extractLane(),SIMD.%type%.replaceLane()

    extractLane方法用于返回给定通道的值。它接受两个参数,分别是 SIMD 值和通道编号。

    1. var t = SIMD.Float32x4(1, 2, 3, 4);
    2. SIMD.Float32x4.extractLane(t, 2) // 3

    replaceLane方法用于替换指定通道的值,并返回一个新的 SIMD 值。它接受三个参数,分别是原来的 SIMD 值、通道编号和新的通道值。

    1. var t = SIMD.Float32x4(1, 2, 3, 4);
    2. SIMD.Float32x4.replaceLane(t, 2, 42)
    3. // Float32x4[1, 2, 42, 4]

    load方法用于从二进制数组读入数据,生成一个新的 SIMD 值。

    load方法接受两个参数:一个二进制数组和开始读取的位置(从 0 开始)。如果位置不合法(比如-1或者超出二进制数组的大小),就会抛出一个错误。

    1. // 格式
    2. SIMD.Int32x4.load(tarray, index)
    3. SIMD.Int32x4.load1(tarray, index)
    4. SIMD.Int32x4.load3(tarray, index)
    5. // 实例
    6. var a = new Int32Array([1,2,3,4,5,6,7,8]);
    7. // Int32x4[1, 0, 0, 0]
    8. SIMD.Int32x4.load2(a, 0);
    9. // Int32x4[1, 2, 0, 0]
    10. SIMD.Int32x4.load3(a, 0);
    11. // Int32x4[1, 2, 3,0]

    SIMD.%type%.store()

    store方法用于将一个 SIMD 值,写入一个二进制数组。它接受三个参数,分别是二进制数组、开始写入的数组位置、SIMD 值。它返回写入值以后的二进制数组。

    1. var t1 = new Int32Array(8);
    2. var v1 = SIMD.Int32x4(1, 2, 3, 4);
    3. SIMD.Int32x4.store(t1, 0, v1)
    4. // Int32Array[1, 2, 3, 4, 0, 0, 0, 0]
    5. var v2 = SIMD.Int32x4(1, 2, 3, 4);
    6. SIMD.Int32x4.store(t2, 2, v2)
    7. // Int32Array[0, 0, 1, 2, 3, 4, 0, 0]

    上面代码中,t1是一个二进制数组,v1是一个 SIMD 值,只有四个通道。所以写入t1以后,只有前四个位置有值,后四个位置都是 0。而t2是从 2 号位置开始写入,所以前两个位置和后两个位置都是 0。

    这个方法还有三个变种store1()store2()和,表示只写入一个通道、二个通道和三个通道的值。

    splat方法返回一个新的 SIMD 值,该值的所有通道都会设成同一个预先给定的值。

    1. SIMD.Float32x4.splat(3);
    2. // Float32x4[3, 3, 3, 3]
    3. SIMD.Float64x2.splat(3);
    4. // Float64x2[3, 3]

    SIMD.%type%.swizzle()

    swizzle方法返回一个新的 SIMD 值,重新排列原有的 SIMD 值的通道顺序。

    1. var t = SIMD.Float32x4(1, 2, 3, 4);
    2. SIMD.Float32x4.swizzle(t, 1, 2, 0, 3);
    3. // Float32x4[2,3,1,4]

    上面代码中,swizzle方法的第一个参数是原有的 SIMD 值,后面的参数对应将要返回的 SIMD 值的四个通道。它的意思是新的 SIMD 的四个通道,依次是原来 SIMD 值的 1 号通道、2 号通道、0 号通道、3 号通道。由于 SIMD 值最多可以有 16 个通道,所以swizzle方法除了第一个参数以外,最多还可以接受 16 个参数。

    下面是另一个例子。

    shuffle方法从两个 SIMD 值之中取出指定通道,返回一个新的 SIMD 值。

    1. var a = SIMD.Float32x4(1, 2, 3, 4);
    2. var b = SIMD.Float32x4(5, 6, 7, 8);
    3. SIMD.Float32x4.shuffle(a, b, 1, 5, 7, 2);
    4. // Float32x4[2, 6, 8, 3]