最重要的是,我决定看看我多年前开始在Amiga上编写并在其他机器上进一步开发的程序是否仍然可以在Amiga上编译和运行(在其他机器上开发之后)。我最初使用的是Lattice C,因为我之前就是这么用的。但是在Lattice中68881的支持是非常错误的。所以我决定试一试gcc。我想最新的版本是2.7.0 (所以我不能升级)。它运行得相当好,除了68881支持中的一个错误:当将任何负数乘以零时,结果总是:
1.:00000
打印出来时(冒号不是打字错误)。顺便说一句,如果你把x设置为0,然后打印出来,它就是0.00000。
这是一个测试bug的示例程序,哪个变量是0,哪个变量是负都无关紧要,如果非零值是正的,它就可以正常工作。
#include <stdio.h>
#include <math.h>
main()
{
float x,a,b;
a=-10.0;
b=0.0;
x=a*b;
printf("%f\n",x);
}它是用:gcc -o tt -m68020 -m68881 tt.c -lm编译的
去掉-m68881可以很好地工作(当然,不使用FPU)去掉-lm和/或math.h没有区别。
有没有人知道错误修复或解决方法?也许是一个gcc的命令行参数?(宁可不做像“if ((a<0)&&(b==0))”这样丑陋的事情)
顺便说一句,由于我不再有一个可以工作的Amiga,我不得不使用一个仿真器。如果你想看看我在这个项目上做了什么(使用Lattice版本),你可以在以下位置查看我的视频:
https://www.youtube.com/watch?v=x8O-qYQvP4M
(Amiga部分从10:07开始)
谢谢你的帮助。
发布于 2019-12-26 15:39:01
这不是一个确切的答案,但揭示了这个问题相当复杂(比gcc的简单bug更复杂)。以下是信息:
如果我使用68040的内部FPU将Amiga仿真器设置为模拟68020或68030和68881或68882而不是68040,它不会生成1.:00000 (换句话说,它可以工作)。因此,这可能意味着模拟器无法正确模拟68040的FPU (尽管我认为68040的FPU可能与68881/68882兼容)。(不知道将仿真器设置为68020/30 68881/2是否会影响性能(我将仿真器设置为在主机上尽可能快地运行,而不是以680xx的速度运行))。
但是,如果我使用Amiga的gcc的-noixemul选项进行编译,代码在所有CPU和FPU的组合中都能正常工作。因此,这表明这是Amiga版本的gcc (实际上是试图在Amiga上模拟UNIX的gcc系统的一部分(这就是ixemul.library所做的))的问题。因此,这可能不是gcc的错(如果它是在其他使用68040的系统上编译的,它可能会工作),而是把gcc移植到Amiga的人的错。
所以,你可能会说“问题解决了,用-noixemul就行了”--嗯,别那么快……虽然简单的测试程序不会崩溃,但我的暴露这个问题的大程序只有在使用-noixemul编译时才会在程序退出时崩溃(可恢复的大师冥想)(可能它试图关闭一个从未打开过的库,我不知道)。这就是为什么我没有使用-noixemul,尽管我想这样做。
所以,它还没有完全解决,但我想说它不太可能是一个非Amiga的gcc bug。
https://stackoverflow.com/questions/59384338
复制相似问题