ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Linux ARM NWFPE 浮点模拟器未实现指令与舍入模式深度解析(内核 TODO 清单解读)

Linux ARM NWFPE 浮点模拟器未实现指令与舍入模式深度解析(内核 TODO 清单解读) Linux ARM NWFPE 浮点模拟器未实现指令与舍入模式深度解析内核 TODO 清单解读【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux导读本文基于 Linux 内核源码树中的 Documentation/arch/arm/nwfpe/todo.rst 文档深入剖析 ARM 平台 NWFPENetWinder Floating Point EmulatorARM FPA11 浮点协处理器的内核级软件模拟器遗留的两大技术难题一批尚未实现的超越函数指令幂、对数、指数、三角函数等以及舍入模式仅能随指令指定、无法由控制寄存器全局控制的架构性限制。读者读完本文后将理解这些指令在指令编码中的位置、它们为何长期停留在 TODO 清单、两条候选实现路线高精度查表法与 CORDIC 算法的取舍以及舍入模式问题背后的寄存器设计约束与可行的内核改造思路并能在 arch/arm/nwfpe 目录中对照源码逐行验证。背景NWFPE 与这份 TODO 清单NWFPE 是 Linux 内核为无硬件浮点协处理器的 ARM 平台提供的浮点模拟器用于模拟 ARM FPA11Floating Point Accelerator协处理器。它通过捕获未定义指令异常在 arch/arm/nwfpe/fpa11.c 的EmulateAll()入口对指令进行解码并分流到三类处理函数EmulateCPDO()—— 二元/一元算术指令arch/arm/nwfpe/fpa11_cpdo.cEmulateCPDT()—— 数据装载/存储指令LDF/STF/LFM/SFMEmulateCPRT()—— 寄存器传送与比较指令FLT/FIX/CMF/WFS/RFS 等arch/arm/nwfpe/fpa11_cprt.c。todo.rst正是该模拟器维护者遗留的“待办事项”清单全文围绕两个主题未实现的超越函数指令、以及舍入模式的架构性限制。值得注意的是这份清单本身也在持续缩减——见下文“已完成的工作”一节。未实现的超越函数指令指令清单与语义todo.rst开篇以 ARM 汇编助记符形式列出了 12 条尚未实现的指令统一遵循助记符{cond}S|D|E{P,M,Z} Fd, Fm,#value的语法S/D/E为单/双/扩展精度P/M/Z为舍入模式Fd为目标浮点寄存器Fm为源寄存器或浮点常量指令全称语义POWPowerFd : Fn ^ FmRPWReverse powerFd : Fm ^ FnPOLPolar angleFd : arctan2(Fn, Fm)LOGLogarithm base 10Fd : log10(Fm)LGNLogarithm base eFd : ln(Fm)EXPExponentFd : e ^ FmSINSineFd : sin(Fm)COSCosineFd : cos(Fm)TANTangentFd : tan(Fm)ASNArc sineFd : arcsin(Fm)ACSArc cosineFd : arccos(Fm)ATNArc tangentFd : arctan(Fm)这些指令的编码定义可在 arch/arm/nwfpe/fpopcode.h 中核实其中POW_CODE、RPW_CODE、POL_CODE属于二元dyadic算术操作码LOG_CODE、LGN_CODE、EXP_CODE、SIN_CODE、COS_CODE、TAN_CODE、ASN_CODE、ACS_CODE、ATN_CODE属于一元monadic算术操作码。为什么它们没有实现todo.rst给出了三个原因编译器不生成这些指令当时的编译器不会发出这些指令libc 已处理对应的数学函数由 libc 中的运行库例程负责FPA11 硬件本身也不实现它们由浮点支持代码floating point support code处理而不是 FPA11 硬件实现。换句话说这些指令属于“存在编码空间但生态中无人使用”的遗产指令模拟器选择不为它们投入实现成本计划“在将来的版本中实现”。从源码确认分发表中确实缺失查看 arch/arm/nwfpe/single_cpdo.c 中的分发表即可得到代码级佐证dyadic_single[16]表中注册了ADF/MUF/SUF/RSF/DVF/RDF/RMF/FML/FDV/FRD共 10 项唯独缺少POW、RPW、POL三个槽位这三个槽位索引处为NULLmonadic_single[16]表中注册了MVF/MNF/ABS/RND/URD/SQT/NRM共 7 项缺少LOG/LGN/EXP/SIN/COS/TAN/ASN/ACS/ATN九个槽位。SingleCPDO()arch/arm/nwfpe/single_cpdo.c通过if (dyadic_single[opc_mask_shift])/if (monadic_single[opc_mask_shift])判断表项是否存在不存在时直接return 0即指令模拟失败、交由内核走非法指令陷阱路径。double_cpdo.c与extended_cpdo.c中的分发表结构与之对应同理缺失这些条目。这印证了todo.rst所述状态在源码中的实际呈现。此外arch/arm/nwfpe/fpopcode.h 与 (L138-L140) 的注释明确标注POW、RPW、POL 以及 LOG、LGN、EXP、SIN、COS、TAN、ASN、ACS、ATN 均为“已弃用仅用于向后兼容”。弃用状态与 TODO 清单相互印证。两条候选实现路线todo.rst详细记录了维护者对实现方案的调研这部分的工程思考极具参考价值路线一精确查表法accurate table methods依据是 IBM 海法Haifa, Israel研究院 S. Gal 的几篇论文承诺极高的精度文档中记为约 99.8%与合理的速度该方法在 GLIBC 中被用于部分超越函数transcendental functions的实现。路线二CORDICCoordinate Rotation Digital Computer坐标旋转数字计算机一种以移位与加法为主、辅以少量乘除运算来计算超越函数的经典算法文档特别指出ARM 处理器擅长移位与加法因此 CORDIC 对该平台“看起来很有前景”promising但当时文档写作时研究不足需要进一步调研其可行性。维护者明确表示对 CORDIC“知之甚少”将可行性判断留给了后续工作。这两条路线并非互斥——查表法侧重精度与成熟度CORDIC 侧重硬件适配性——为后续实现者提供了两条可验证的起点。舍入模式FPA11 架构的特殊约束问题本质舍入模式只能随指令指定IEEE 754 标准定义了 4 种舍入模式多数架构通过修改控制寄存器中的位来全局指定舍入模式。todo.rst明确指出ARM FPA11 架构并非如此要改变舍入模式必须在每条指令中单独指定。这一设计给移植基准测试程序benchmarks带来了困难——基准程序通常假设可以“设置一次、全局生效”。这也解释了为何todo.rst标题中指令语法要写成{P,M,Z}后缀舍入模式内嵌于指令编码本身。指令编码中的舍入字段在 arch/arm/nwfpe/fpopcode.h 中可以看到舍入模式在指令字中的编码位定义/* rounding masks/values */ #define MASK_ROUNDING_MODE 0x00000060 #define ROUND_TO_NEAREST 0x00000000 #define ROUND_TO_PLUS_INFINITY 0x00000020 #define ROUND_TO_MINUS_INFINITY 0x00000040 #define ROUND_TO_ZERO 0x00000060即指令字的 bit 5-6gh字段编码舍入模式00就近舍入默认、01向正无穷、10向负无穷、11向零。getRoundingMode(opcode)arch/arm/nwfpe/fpopcode.h负责从指令中取出该字段。模拟器如何解释舍入模式模拟器在 arch/arm/nwfpe/fpa11.c 的SetRoundingMode()中将指令编码的舍入模式映射为 softfloat 库的舍入枚举int8 SetRoundingMode(const unsigned int opcode) { switch (opcode MASK_ROUNDING_MODE) { default: case ROUND_TO_NEAREST: return float_round_nearest_even; case ROUND_TO_PLUS_INFINITY: return float_round_up; case ROUND_TO_MINUS_INFINITY: return float_round_down; case ROUND_TO_ZERO: return float_round_to_zero; } }该返回值被写入struct roundingData.mode定义于 arch/arm/nwfpe/fpa11.h成员int8 mode; int8 precision; signed char exception;随后传给SingleCPDO/DoubleCPDO/ExtendedCPDO及 softfloat 底层运算函数。也就是说当前实现的语义是“指令携带的舍入位为准”。设想让 FPCR 覆盖指令舍入位todo.rst提出了一种改造设想FPCR 中包含描述舍入模式的位。模拟器可以改为检查一个标志若该标志被置位则强制忽略指令中的舍入模式改用 FPCR 中相应位指定的模式。这需要两方面的能力标志的 get/set需要一个内核调用或类似机制来读写该标志FPCR 的读写由于WFCWrite Floating-Point Control register/ RFCRead Floating-Point Control register是仅监督模式supervisor-only指令用户态无法直接访问 FPCR因此需要内核介入。WFC/RFC 为什么是特权指令todo.rst引用了一段摘自 ARM 浮点文档针对 Acorn FPE但不限于此的说明解释了 FPCR 的特权属性FPCR 可能仅存在于部分实现中其作用是以实现相关方式控制硬件例如禁用整个浮点系统用户态 ARM 不允许使用该寄存器——因为其变更权保留给各实现若在用户态执行 WFC/RFC将触发陷阱trap。这段摘录还附带了一个来自内核维护者 Russell King 的警告技术上可以这样做让模拟器用 FPCR 覆盖指令舍入位但一旦将来出现硬件浮点仿真hardware FP emulation这种依赖模拟器特定行为的方案有很高的隔离/不兼容风险。这解释了为什么该设想长期停留在 TODO 而非落地实现。源码现状WFC/RFC 在模拟器中尚未处理对照 arch/arm/nwfpe/fpa11_cprt.c 的EmulateCPRT()分发逻辑可以确认现状WFS/RFS写/读FPSR浮点状态寄存器已被实现writeFPSR(readRegister(getRd(opcode)))与writeRegister(getRd(opcode), readFPSR())WFC/RFC写/读 FPCR在default分支直接return 0即模拟器不处理、走非法指令路径。todo.rst还记录了一个深层工程问题要使 FPCR 方案可行必须提供读写标志及 FPCR 位的方法而在 ArmLinux 中这需要内核调用因为 WFC/RFC 是监督模式专属指令——用户态程序无法自行完成设置。这形成了一条完整的待办链条特权指令 → 需要内核调用接口 → 需要模拟器支持该接口 → 才能实现全局舍入模式覆盖。从寄存器布局看arch/arm/nwfpe/fpsr.hFPCR 由若干标志位组成BIT_RUrounded up、BIT_IEinexact、BIT_MOmantissa overflow、BIT_EOexponent overflow、BIT_SBstore bounce、BIT_ABarithmetic bounce、BIT_RErounding exception、BIT_DAdisable FPA等其中MASK_RM 0x00000060正是舍入模式位域与指令编码中的MASK_ROUNDING_MODE完全一致——这为“从 FPCR 读取舍入模式并覆盖指令位”的设想提供了寄存器层面的可行性依据。已完成的工作URD 与 NRM 的移除TODO 清单并非一成不变。查证 arch/arm/nwfpe/ChangeLog 可以发现早在 1998-11-20 就有如下记录* README.FPE - fix description of URD, NRM instructions * TODO - remove URD, NRM instructions from TODO list * single_cpdo.c - implement URD, NRM * double_cpdo.c - implement URD, NRM * extended_cpdo.c - implement URD, NRM即URDunnormalized round非规格化舍入与 NRMnormalize规格化两条指令已经从 TODO 清单中移除并完成实现。当前源码中URD_CODE与NRM_CODE仍保留在 arch/arm/nwfpe/fpopcode.h 的编码定义中且monadic_single表中URD_CODE 20映射到float32_round_to_int、NRM_CODE 20映射到float32_mvfarch/arm/nwfpe/single_cpdo.c——TODO 清单的更新与源码实现完全对应可作为“清单驱动开发”流程的一个真实案例。同理可推断todo.rst中列出的 12 条指令属于同类工作的下一批候选。总结与后续阅读指引NWFPE 的 TODO 清单揭示了浮点模拟器工程中两类典型难题遗产指令的取舍POW/RPW/POL/LOG/LGN/EXP/SIN/COS/TAN/ASN/ACS/ATN 这 12 条指令编码空间完整但生态废弃实现收益低两条候选路线S. Gal 查表法与 CORDIC各有优劣等待后续实现者验证架构级舍入模式约束FPA11 将舍入模式编码进每条指令而 FPCR 为特权寄存器全局舍入模式覆盖需要“内核调用 模拟器标志 FPCR 位读取”三件套且面临未来硬件浮点仿真带来的兼容性风险Russell King 的警告。感兴趣的读者可在以下源码位置继续深入待办文档本体Documentation/arch/arm/nwfpe/todo.rst指令编码与分类表arch/arm/nwfpe/fpopcode.h舍入模式/精度解析arch/arm/nwfpe/fpa11.c算术指令分发主流程arch/arm/nwfpe/fpa11_cpdo.c单精度分发表缺失条目实证arch/arm/nwfpe/single_cpdo.cFPSR/FPCR 寄存器位定义arch/arm/nwfpe/fpsr.hWFS/RFS 已实现、WFC/RFC 未处理arch/arm/nwfpe/fpa11_cprt.cURD/NRM 完成实现的历史记录arch/arm/nwfpe/ChangeLog【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表