AArch64 crc32 {b,h,w,x}指令将CRC-32值和数据值(分别为8、16、32或64位)作为输入,并输出新的CRC-32值,该值,大概应该作为下一条crc32指令的输入传递。
要在crc32程序为给定的字节集生成的末尾获得相同的值,初始输入值必须是什么?还有什么我需要做的吗?
[该算法在其他地方有很好的描述,但是我找不到在任何地方使用指令的示例。
[通过反复试验的奇迹,似乎crc32累加器的初始值为0xffffffff
(或-1
),要获得标准的crc32值,请反转返回的值,因此为~crc32
。
例如(dwords数组必须为8字节对齐)。
uint32_t crc32 = 0xffffffff;
for (int i = 0; i < number_of_dwords; i++) {
asm volatile ( "crc32x %w[crc], %w[crcin], %x[data]" : [crc] "=r" (crc32) : [crcin] "r" (crc32), [data] "r" (dwords[i]) );
}
return ~crc32;