SPARC体系下硬浮点编译故障分析

2023-05-16

问题说明

之前extension版的app工程都是用的软浮点编译的,在增加姿控算法库后,统一改用硬浮点运行,发现之前一个浮点数解析不对了,排查发现和工程编译选项有关,为软浮点时正常,硬浮点时异常。该问题脱离业务程序环境直接用test工程测试可复现。

在这里插入图片描述

软浮点编译运行
在这里插入图片描述

硬浮点编译运行
在这里插入图片描述
命令行输入字符串“40.0”程序解析出0.0。显然出错了,单系统并未奔溃。

初步分析

之前在该硬件平台(sparc V8体系结构)下专门测试过软硬浮点速度差异,计算结果都是正常的,硬浮点速度也显著提升。说明硬浮点本身运算没问题,怀疑是浮点二进制接口上出现了不匹配。

ABI汇编分析

脱离C库的浮点相关接口,只研究浮点二进制接口特性。
测试条件:
1.sparc V8体系结构,处理器无MMU
2. lite版Sylixos,app可独立开发,加载,运行但本质是静态链接的。
3. base和bsp都是软浮点编译,静态库硬浮点编译,app软浮点和硬浮点编译。
4. 都采用-O0编译,避免编译器优化,便于汇编分析

静态库函数源码如下:

float  testfloat(float a, float b)
{
    return  (a + b);
}

软浮点编译,反汇编如下:

401b917c <testfloat>:
401b917c:	9d e3 bf a0 	save  %sp, -96, %sp
401b9180:	f0 27 a0 44 	st  %i0, [ %fp + 0x44 ]
401b9184:	f2 27 a0 48 	st  %i1, [ %fp + 0x48 ]
401b9188:	d0 07 a0 44 	ld  [ %fp + 0x44 ], %o0
401b918c:	d2 07 a0 48 	ld  [ %fp + 0x48 ], %o1
401b9190:	7f fe c6 a4 	call  4016ac20 <__addsf3>
401b9194:	01 00 00 00 	nop 
401b9198:	82 10 00 08 	mov  %o0, %g1
401b919c:	b0 10 00 01 	mov  %g1, %i0
401b91a0:	81 e8 00 00 	restore 
401b91a4:	81 c3 e0 08 	retl 
401b91a8:	01 00 00 00 	nop 

硬浮点编译,反汇编如下:

401b8e48 <testfloat>:
401b8e48:	9c 03 bf b0 	add  %sp, -80, %sp
401b8e4c:	d0 23 a0 4c 	st  %o0, [ %sp + 0x4c ]
401b8e50:	d1 03 a0 4c 	ld  [ %sp + 0x4c ], %f8
401b8e54:	d2 23 a0 4c 	st  %o1, [ %sp + 0x4c ]
401b8e58:	d3 03 a0 4c 	ld  [ %sp + 0x4c ], %f9
401b8e5c:	9c 03 a0 50 	add  %sp, 0x50, %sp
401b8e60:	81 c3 e0 08 	retl 
401b8e64:	81 a2 08 29 	fadds  %f8, %f9, %f0

app调用静态库函数源码:

extern  float  testfloat(float a, float b);
float floattest (float  a, float  b)
{
    return  (testfloat(a,b));
}

软浮点编译,反汇编如下:

401b5c20 <floattest>:
401b5c20:	9d e3 bf a0 	save  %sp, -96, %sp
401b5c24:	f0 27 a0 44 	st  %i0, [ %fp + 0x44 ]
401b5c28:	f2 27 a0 48 	st  %i1, [ %fp + 0x48 ]
401b5c2c:	d0 07 a0 44 	ld  [ %fp + 0x44 ], %o0
401b5c30:	d2 07 a0 48 	ld  [ %fp + 0x48 ], %o1
401b5c34:	40 00 0c 85 	call  401b8e48 <testfloat>
401b5c38:	01 00 00 00 	nop 
401b5c3c:	82 10 00 08 	mov  %o0, %g1
401b5c40:	b0 10 00 01 	mov  %g1, %i0
401b5c44:	81 e8 00 00 	restore 
401b5c48:	81 c3 e0 08 	retl 
401b5c4c:	01 00 00 00 	nop 

硬浮点编译,反汇编如下:

