ZHCU876Z July 2001 – October 2023 SM320F28335-EP
这些内在函数使用 32 位 (FPU32) 和 64 位 (FPU64) 硬件进行更快的浮点计算。如果 --float_support 编译器选项分别设为 fpu32 或 fpu64,则会启用这些内在函数。
如果您使用 COFF ABI,作为 float 型列出的参数和返回值也可以使用 double 型,因为两者都是 32 位类型。支持 FPU32 内在函数,但如果您使用的是 COFF ABI,则不不 支持 FPU64 内在函数。如果您在使用 COFF 时使用采用 long double 的 FPU64 内在函数,则会发生错误。
如果使用 EABI,则 float 类型为 32 位,double 类型为 64 位。如果启用了 FPU32,请仅使用 FPU32 版本。通常,如果启用了 FPU64,您可以同时使用 FPU32 和 FPU64 内在函数。但是,在 EABI 模式下使用 FPU64 时,没有交换两个 32 位 float 值的指令。在 FPU32 硬件上,SWAPF 汇编指令仅适用于 32 位 float 值,并且 __swapf 和 __swapff 内在函数是等效的。在 FPU64 硬件上,SWAPF 指令仅支持 64 位 double 值;支持 __swapf 内在函数,但 __swapff 内在函数会导致错误。
有关将 float 值和 double 值重新解释为寄存器(反之亦然)的内在函数的信息,请参阅节 7.6.1。
FPU 版本 | 内在函数 | 汇编指令 | 说明 |
---|---|---|---|
FPU32 | float __einvf32( float x); | EINVF32x | 计算并返回 1/x(精度约为 8 位)。 |
FPU64 | double __einvf64( double x); | EINVF64 x | 计算并返回 1/x(精度约为 8 位)。 |
FPU32 | float __eisqrtf32( float x); | EISQRTF32x | 求 1/x 的平方根(精度约为 8 位)。 |
FPU64 | double __eisqrtf64( double x); | EISQRTF64 x | 求 1/x 的平方根(精度约为 8 位)。 |
FPU32 | void __f32_max_idx( float &dst, float src, float &idx_dst, float idx_src ); | MAXF32dst, src || MOV32 idx_dst, idx_src | If src>dst, copy src to dst, and copy idx_src to idx_dst. |
FPU64 | void __f64_max_idx( double &dst, double src, double &idx_dst, double idx_src ); | MAXF64 dst, src || MOV64 idx_dst, idx_src | If src>dst, copy src to dst, and copy idx_src to idx_dst. |
FPU32 | void __f32_min_idx( float &dst, float src, float &idx_dst, float idx_src ); | MINF32dst, src || MOV32 idx_dst, idx_src | If src<dst, copy src to dst, and copy idx_src to idx_dst. |
FPU64 | void __f64_min_idx( double &dst, double src, double &idx_dst, double idx_src ); | MINF64 dst, src || MOV64 idx_dst, idx_src | If src<dst, copy src to dst, and copy idx_src to idx_dst. |
FPU32 | int __f32toi16r(float src); | F32TOI16R dst, src | 将 float 转换为 int 并进行舍入。 |
FPU32 | unsigned int __f32toui16r(float src); | F32TOUI16R dst, src | 将 float 转换为无符号 int 并进行舍入。 |
FPU32 | float __fmax( float x, float y ); (1) | MAXF32y, x | 如果 x>y,将 x 复制到 y。 |
FPU32 | float __fmin( float x, float y ); (1) | MINF32y, x | 如果 x<y,将 x 复制到 y。 |
FPU32 | float __fracf32(float src); | FRACF32 dst, src | 返回 src 的分数部分。 |
FPU64 | double __fracf64(double src); | FRACF64 dst, src | 返回 src 的分数部分。 |
FPU32 | float __fsat(float val, float max, float min ); | MAXF32dst, min MINF32 dst, max | 如果 min < val < max,则返回 val。如果 val < min,则返回 min。如果 val > max,则返回 max。在 max < min 的情况下调用 __fsat 会产生未定义的行为。 |
FPU32(仅限该器件) | void __swapff( float &a, float &b ); | SWAPFa, b | 交换 a 和 b 的内容。 |
FPU32(仅限该器件) | void __swapf( float &a, float &b ); | SWAPFa, b | 交换 a 和 b 的内容。 |
FPU64 | void __swapf( double &a, double &b ); | SWAPF a, b | 交换 a 和 b 的内容。 |