【x86移植到鲲鹏】常见编译脚本、编译选项移植、builtin函数、内联汇编函数替换汇总
收藏回复举报
【x86移植到鲲鹏】常见编译脚本、编译选项移植、builtin函数、内联汇编函数替换汇总
发表于2023-08-11 17:40:48
0 查看

【常见编译脚本、编译选项移植】

功能说明

X86代码

鲲鹏代码

为指定类型处理器要生成相应指令

-march=i386

-march=armv8-a

crc32使能编译选项,支持生成 crc32 指令

-mcrc32

-march=armv8-a+crc32

定义编译生成的应用程序为32位,

编译选项不同

-m32

-mabi=ilp32

(gcc低版本不支持,推荐gcc7.3以上)

指定目标处理器名称,

以使生成的代码性能更优

-mtune=intel

Gcc9.1及以上版本可指定

-mtune=tsv110

使用SSE指令生成浮点运算

-mfpmath=sse

无该编译选项、删除

X86下SSE相关编译选项

-msse/-sse2/-sse4/…

删除该部分编译选项

指定生成代码的大小端序

默认是小端序

指定大端序  -mbig-endian

 指定小端序  -mlittle-endian

Char数据类型修改

默认char为有符号,无需指定

-fsigned-char(默认char无符号)

【常见builtin函数】

无需移植的常用builtin函数列表:

功能说明

X86/鲲鹏 代码

计算变量x(uint32)的二进制中1的个数

__builtin_popcount(uint32 x)

按字节翻转x(uint32),返回翻转后的结果

__builtin_bswap32 (uint32_t x)

按字节翻转x(uint16),返回翻转后的结果

__builtin_bswap16 (uint16_t x)

变量x中1的个数的奇偶性

__builtin_parity(x)

判断type1和type2是否是相同的数据类型

__builtin_types_compatible_p(type1, type2)

引导gcc进行条件分支预测

__builtin_expect (long exp, long c)

返回x中最后一个为1的位是从后向前的第几位

__builtin_ffs(x)

判断exp是否在编译时就可以确定其为常量

__builtin_constant_p (exp)

变量x二进制下末尾0的个数

__builtin_ctz(x)

变量X二进制下前导0的个数

__builtin_clz(x)

内存数据预取到cache中

__builtin_prefetch(x)

【常见内联汇编函数】

功能说明

X86代码

鲲鹏代码

指令给处理器提供提示,以提高spin-wait循环的性能

__asm__ (“pause" : : : memory")

__asm__ ("yield" : : : memory")

rep为x86的重复执行指令,需替换为ARM64的rept指令

#define nop __asm__ __volatile__("rep;nop": : :"memory")

#define __nops(n) ".rept " #n "\nnop\n.endr\n"

#define nops(n) asm volatile(__nops(n))

获取精准时间戳

__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));

鲲鹏小智搜索rdtsc,提供3种替换方案

计算8bit数的crc32校验值

__asm__("crc32b %1, %0" : "+r"(crc) : "rm"(v))

__asm__ crc32cb %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v))

计算16bit数的crc32校验值

__asm__("crc32w %1, %0" : "+r"(crc) : "rm"(v))

__asm__ crc32ch %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v))

计算32bit数的crc32校验值

__asm__("crc32l %1, %0" : "+r"(crc) : "rm"(v))

__asm__ ("crc32cw %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(v)

计算64bit数的crc32校验值

__asm__("crc32q %1, %0" : "+r"(result) : "rm"(v))

__asm__  ("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(v))

对整数变量进行原子加

asm (LOCK_PREFIX "addl %1,%0" : "+m" (v->counter) : "ir" (i))

__sync_add_and_fetch(&((*v).counter), 1)

使用gcc的builtin,把内存数据预取到cache中

asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x))

__builtin_prefetch(_x)

本帖最后由 匿名用户2025/04/01 17:18:36 编辑

我要发帖子