将MIPS代码移植到x86_64时的浮点差异

时间:2018-03-07 22:24:10

标签: c++ gcc double mips

我目前正致力于将使用MIPSPro为SGI编写和编译的代码移植到带有gcc 4.4.7的RHEL 6.7。我的目标架构是x86_64我能够为此代码生成可执行文件,现在我正在尝试运行它。

我正在尝试从文件读取二进制数据,这个文件是在SGI系统中生成的,基本上是将对象的指针转换为char*并将其保存到文件中。我试图阅读的二进制数据或多或少有这种格式:

[ Header, Object A , Object B, ..., Object N ]

每个对象都是不同类的实例。

代码当前处理文件的方式是将其全部读入内存,并将指针指向对象的起始位置并使用reinterpret_class<Class A>(pointer)。有些东西告诉我原创设计的人并不关心可移植性。

到目前为止,我只能通过交换字节来处理Header对象的字节顺序。不幸的是,对象A,B,..,N都包含double类型的字段,并且尝试对8字节进行字节交换似乎不起作用。

我的问题是,SGI / MIPSPro中的双打是否与Linux中的结构不同?我知道SGI机器中的sizeof(double)返回8所以我认为它们的大小相同。

1 个答案:

答案 0 :(得分:2)

根据the MIPSPro ABI

  

MIPS处理器符合IEEE 754浮点标准

您的目标平台x86_64, shares this quality

因此,double表示两个平台上的IEEE-754双精度浮点数。

当谈到字节序时,x86_64处理器是小端的;但是,根据the MIPSpro assembly programmers' guide一些 MIPSPro处理器是big-endian:

  

对于R4000及更早版本的系统,字节排序可配置为big-endian或little-endian字节排序(在硬件复位期间进行配置)。当配置为big-endian系统时,字节0始终是最重要(最左边)的字节。当配置为little-endian系统时,字节0始终是最不重要的(最右边的字节)。

     

目前,R8000 CPU仅支持big-endian

因此,您必须检查原始平台的数据表,看看是否需要进行任何字节交换。