Show HN: I486SX_soft_FPU – 适用于 NetBSD 10 在 486SX 上的软件 FPU 模拟器
mezantrop / **i486SX_soft_FPU ** 公开
为 NetBSD 上的 i486SX CPU 恢复 FPU 模拟
许可协议
9 stars 0 forks Branches Tags Activity
为 NetBSD 上的 i486SX 恢复 FPU 模拟
这个复古计算项目恢复了 NetBSD 内核中对 x87 浮点单元 (FPU) 模拟的支持,目标是没有硬件 FPU 的传统 486SX 类处理器。 它将最初的 MATH_EMULATE 选项带回 NetBSD 10.x 及更高版本,并还原和重新设计了 commit dfe83e0 中引入的更改,该更改从内核中删除了 FPU 模拟支持。
免责声明
本项目正在开发中,可能包含错误或不完整的功能。 使用风险自负。 作者对因使用造成的任何问题不承担任何责任。
注意事项
fyl2x在 FPU 上似乎工作正常,但从libc执行时,log函数会产生不正确的结果- 某些操作在精度方面存在难以检测的问题
x87 FPU 模拟指令
🧠 控制和初始化
指令 | 状态 | 描述 | 操作码 | 例子
---|---|---|---|---
fninit | ✅ OK | 初始化 FPU | 9B DB E3 | fninit
📤 加载到 FPU 堆栈
指令 | 状态 | 描述 | 操作码 | 例子
---|---|---|---|---
fld | ✅ OK | 加载浮点值 | D9 /0 | fld st(1)
fldt | ✅ OK | 加载 80 位扩展精度 | DB /5 | fldt [mem]
filds | ✅ OK | 加载整数 (短) | DB /0 | filds [mem]
fildl | ✅ OK | 加载长整数 | DB /A | fildl [mem]
📤 从 FPU 堆栈存储
指令 | 状态 | 描述 | 操作码 | 例子
---|---|---|---|---
fstps | ✅ OK | 存储并弹出单精度 | D9 /3 | fstps [mem]
fstpt | ✅ OK | 存储 80 位扩展精度并弹出 | DB /7 | fstpt [mem]
➕➖✖️➗ 算术运算
指令 | 状态 | 描述 | 操作码 | 例子
---|---|---|---|---
fadd | ✅ OK | 添加浮点值 | D8 /0 | fadd st(1), st
faddl | ✅ OK | 从内存添加长双精度浮点数 | DA /0 | faddl [mem]
fsub | ✅ OK | 减去浮点值 | D8 /4 | fsub st(1), st
fsubp | ✅ OK | 减去并弹出 | DE /5 | fsubp st(1), st(0)
fmul | ✅ OK | 乘以浮点值 | D8 /1 | fmul st(1), st
fdiv | ✅ OK | 除以浮点值 | D8 /6 | fdiv st(1), st
fdivp | ✅ OK | 除以并弹出 | DE /7 | fdivp st(1), st(0)
fscale | ✅ OK | ST(0) 按 ST(1) 缩放 | D9 FD | fscale
🔍 比较
指令 | 状态 | 描述 | 操作码 | 例子
---|---|---|---|---
fcom | ✅ OK | 比较浮点值 | D8 /2 | fcom st(1)
fucom | ✅ OK | 将 ST(0) 与 ST(i) 进行无序比较 | DD E0+i | fucom st(1)
fucomp | ✅ OK | 无序比较和弹出 | DD E8+i | fucomp st(1)
ftst | ✅ OK | 将 ST(0) 与 0.0 进行比较 | D9 E4 | ftst
🔁 堆栈操作和修改
指令 | 状态 | 描述 | 操作码 | 例子
---|---|---|---|---
fxch | ✅ OK | 将 ST(0) 与 ST(i) 交换 | D9 C8+i | fxch st(1)
fchs | ✅ OK | 更改 ST(0) 的符号 | D9 E0 | fchs
fabs | ✅ OK | ST(0) 的绝对值 | D9 E1 | fabs
frndint | ✅ OK | 将 ST(0) 四舍五入为整数 | D9 FC | frndint
📈 对数和特殊数学运算
指令 | 状态 | 描述 | 操作码 | 例子
---|---|---|---|---
fyl2x | ⏳ TBD | 计算 y × log₂(x) (ST(1) × log₂(ST(0))) 并弹出 | D9 F1 | fyl2x
fyl2xp1 | ❌ N/A | 计算 y × log₂(x+1) 并弹出 | D9 F9 | fyl2xp1
fxtract | ❌ N/A | 提取: ST(0) → ST = 尾数, ST+1 = 指数 | D9 F4 | fxtract
f2xm1 | ✅ OK | 计算 ST(0) 的 2^x - 1 | D9 F0 | f2xm1
fpatan | ❌ N/A | 计算 arctangent(ST(1)/ST(0)) 并弹出 | D9 F3 | fpatan
fsqrt | ❌ N/A | 计算 ST(0) 的平方根 | D9 FA | fsqrt
安装
- 阅读 第 32 章. 获取源代码
- 阅读 第 34 章. 编译内核
- 将存储库内容添加到 NetBSD 10.x 机器上的
/src/sys/arch下,然后运行:
$ cd /usr/src/sys/arch/i386/conf/
$ vi GENERIC_TINY_486SX# 或者 GENERIC_PS2TINY_486SX 或者使用 "options MATH_EMULATE" 创建你自己的内核配置
$ config GENERIC_TINY_486SX
$ cd ../compile/GENERIC_TINY_486SX
$ make depend
$ make
# 如果一切顺利,将新内核安装在 root 下:
# mv /netbsd /netbsd.old
# mv netbsd /
预构建驱动器镜像
查看 Releases 以获取编译的带有 FPU 模拟的 netbsd 内核,以及驱动器镜像
联系方式
如果您有想法、问题或发现了问题,请随时提出 issue 或直接与我联系:Mikhail Zakharov。
我对 Linus Torvalds、William "Bill" Jolitz 和 NetBSD 的原始代码所做的更改均已获得 BSD-2-Clause 许可。