401b2f18 <floattest>:
401b2f18:	9d e3 bf a0 	save  %sp, -96, %sp
401b2f1c:	f0 27 a0 44 	st  %i0, [ %fp + 0x44 ]
401b2f20:	f2 27 a0 48 	st  %i1, [ %fp + 0x48 ]
401b2f24:	d0 07 a0 44 	ld  [ %fp + 0x44 ], %o0
401b2f28:	d2 07 a0 48 	ld  [ %fp + 0x48 ], %o1
401b2f2c:	40 00 0c 85 	call  401b6140 <testfloat>
401b2f30:	01 00 00 00 	nop 
401b2f34:	91 a0 00 20 	fmovs  %f0, %f8
401b2f38:	81 a0 00 28 	fmovs  %f8, %f0
401b2f3c:	81 e8 00 00 	restore 
401b2f40:	81 c3 e0 08 	retl 
401b2f44:	01 00 00 00 	nop 

显然,
软浮点编译时,输入参数是通过定点寄存器 %i0, %i1传递,输出用定点寄存器%o0传递;
硬浮点编译时,输入参数是通过定点寄存器 %i0, %i1传递,输出用浮点寄存器%f0传递;
函数调用方和被调研方,如果使用相同的浮点编译方法(同为软浮点编译或同为硬浮点编译)则都可以得到正确结果。

而上述bug出错就源于,一个硬浮点编译的函数调用了一个软浮点编译的函数,被调用函数把结果放到了%o0寄存器中,而调用方却去%f0寄存器中获取结果,自然就出错了。

解决思路

现在的问题是,base,bsp必须用软浮点编译,app可以是软浮点也可以是硬浮点编译,app用到的一个静态库里面有大量浮点计算要求必须硬浮点编译。这时app用软浮点编译和静态库有冲突,用硬浮点编译和base 库有冲突。

首先想到的是用-mfloat-abi=softfp编译选项来编译静态库,让静态库即能用到硬浮点的提速又能在接口上和其他程序兼容。

  • -mfloat-abi=soft 调用软浮点库(softfloat lib 定点运算)来实现浮点运算,浮点参数通过定点寄存器传递.
  • -mfloat-abi=hard 调用FPU硬浮点指令实现浮点运算, 浮点参数一般通过浮点寄存器传递.。
  • -mfloat-abi=softfp 调用FPU硬浮点指令实现浮点运算,但浮点参数通过定点寄存器传递.

操作系统内核, 驱动程序, BSP, 内核模块一般采用 -mfloat-abi=soft 编译.如果存在 VFP 应用程序可使用 -mfloat-abi=softfp 来编译。

但可惜sparc-sylixos-elf-gcc没有此选项。arm-sylixos-eabi-gcc及其他体系结构是有该选项的。

$ sparc-sylixos-elf-gcc.exe --target-help
The following options are target specific:
  -m32                        Use 32-bit ABI
  -m64                        Use 64-bit ABI
  -mapp-regs                  Use ABI reserved registers
  -mcbcond                    Use UltraSPARC Compare-and-Branch extensions
  -mcmodel=                   Use given SPARC-V9 code model
  -mcpu=                      Use features of and schedule code for given CPU
  -mdebug=                    Enable debug output
  -mfaster-structs            Use structs on stronger alignment for double-word
                              copies
  -mfix-at697f                Enable workaround for single erratum of AT697F
                              processor (corresponding to erratum #13 of AT697E
                              processor)
  -mfix-ut699                 Enable workarounds for the errata of the UT699
                              processor
  -mflat                      Use flat register window model
  -mfmaf                      Use UltraSPARC Fused Multiply-Add extensions
  -mfpu                       Use hardware FP
  -mhard-float                Use hardware FP
  -mhard-quad-float           Use hardware quad FP instructions
  -mmemory-model=             Specify the memory model in effect for the
                              program.
  -mpopc                      Use UltraSPARC Population-Count instruction
  -mptr32                     Pointers are 32-bit
  -mptr64                     Pointers are 64-bit
  -mrelax                     Optimize tail call instructions in assembler and
                              linker
  -msoft-float                Do not use hardware FP
  -msoft-quad-float           Do not use hardware quad fp instructions
  -mstack-bias                Use stack bias
  -mstd-struct-return         Enable strict 32-bit psABI struct return checking.
  -mtune=                     Schedule code for given CPU
  -munaligned-doubles         Assume possible double misalignment
  -muser-mode                 Do not generate code that can only run in
                              supervisor mode
  -mv8plus                    Compile for V8+ ABI
  -mvis                       Use UltraSPARC Visual Instruction Set version 1.0
                              extensions
  -mvis2                      Use UltraSPARC Visual Instruction Set version 2.0
                              extensions
  -mvis3                      Use UltraSPARC Visual Instruction Set version 3.0
                              extensions

