编译参数浮点类型介绍

编译参数浮点类型介绍

Q:编译参数 -mcpu=cortex-a7、-mfloat-abi=softfp 和 -mfpu=neon-vfpv4 参数选项介绍
-mfloat-abi=softfp
ABI 即 “application binary interface”,即编译器将 c 代码编译成汇编代码时使用的一种规则
使用规范如下:
在编译带有浮点参数的函数时,有三种可能的编译选项:
-mfloat-abi=soft
-mfloat-abi=softfp
-mfloat-abi=hard
"soft" 选项:表明不使用 FPU 硬件,而是使用 GCC 的整数算术运算来模拟浮点运算。
"softfp" 选项:表明要使用 FPU 硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到 FPU 中。
"hard" 选项:表明要使用 FPU 硬件来做浮点运算,并且,函数的参数直接传递到 FPU 的寄存器(s0、d0)中。
自动向量化选项
armcc 编译器使用 –vectorize 选项来使能向量化编译,一般选择更高的优化等级如 -O2 或者 -O3 就能使能 –vectorize 选项。
gcc 编译器的向量化选项 -ftree-vectorize 来使能向量化选项,使用 -O3 会自动使能 -ftree-vectorize 选项。
-mcpu=cortex-a7
选择处理器类型
armcc 编译器使 –cpu 7-A 或者 –cpu Cortex-A8 来指定指令集架构和 CPU 类型。
gcc 编译器的处理器选项 -mfpu=neon 和 -mcpu 来指定cpu类型。如 -mcpu=cortex-a5
选择 NEON 和 VFP 类型
gcc 选择用 -mfpu=vfpv3-fp16 来指定为 vfp 协处理,而 -mfpu=neon-vfpv4 等就能指定为 NEON+VFP 结构。
选择浮点处理器和ABI接口类型
-mfloat-abi=soft 使用软件浮点库,不是用 VFP 或者 NEON 指令;-mfloat-abi=softfp 使用软件浮点的调用规则,而可以使用 VFP 和 NEON 指令,编译的目标代码和软件浮点库链接使用;
-mfloat-abi=hard 使用 VFP 和 NEON 指令,并且改变 ABI 调用规则来产生更有效率的代码,如用 vfp 寄存器来进行浮点数据的参数传递,从而减少 NEON 寄存器和 ARM 寄存器的拷贝。
常用的 CPU 类型编译器选项

Cortex-A5

-mcpu=cortex-a5

-mfpu=vfpv3-fp16

-mfpu=vfpv3-d16-fp16

-mfpu=neon-fp16

-d16 表明只有前 16个 浮点寄存器可用

Cortex-A7

-mcpu=cortex-a7

-mfpu=vfpv4

-mfpu=vfpv4-d16

-mfpu=neon-vfpv4

-fp16 表明支持 16bit 半精度浮点操作

Cortex-A8

-mcpu=cortex-a8

-mfpu=vfpv3

-mfpu=neon

Cortex-A9

-mcpu=cortex-a9

-mfpu=vfpv3-fp16

-mfpu=vfpv3-d16-fp16

-mfpu=neon-fp16

Cortex-A15

-mcpu=cortex-a15

-mfpu=vfpv4

-mfpu=neon-vfpv4
确认处理器是否支持 NEON

cat /proc/cpuinfo

看是否有如下内容:Features : swp half thumb fastmult vfp edsp neon vfpv3 tlsvfpv4 idiva idivt




    • Related Articles

    • GCC浮点相关的编译选项配置

      gcc的浮点相关编译选项配置 GCC 中的浮点相关的编译选项属于依赖于不同平台的配置选项, 本文的相关配置都是在 ARM32 平台下. SylixOS 下常用的浮点编译配置有两个 -mfpu=name, -mfloat-abi=name 测试程序 #include <stdio.h> #include <time.h> float calc(float *src_mem_32, float *dst_mem_32) {    float mem_32;    int i, j;    for ...
    • SylixOS 使用 FPU 应该注意什么?

      Q: 使用 FPU 应该注意什么 SylixOS 支持浮点协处理器,每一个任务(线程有自己的 FPU 上下文,可以独立的进程浮点运算),但是, SylixOS 内核代码包括内核模块,中断函数,BSP包等等,强烈不建议使用 FPU 指令。因为没有独立的 FPU 上下文,除非操作系统启动时,参数 kfpu为 yes,这样操作系统在中断中会切换 FPU 的上下文,但是这将造成操作系统中断延迟加大。所以,除非兼容老的系统,其他情况不建议在内核和中断中使用 ...
    • GDB 调试时如何显示浮点寄存器

      Q:GDB 调试时如何显示浮点寄存器? SylixOS 的 IDE 对 64 位浮点寄存器的按 double 类型显示,如果是 float 类型的变量用 info all-reg 来查看:操作是需要选中 mips64-sylixos-elf-gdb 在 debugger console 里输入 info all-reg 或者 info float 如下图所示:                                                                     ...
    • 在 Module 中使用硬件浮点方法

      1、在 BSP 中更改启动参数,打开内核FPU 2、修改内核配置 libsylixos/SylixOS/config/kernel/kernel_cfg.h 3、修改内核模块配置 由于内核模块默认不能配置硬件浮点,因此首先需要将内核模块工程改为专家模式 在mk文件的编译选项栏加入硬件浮点配置项,以T3为例(T3的FPU为VFPv4)
    • 基于 SylixOS arm64 的 ABI 说明

      根据 ARM 官方的 AAPCS64 文档说明,X18 是一个平台自定义的寄存器,可用作线程上下文相关处理使用。这样使用的好处是减少了部分压栈和弹栈操作,整体提升了性能。       因为绝大多数用户场景是 C及更高级的语言,所以我们在 gcc 编译的时候已经指定了编译器不要使用 x18。对于客户代码中使用汇编的场景,客户只需要将 x18 修改为别的寄存器即可。 我们这样的处理方式既提升了性能,也能适应绝大多数的场景,并且对于直接用汇编编程的情况只需要做很简单的替换即可。 下图内容摘自ARM ...