arm指令手册_软挑课堂丨鲲鹏芯片代码移植参考手册(一)
铛铛铛~软挑课堂干货分享时间!本期为你带来《鲲鹏芯片代码移植参考手册(一)》简介1.编程语言简介按照翻译方式的不同,高级语言通常可以分为两类:一类是编译翻译,一类是解释翻译,分别对应着编译型语言和解释型语言。编译型语言典型的如C、C++语言,都属于编译型语言,源代码到执行的过程概括如图1-1所示。C/C++编译好的程序是机器指令,由操作系统加载到存储器(一般为内存)后由CPU直接执行。...
铛铛铛~软挑课堂干货分享时间!
本期为你带来
《鲲鹏芯片代码移植参考手册(一)》
简介
1.编程语言简介
按照翻译方式的不同,高级语言通常可以分为两类:一类是编译翻译,一类是解释翻译,分别对应着编译型语言和解释型语言。
编译型语言
典型的如C、C++语言,都属于编译型语言,源代码到执行的过程概括如图1-1所示。C/C++编译好的程序是机器指令,由操作系统加载到存储器(一般为内存)后由CPU直接执行。
图1-1 编译型语言执行过程
解释型语言
典型的如Java、Python语言,都属于解释型语言,源代码到执行的过程概括如图1-2所示。Java/Python编译好的程序是平台无关的字节码,由虚拟机解释执行,虚拟机完成平台差异的屏蔽。
图1-2 解释型语言执行过程
2.基于编译型语言开发的应用程序
基于编译型语言开发的应用程序,例如C/C++语言应用程序,其编译后得到可执行程序,可执行程序执行时依赖的指令是CPU架构相关的。因此,基于x86架构编译的C/C++语言应用程序,无法直接在TaiShan服务器运行,需要进行移植编译,移植编译过程中遇到的问题可以参考第2、3章提供的方法解决。
3.基于解释型语言开发的应用程序
基于解释型语言开发的应用程序,是CPU架构不相关的,例如Java、Python,将这类应用程序移植到TaiShan服务器,无需修改和重新编译,按照与x86一致的方式部署和运行应用程序即可。Java应用程序jar包内,可能包含基于C/C++语言开发的so库文件,这类so库需要移植编译,移植编译so库遇到的问题可以参考第2、3章提供的方法解决,使用编译得到的so库重新打包jar包。
准备工作
C/C++程序移植需要安装编译器,推荐使用gcc7.3及以上版本(最低不低于4.8.5),下载安装参考链接:
gcc7.3版本下载地址:
http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/
安装步骤参考:
https://gcc.gnu.org/install/
移植相关问题处理
1.编译脚本移植类问题
1.1 -m64编译选项
现象描述
告警信息:
gcc: error: unrecognized command line option ‘-m64’
可能原因
-m64是x86 64位应用编译选项,m64选项设置int为32bits及long、指针为64 bits,为AMD的x86 64架构生成代码。在ARM64平台无法支持。
处理步骤
将ARM64平台对应的编译选项设置为-mabi=lp64。
1.2 char数据类型的符号
现象描述
告警信息:
warning: comparison is always false due to limitedrange of data type
可能原因
char变量在不同CPU架构下默认符号不一致,在x86架构下为signed char,在ARM64平台为unsigned char,移植时需要指定char变量为signed char。
处理步骤
在编译选项中加入“-fsigned-char”选项,指定ARM64平台下的char为有符号数。
2.源码修改类问题
2.1 代码中汇编指令需要重写
现象描述
ARM的汇编语言与x86完全不同,需要重写,涉及使用嵌入汇编的代码,都需要针对ARM进行配套修改。
处理步骤
需要重新实现汇编代码段。
示例:
在x86架构下:
在ARM64平台下,使用gcc内置函数实现:
2.2替换x86 CRC32汇编指令
现象描述
编译错误:
unknown mnemonic `crc32q' -- `crc32q (x3),x2'或operand 1 should be an integer register -- `crc32b (x1),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系列汇编指令,替换方法如表3-1所示,并在编译时添加编译参数-march=armv8+crc。
表2-1 替换方法
示例:
在x86下的实现:
在ARM64平台下的实现:
2.3替换x86 bswap汇编指令
现象描述
编译报错:
Error: unknown mnemonic `bswap' -- `bswap x3'。
可能原因
bswap是x86的字节序反序指令,需替换为ARM64的rev指令。
处理步骤
x86指令实现的bswap如下:
替换为ARM64指令后如下:
2.4替换x86 rep汇编指令
现象描述
编译报错:
unknown mnemonic `rep` -- `rep`。
可能原因
rep为x86的重复执行指令,需替换为ARM64的rept指令。
处理步骤
修改方法参考如下:
X86实现样例:
TaiShan实现样例,本样例实现空指令,参数n为循环次数:
2.5快速移植内联SSE/SSE2应用
现象描述
部分应用采用了gcc封装的用SSE/SSE2实现的函数,但是gcc目前没有提供对应的ARM64平台版本,需要实现对应函数。
处理步骤
目前已有开源代码实现了部分ARM64平台的函数,代码下载地址:https://github.com/open-estuary/sse2neon.git。
步骤一
将下载项目中的SSE2NEON.h文件拷贝到待移植项目中。
步骤二
在源文件中删除如下代码。
步骤三
在源代码中包含头文件SSE2NEON.h。
下期预告
《鲲鹏芯片代码移植参考手册(二)》
请准备好你们的小板凳
更多推荐
所有评论(0)