$ arm-sylixos-eabi-gcc.exe --target-help
The following options are target specific:
  -mabi=                      Specify an ABI
  -mabort-on-noreturn         Generate a call to abort if a noreturn function
                              returns
  -mapcs-float                Pass FP arguments in FP registers
  -mapcs-frame                Generate APCS conformant stack frames
  -mapcs-reentrant            Generate re-entrant, PIC code
  -march=                     Specify the name of the target architecture
  -marm                       Generate code in 32 bit ARM state.
  -mbig-endian                Assume target CPU is configured as big endian
  -mcallee-super-interworking Thumb: Assume non-static functions may be called
                              from ARM code
  -mcaller-super-interworking Thumb: Assume function pointers may go to non-
                              Thumb aware code
  -mcpu=                      Specify the name of the target CPU
  -mfix-cortex-m3-ldrd        Avoid overlapping destination and address
                              registers on LDRD instructions that may trigger
                              Cortex-M3 errata.
  -mfloat-abi=                Specify if floating point hardware should be used
  -mfp16-format=              Specify the __fp16 floating-point format
  -mfpu=                      Specify the name of the target floating point
                              hardware/format
  -mlittle-endian             Assume target CPU is configured as little endian
  -mlong-calls                Generate call insns as indirect calls, if
                              necessary
  -mlra                       Use LRA instead of reload (transitional)
  -mneon-for-64bits           Use Neon to perform 64-bits operations rather
                              than core registers.
  -mnew-generic-costs         Use the new generic RTX cost tables if new core-
                              specific cost table not available (transitional).
  -mold-rtx-costs             Use the old RTX costing tables (transitional).
  -mpic-data-is-text-relative Assume data segments are relative to text segment.
  -mpic-register=             Specify the register to be used for PIC addressing
  -mpoke-function-name        Store function names in object code
  -mrestrict-it               Generate IT blocks appropriate for ARMv8.
  -msched-prolog              Permit scheduling of a function's prologue
                              sequence
  -msingle-pic-base           Do not load the PIC register in function prologues
  -mslow-flash-data           Assume loading data from flash is slower than
                              fetching instructions.
  -mstructure-size-boundary=  Specify the minimum bit alignment of structures
  -mthumb                     Generate code for Thumb state
  -mthumb-interwork           Support calls between Thumb and ARM instruction
                              sets
  -mtls-dialect=              Specify thread local storage scheme
  -mtp=                       Specify how to access the thread pointer
  -mtpcs-frame                Thumb: Generate (non-leaf) stack frames even if
                              not needed
  -mtpcs-leaf-frame           Thumb: Generate (leaf) stack frames even if not
                              needed
  -mtune=                     Tune code for the given processor
  -munaligned-access          Enable unaligned word and halfword accesses to
                              packed data.
  -mvectorize-with-neon-double Use Neon double-word (rather than quad-word)
                              registers for vectorization
  -mvectorize-with-neon-quad  Use Neon quad-word (rather than double-word)
                              registers for vectorization
  -mword-relocations          Only generate absolute relocations on word sized
                              values.
  -mwords-little-endian       Assume big endian bytes, little endian words.
                              This option is deprecated.

