静态方法:通道处理
SIMD.%type%.check()
check
方法用于检查一个值是否为当前类型的 SIMD 值。如果是的,就返回这个值,否则就报错。
var a = SIMD.Float32x4(1, 2, 3, 9);
SIMD.Float32x4.check(a);
// Float32x4[1, 2, 3, 9]
SIMD.Float32x4.check([1,2,3,4]) // 报错
SIMD.Int32x4.check(a) // 报错
SIMD.Int32x4.check('hello world') // 报错
SIMD.%type%.extractLane(),SIMD.%type%.replaceLane()
extractLane
方法用于返回给定通道的值。它接受两个参数,分别是 SIMD 值和通道编号。
var t = SIMD.Float32x4(1, 2, 3, 4);
SIMD.Float32x4.extractLane(t, 2) // 3
replaceLane
方法用于替换指定通道的值,并返回一个新的 SIMD 值。它接受三个参数,分别是原来的 SIMD 值、通道编号和新的通道值。
var t = SIMD.Float32x4(1, 2, 3, 4);
SIMD.Float32x4.replaceLane(t, 2, 42)
// Float32x4[1, 2, 42, 4]
SIMD.%type%.load()
load
方法用于从二进制数组读入数据,生成一个新的 SIMD 值。
var a = new Int32Array([1,2,3,4,5,6,7,8]);
SIMD.Int32x4.load(a, 0);
// Int32x4[1, 2, 3, 4]
var b = new Int32Array([1,2,3,4,5,6,7,8]);
SIMD.Int32x4.load(a, 2);
// Int32x4[3, 4, 5, 6]
load
方法接受两个参数:一个二进制数组和开始读取的位置(从 0 开始)。如果位置不合法(比如-1
或者超出二进制数组的大小),就会抛出一个错误。
这个方法还有三个变种load1()
、load2()
、load3()
,表示从指定位置开始,只加载一个通道、二个通道、三个通道的值。
// 格式
SIMD.Int32x4.load(tarray, index)
SIMD.Int32x4.load1(tarray, index)
SIMD.Int32x4.load2(tarray, index)
SIMD.Int32x4.load3(tarray, index)
// 实例
var a = new Int32Array([1,2,3,4,5,6,7,8]);
SIMD.Int32x4.load1(a, 0);
// Int32x4[1, 0, 0, 0]
SIMD.Int32x4.load2(a, 0);
// Int32x4[1, 2, 0, 0]
SIMD.Int32x4.load3(a, 0);
// Int32x4[1, 2, 3,0]
SIMD.%type%.store()
store
方法用于将一个 SIMD 值,写入一个二进制数组。它接受三个参数,分别是二进制数组、开始写入的数组位置、SIMD 值。它返回写入值以后的二进制数组。
var t1 = new Int32Array(8);
var v1 = SIMD.Int32x4(1, 2, 3, 4);
SIMD.Int32x4.store(t1, 0, v1)
// Int32Array[1, 2, 3, 4, 0, 0, 0, 0]
var t2 = new Int32Array(8);
var v2 = SIMD.Int32x4(1, 2, 3, 4);
SIMD.Int32x4.store(t2, 2, v2)
// Int32Array[0, 0, 1, 2, 3, 4, 0, 0]
上面代码中,t1
是一个二进制数组,v1
是一个 SIMD 值,只有四个通道。所以写入t1
以后,只有前四个位置有值,后四个位置都是 0。而t2
是从 2 号位置开始写入,所以前两个位置和后两个位置都是 0。
这个方法还有三个变种store1()
、store2()
和store3()
,表示只写入一个通道、二个通道和三个通道的值。
var tarray = new Int32Array(8);
var value = SIMD.Int32x4(1, 2, 3, 4);
SIMD.Int32x4.store1(tarray, 0, value);
// Int32Array[1, 0, 0, 0, 0, 0, 0, 0]
SIMD.%type%.splat()
splat
方法返回一个新的 SIMD 值,该值的所有通道都会设成同一个预先给定的值。
SIMD.Float32x4.splat(3);
// Float32x4[3, 3, 3, 3]
SIMD.Float64x2.splat(3);
// Float64x2[3, 3]
如果省略参数,所有整数型的 SIMD 值都会设定0
,浮点型的 SIMD 值都会设成NaN
。
SIMD.%type%.swizzle()
swizzle
方法返回一个新的 SIMD 值,重新排列原有的 SIMD 值的通道顺序。
var t = SIMD.Float32x4(1, 2, 3, 4);
SIMD.Float32x4.swizzle(t, 1, 2, 0, 3);
// Float32x4[2,3,1,4]
上面代码中,swizzle
方法的第一个参数是原有的 SIMD 值,后面的参数对应将要返回的 SIMD 值的四个通道。它的意思是新的 SIMD 的四个通道,依次是原来 SIMD 值的 1 号通道、2 号通道、0 号通道、3 号通道。由于 SIMD 值最多可以有 16 个通道,所以swizzle
方法除了第一个参数以外,最多还可以接受 16 个参数。
下面是另一个例子。
var a = SIMD.Float32x4(1.0, 2.0, 3.0, 4.0);
// Float32x4[1.0, 2.0, 3.0, 4.0]
var b = SIMD.Float32x4.swizzle(a, 0, 0, 1, 1);
// Float32x4[1.0, 1.0, 2.0, 2.0]
var c = SIMD.Float32x4.swizzle(a, 3, 3, 3, 3);
// Float32x4[4.0, 4.0, 4.0, 4.0]
var d = SIMD.Float32x4.swizzle(a, 3, 2, 1, 0);
// Float32x4[4.0, 3.0, 2.0, 1.0]
SIMD.%type%.shuffle()
shuffle
方法从两个 SIMD 值之中取出指定通道,返回一个新的 SIMD 值。
var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
SIMD.Float32x4.shuffle(a, b, 1, 5, 7, 2);
// Float32x4[2, 6, 8, 3]
上面代码中,a
和b
一共有 8 个通道,依次编号为 0 到 7。shuffle
根据编号,取出相应的通道,返回一个新的 SIMD 值。