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 许可。