另一个方法是这样的,APP和算法库都使用硬浮点编译,这时,app调用的base库里的会返回浮点数的函数接口就会出错,那把这些函数单独用硬浮点编译一个libcfoat静态库,app同时连接base和libcfoat两个库,其中返回浮点的用libcfoat静态库中的,其他用base静态库中的。这这方式实现会比较繁琐,但也能解决浮点接口冲突问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SPARC体系下硬浮点编译故障分析 的相关文章

  • 使用SocketTask,弃用wx

    经验总结 微信小程序websocket的注意事项 xff1a 使用SocketTask xff0c 弃用wx 示例代码 socketTask的示例代码如下 引用在微信小程序的一个页面中开启多个websocket连接的代码 var ws1 6
  • SimpleNES的编译与运行

    前言 如题 xff0c 最近搜索一些C 43 43 项目无意中看到它 xff0c 然后就动手构建了一把 xff0c 当然过程肯定会遇到一些问题的了 不然也不会写这篇文章跟大家分享了呀 xff0c 是吧 xff01 来来来 xff0c 先给大
  • 【注意/切记】 Android JIN开发过程中不要把long当jlong使用

    遇到问题 C C 43 43 调Java方法时直接把long类型的变量 xff0c 传给CallStaticVoidMethod导致对应的Java静态方法接收到了错误的long值 PS 实际的业务场比较复杂 浪费了好多时间去分析才定位到是这
  • Man手册常用快捷键之万事找h键

    最强最核心最根本的快捷键是 gt gt gt gt gt h 最核心 look everything you want to know is here 基本与常用 p 上翻一屏 control 43 p 上滚一行 n下播一屏 control
  • 2023年clang12编译问题与解决的记录

    最近编译clang12以及尝试基于clang开发一个C 43 43 的静态代码分析工具 xff0c 如下是遇到的环境相关的编译问题与解决方案 在此做个记录 xff0c 同时供可能会遇到同样问题的同学参考 环境说明 注 xff1a 如下是最终
  • Clang dump AST需要注意的事项

    Clang dump AST本质上是对一个OC C C 43 43 源文件编译单元执行编译 xff0c 即跟编译相关的配置都是要注意相关的参数 xff0c 比如依赖的头文件的路径 xff0c 特别编译的源文件依赖的其它路径下的头文件 xff
  • URI与URL的区别

    xff08 原网址 xff1a http zhidao baidu com question 38764759 html xff09 Web上可用的每种资源 HTML文档 图像 视频片段 程序等 由一个通过通用资源标志符 xff08 Uni
  • Python datetime  和 str 相互转化

    datetime 转化为 str now 61 datetime datetime now now strftime 39 Y m d H M S 39 print now 输出2012 03 05 16 26 23 870105 strf
  • BASE64编码规则

    Base64编码要求把3个8位字节 xff08 3 8 61 24 xff09 转化为4个6位的字节 xff08 4 6 61 24 xff09 xff0c 之后在6位的前面补两个0 xff0c 形成8位一个字节的形式 例如字符串 张3 x
  • Cygwin基本命令的使用方法

    原文链接 xff1a http blog chinaunix net space php uid 61 25580079 amp do 61 blog amp id 61 190413 基本操作命令 ls 以默认方式显示当前目录文件列表 l

