【发布时间】:2020-09-26 19:21:58
【问题描述】:
我正在 32 位 PowerPC 系统(特别是 GameCube)上编写程序集。我有一个 64 位整数,需要将其转换为浮点数。我怎样才能做到这一点?我在网上找到的例子都涉及到fcfid指令的使用,但这仅适用于64位系统。
目前的代码是:
CALL __OSGetSystemTime # -> u64 ticks in r3, r4
stw r3, SP_FLOAT_TMP(r1)
stw r4, (SP_FLOAT_TMP+4)(r1)
lfd f1, SP_FLOAT_TMP(r1)
fcfid f1 # u64 -> double
frsp f1 # double -> float
(CALL 是一个与位置无关的宏bl)
GNU 汇编器给出一个错误:
Error building debugprint debugprint.s: Assembler messages:
debugprint.s:345: Error: unrecognized opcode: `fcfid'
【问题讨论】:
-
相关:x86 SIMD 同样只能对 32 位 int 进行打包 FP 转换,而不是 64。How to efficiently perform double/int64 conversions with SSE/AVX? 显示 FP 位模式黑客可以有效地完成有限范围输入的工作(+- 2^51) 具有按位运算和加法或减法。此外,编译器通常知道如何执行此操作,您通常可以检查 GCC 或 clang 输出,尤其是当它们内联辅助函数时。
-
clang 和 clang 只是调用一个辅助函数,
__floatdisfgodbolt.org/z/e6s1ax。但是你可以在 libgcc 源代码中查看它的实现。 (但就像我说的,如果您不需要全范围输入,则可以使用更有效的方式。)
标签: assembly floating-point powerpc