替换x86 crc32汇编指令

现象描述

编译错误:unknown mnemonic 'crc32q' -- 'crc32q (x3),x2'或operand 1 should be an integer register -- 'crc32b [sp,11],x0'

或unrecognized command line option ‘-msse4.2’。

问题原因

x86使用的是crc32b、crc32w、crc32l、 crc32q汇编指令完成CRC32C校验值计算功能,而ARM64平台使用crc32cb、crc32ch、crc32cw、crc32cx 4个汇编指令完成CRC32C校验值计算功能。

处理步骤

请使用crc32cb、crc32ch、crc32cw、crc32cx取代x86的CRC32系列汇编指令,替换方法如表1所示,并在编译时添加编译参数-march=armv8+crc。

表1 替换方法

指令

输入数据位宽(bit)

备注

crc32cb

8

适用输入数据位宽为8bit,可用于替换x86的crc32b汇编指令。

crc32ch

16

适用输入数据位宽为16bit,可用于替换x86的crc32w汇编指令。

crc32cw

32

适用输入数据位宽为32bit,可用于替换x86的crc32l汇编指令。

crc32cx

64

适用输入数据位宽为64bit,可用于替换x86的crc32q汇编指令。

示例: