MaskMove指令说明:该方法将掩码向量中的每个非零元素对应的源向量中的元素移动到内存地址指定的位置。如果掩码中的元素为零,则对应的内存位置不会被修改。
MaskMove指令接受三个参数(source、mask、address):
源向量(source):包含要移动的数据的 128 位向量。
掩码向量(mask):也是一个 128 位向量,用于控制哪些元素将被移动到内存地址。掩码中的每个元素(sbyte)将决定相应位置的元素是否被写入内存。如果掩码中的元素为非零值,则对应的元素将被写入;如果为零,则不写入。
内存地址(address):指向目标内存位置的指针,将从这里开始写入数据。
示例
将source向量中的元素全部移到tmpData数组中,这样我们将向量拷贝到数组中的时候就可以用到了
Random random = new Random();
int size= Vector128<byte>.Count;
byte[] data = new byte[size << 1];
random.NextBytes(data);
byte[] tmpData = new byte[size];
fixed (byte* dataPtr = data, tmpPtr = tmpData)
{Vector128<byte> source = *(Vector128<byte>*)dataPtr;Vector128<byte> mask = Vector128.Create((byte)255);Sse2.MaskMove(source, mask, tmpPtr);
}
如果需要source指定位置的元素不移动,只需要在mask 指定位置的元素设置为0
// 设置mask第一个元素为0
mask = mask.WithElement(0, (byte)0);
// source的第一个元素将不在移动到tmpData
Sse2.MaskMove(source, mask, tmpPtr);
也可以把向量复制移动到另外的向量,我们就可以实现向量深拷贝
Vector128<byte> newVector;
Sse2.MaskMove(source, mask, (byte*)&newVector);