静态方法:通道处理

SIMD.%type%.check()

check方法用于检查一个值是否为当前类型的 SIMD 值。如果是的,就返回这个值,否则就报错。

  1. var a = SIMD.Float32x4(1, 2, 3, 9);
  2. SIMD.Float32x4.check(a);
  3. // Float32x4[1, 2, 3, 9]
  4. SIMD.Float32x4.check([1,2,3,4]) // 报错
  5. SIMD.Int32x4.check(a) // 报错
  6. SIMD.Int32x4.check('hello world') // 报错

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]

SIMD.%type%.load()

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

  1. var a = new Int32Array([1,2,3,4,5,6,7,8]);
  2. SIMD.Int32x4.load(a, 0);
  3. // Int32x4[1, 2, 3, 4]
  4. var b = new Int32Array([1,2,3,4,5,6,7,8]);
  5. SIMD.Int32x4.load(a, 2);
  6. // Int32x4[3, 4, 5, 6]

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

这个方法还有三个变种load1()load2()load3(),表示从指定位置开始,只加载一个通道、二个通道、三个通道的值。

  1. // 格式
  2. SIMD.Int32x4.load(tarray, index)
  3. SIMD.Int32x4.load1(tarray, index)
  4. SIMD.Int32x4.load2(tarray, index)
  5. SIMD.Int32x4.load3(tarray, index)
  6. // 实例
  7. var a = new Int32Array([1,2,3,4,5,6,7,8]);
  8. SIMD.Int32x4.load1(a, 0);
  9. // Int32x4[1, 0, 0, 0]
  10. SIMD.Int32x4.load2(a, 0);
  11. // Int32x4[1, 2, 0, 0]
  12. SIMD.Int32x4.load3(a, 0);
  13. // 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 t2 = new Int32Array(8);
  6. var v2 = SIMD.Int32x4(1, 2, 3, 4);
  7. SIMD.Int32x4.store(t2, 2, v2)
  8. // Int32Array[0, 0, 1, 2, 3, 4, 0, 0]

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

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

  1. var tarray = new Int32Array(8);
  2. var value = SIMD.Int32x4(1, 2, 3, 4);
  3. SIMD.Int32x4.store1(tarray, 0, value);
  4. // Int32Array[1, 0, 0, 0, 0, 0, 0, 0]

SIMD.%type%.splat()

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

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

如果省略参数,所有整数型的 SIMD 值都会设定0,浮点型的 SIMD 值都会设成NaN

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 个参数。

下面是另一个例子。

  1. var a = SIMD.Float32x4(1.0, 2.0, 3.0, 4.0);
  2. // Float32x4[1.0, 2.0, 3.0, 4.0]
  3. var b = SIMD.Float32x4.swizzle(a, 0, 0, 1, 1);
  4. // Float32x4[1.0, 1.0, 2.0, 2.0]
  5. var c = SIMD.Float32x4.swizzle(a, 3, 3, 3, 3);
  6. // Float32x4[4.0, 4.0, 4.0, 4.0]
  7. var d = SIMD.Float32x4.swizzle(a, 3, 2, 1, 0);
  8. // Float32x4[4.0, 3.0, 2.0, 1.0]

SIMD.%type%.shuffle()

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]

上面代码中,ab一共有 8 个通道,依次编号为 0 到 7。shuffle根据编号,取出相应的通道,返回一个新的 SIMD 值。