随机推荐

  • 正确设置了charles,使用charles抓包某些app,无法抓到的原因(Android手机)

    Charles配置绝对正确 xff0c 还是使终抓不到包的可能的一种情况是 xff01 xff01 xff01 应用使用的网络库不支持代理 xff0c 所有的网络请求没有走代理 xff0c 而是走的正常wifi直连 当时的情况如下 xff1
  • 拉起抖音APP视频页的scheme

    拉起scheme地协议 snssdk1128 span class hljs regexp aweme span span class hljs regexp detail span span class hljs number 65344
  • 1. Windows下使用Mingw-w64 GCC编译安装Lua5.1.5

    除了一些游戏开发的脚本领域 xff0c 在以OpenResty作为Web框架的后端开发中 xff0c Lua也会大量的使用 xff0c 这就难免要对在Shell中测试 验证Lua语法 为此 xff0c 小编写了一篇在Windows环境下编译
  • VSCode Python3 三方库

    Mac VSCode python3 配置 setting 默认已经安装VSCode背景操作 默认已经安装VSCode 网上已经有好多教程安装使用Python3 这里只记录python3 的配置问题 背景 从想学Python 到实际操刀来
  • SylixOS命令行下内存操作/测试工具

    源头 memAccessCmd是用于SylixOS下对内存 寄存器进行访问和测试的工具 SylixOS下调测程序 xff0c 无论是应用 驱动还是内核 xff0c 如果能查看并操作指定内存 寄存器 xff0c 将是一个非常有效的手段 作者在
  • 博客里程碑

    2022 07 20 周三 排名突破5000好难啊 xff01 2022 07 26 周二 又前进了几名 xff0c 进入4000内了
  • 【bug秘史】UINT8数据超出类型范围输出0x0102

    案发现场 开发一个项目 xff0c 前期测试环境是 xff1a simulator 43 sparc leon3 43 sylxios 里面通信协议用到了很多和校验 xff0c 于是便有如下实现函数 xff1a span class tok
  • Ubuntu18.04 安装 Odoo10

    安装Ubuntu 18 04 xff0c 省略 安装时 xff0c 默认用户名为 odoo ubuntu 16 04 开始 使用 systemd 管理服务 xff0c 但是systemd 兼容 sysv init 脚本 下载 odoo源码
  • Git提交后,文件夹任然有红色叹号提示

    最近用TortoiseGit操作出现一个问题 xff0c 明明全部提交并同步了 xff0c nand文件夹上还是有红色叹号 xff0c 表示该文件下内有未提交内容或错误 查看Git仓库发现有yaffsMount c和yaffsmount c
  • 使用SylixOS虚拟串口,实现系统串口自由

    在博客 开启虚拟机第二串口命令行 讲了如何让虚拟机中的串口对接到Windows系统虚拟串口或物理串口 在simulator中并不是所有平台都有第二串口 xff0c 得bsp支持才行 xff0c 而且最多也只能有第二个而不能有第三第四个 对于
  • 大咖说|翼辉丁晓华:我们已经真正意义上感受到了原始创新带来的巨大价值

    大咖说 翼辉丁晓华 xff1a 我们已经真正意义上感受到了原始创新带来的巨大价值 大咖说 是由工控中国策划发起的人物专访类栏目 xff0c 旨在发掘工业控制系统产业链典型企业家代表 行业专家的前沿洞见 xff0c 通过深度访谈对话 xff0
  • 高效工作学习方法四则

    开始做比准备做更重要 xff0c 不要等到条件完全具备才开始 完成比完美更重要 xff0c 尤其是一开始不要最求完美 xff0c 会严重影响完成进度 一个不能完成的工作连完美的前提都丧失了 去做精力管理而不是时间管理 按精力安排工作而不是按
  • 《XXX重点项目质量保证措施》文档模板

    质量保障措施 研制过程中的质量控制在研制过程中 xff0c 不随意更改技术要求 xff0c 对任何技术要求更改 xff0c 都会与用户单位协商 xff0c 得到认可后方可实施 在研制过程中 xff0c 对影响技术性能的关键指标需外协时 xf
  • VDT (virtual device on tcp) 基于tcp通信的虚拟设备工具集

    概要 VDT virtual device on tcp 基于tcp通信的虚拟设备工具集 DOT device on tcp 创建虚拟字符设备 xff0c 通过tcp收发来读写 DTT device to tcp 打开字符设备 xff0c
  • debian11 安装后必备配置

    debian11 安装后必备配置 运行环境 xff1a PVE v7 2 11 CT容器 系统版本 xff1a Debian 11 standard 11 3 1 amd64 tar zst 启动信息 Debian GNU Linux sp
  • RealEvo许可证协议

    一直使用RealEvo V4 0 0版 xff0c 今天因license到期 xff0c 索性一同安装下新版的IDE 当前最新RealEvo IDE版本为 V5 0 5 xff0c V5 0 0 V5 0 3版本存在一些bug xff0c
  • SylixOS该怎么学

    个人整理的SylixOS学习路线和方法 xff0c 会不定期补充 欢迎大家给出建议
  • sparc-sylixos-elf-gcc平台选项

    sparc sylixos elf gcc exe target help The following options are target specific span class token parameter variable m32
  • Ubuntu18.04 方便好用的截图工具

    安装flameshot 下载地址 xff1a https github com lupoDharkael flameshot 安装命令 xff1a sudo apt get install flameshot 配置快捷键 设置 gt 设备
  • SPARC体系下硬浮点编译故障分析

    问题说明 之前extension版的app工程都是用的软浮点编译的 xff0c 在增加姿控算法库后 xff0c 统一改用硬浮点运行 xff0c 发现之前一个浮点数解析不对了 xff0c 排查发现和工程编译选项有关 xff0c 为软浮点时正常