Next: , Previous: Debugging Info, Up: Target Macros


17.23 交叉编译和浮点

虽然所有现代机器都使用二进制补码来表示整数,但对于浮点数却有不同的表示。 这意味着在交叉编译器中, 被编译的程序中的浮点数的表示可能与执行编译的机器上的表示不相同。

因为不同的表示方式可能会提供不同的取值范围和精度, 所以所有的浮点常量必须被表示成target机器的格式。 因此,交叉编译器不能使用host机器的浮点算术;其必须模拟target的算术运算。 为了确保一致性,GCC总是使用模拟方式来处理浮点值, 即使host和target的浮点格式相同。

下列宏由real.h提供给编译器使用。 编译器的生成或者优化浮点计算的所有部分必须使用这些宏。 它们可能会计算操作数多次,所以操作数一定不要有副作用。

— Macro: REAL_VALUE_TYPE

C数据类型,用于存放target机器格式的浮点值。 通常为一个包含HOST_WIDE_INT型数组的结构体, 但是所有的代码应该将其作为不透明的量。

— Macro: int REAL_VALUES_EQUAL (REAL_VALUE_TYPE x, REAL_VALUE_TYPE y)

比较两个值是否相等,xy。如果target浮点格式支持负0和/或NaN, 则‘REAL_VALUES_EQUAL (-0.0, 0.0)’ 为真, ‘REAL_VALUES_EQUAL (NaN, NaN)’为假。

— Macro: int REAL_VALUES_LESS (REAL_VALUE_TYPE x, REAL_VALUE_TYPE y)

测试x是否小于y

— Macro: HOST_WIDE_INT REAL_VALUE_FIX (REAL_VALUE_TYPE x)

x截取为有符号整数,向0舍入。

— Macro: unsigned HOST_WIDE_INT REAL_VALUE_UNSIGNED_FIX (REAL_VALUE_TYPE x)

x截取为无符号整数,向0舍入。如果x为负,则返回0。

— Macro: REAL_VALUE_TYPE REAL_VALUE_ATOF (const char *string, enum machine_mode mode)

string转换为target机器模式mode所表示的浮点数。 该程序可以处理十进制和十六进制的浮点常量,使用C语言定义的语法。

— Macro: int REAL_VALUE_NEGATIVE (REAL_VALUE_TYPE x)

如果x为负数(包括负零),返回1,否则0。

— Macro: int REAL_VALUE_ISINF (REAL_VALUE_TYPE x)

确定x是否表示无穷(正的或负的)。

— Macro: int REAL_VALUE_ISNAN (REAL_VALUE_TYPE x)

确定x是否表示“NaN” (not-a-number)。

— Macro: void REAL_ARITHMETIC (REAL_VALUE_TYPE output, enum tree_code code, REAL_VALUE_TYPE x, REAL_VALUE_TYPE y)

计算一个算术运算对浮点值xy,将结果存到output(其必须为一个变量)中。

要执行的运算由code指定。只有下列代码被支持:PLUS_EXPR, MINUS_EXPR, MULT_EXPR, RDIV_EXPR, MAX_EXPR, MIN_EXPR

如果REAL_ARITHMETIC被要求计算除0,并且target的浮点格式不能表示无穷,则会调用abort。调用者应该首先检查这种情况,使用MODE_HAS_INFINITIES。参见Storage Layout

— Macro: REAL_VALUE_TYPE REAL_VALUE_NEGATE (REAL_VALUE_TYPE x)

返回浮点值x的负数。

— Macro: REAL_VALUE_TYPE REAL_VALUE_ABS (REAL_VALUE_TYPE x)

返回x的绝对值。

— Macro: REAL_VALUE_TYPE REAL_VALUE_TRUNCATE (REAL_VALUE_TYPE mode, enum machine_mode x)

将浮点值x截取为适合mode。返回值仍然是REAL_VALUE_TYPE,但是具有一个合适的位模式,其精度根据模式mode来输出浮点常量。

— Macro: void REAL_VALUE_TO_INT (HOST_WIDE_INT low, HOST_WIDE_INT high, REAL_VALUE_TYPE x)

转换浮点值x为双精度整数,存储到lowhigh中。如果值不是整形的,则进行截取。

— Macro: void REAL_VALUE_FROM_INT (REAL_VALUE_TYPE x, HOST_WIDE_INT low, HOST_WIDE_INT high, enum machine_mode mode)

转换在lowhigh中的一个双精度整数为浮点值,其被存储在x中。值被截取以适合机器模式mode