相信凡是与编程或通信相关的技术人员都知道CRC32,这是一种常用的数据校验编码。因为CRC32编码的算法很简单,所以用于计算CRC32值的C/C++代码写法基本上固定,很难有优化的余地。通常大家都通过手写汇编,调用特定指令集用于CRC32计算的专用指令来达到计算加速的目的。龙芯以前使用的MIPS以及龙芯自己的扩展指令中都没有CRC32计算指令,现在全新的LoongArch指令集中提供了计算CRC32的专用指令,使计算CRC32的速度达到原来的4倍以上。
使用专用指令达到提速的目的其实没什么可说的,但如果不使用专用指令,而仅仅是把C/C++代码编译为LoongArch的二进制,就能比MIPS快20%以上呢?是不是就比较有意思了!
下面是一段计算CRC32值的C程序,大多数计算CRC32的代码都应该和它相似。函数CrcGenerateTable用于初始化计算多项式表,只需要调用一次。函数CrcUpdate用于计算数据的CRC32值,只有短短的几行。
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
typedef unsigned char Byte;
typedef unsigned int UInt32;
typedef unsigned long long UInt64;
#define kCrcPoly 0xEDB88320
#define CRC_INIT_VAL 0xFFFFFFFF
UInt32 g_CrcTable[256];
void CrcGenerateTable()
{
UInt32 i;
for (i = 0; i < 2