Conversions (GNU Compiler Collection (GCC) Internals) (original) (raw)


13.13 Conversions

All conversions between machine modes must be represented by explicit conversion operations. For example, an expression which is the sum of a byte and a full word cannot be written as(plus:SI (reg:QI 34) (reg:SI 80)) because the plusoperation requires two operands of the same machine mode. Therefore, the byte-sized operand is enclosed in a conversion operation, as in

(plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))

The conversion operation is not a mere placeholder, because there may be more than one way of converting from a given starting mode to the desired final mode. The conversion operation code says how to do it.

For all conversion operations, x must not be VOIDmodebecause the mode in which to do the conversion would not be known. The conversion must either be done at compile-time or xmust be placed into a register.

(sign_extend:m x)

Represents the result of sign-extending the value xto machine mode m. m must be a fixed-point mode and x a fixed-point value of a mode narrower than m.

(zero_extend:m x)

Represents the result of zero-extending the value xto machine mode m. m must be a fixed-point mode and x a fixed-point value of a mode narrower than m.

(float_extend:m x)

Represents the result of extending the value xto machine mode m. m must be a floating point mode and x a floating point value of a mode narrower than m.

(truncate:m x)

Represents the result of truncating the value xto machine mode m. m must be a fixed-point mode and x a fixed-point value of a mode wider than m.

(ss_truncate:m x)

Represents the result of truncating the value xto machine mode m, using signed saturation in the case of overflow. Both m and the mode of x must be fixed-point modes.

(us_truncate:m x)

Represents the result of truncating the value xto machine mode m, using unsigned saturation in the case of overflow. Both m and the mode of x must be fixed-point modes.

(float_truncate:m x)

Represents the result of truncating the value xto machine mode m. m must be a floating point mode and x a floating point value of a mode wider than m.

(float:m x)

Represents the result of converting fixed point value x, regarded as signed, to floating point mode m.

(unsigned_float:m x)

Represents the result of converting fixed point value x, regarded as unsigned, to floating point mode m.

(fix:m x)

When m is a floating-point mode, represents the result of converting floating point value x (valid for mode m) to an integer, still represented in floating point mode m, by rounding towards zero.

When m is a fixed-point mode, represents the result of converting floating point value x to mode m, regarded as signed. How rounding is done is not specified, so this operation may be used validly in compiling C code only for integer-valued operands.

(unsigned_fix:m x)

Represents the result of converting floating point value x to fixed point mode m, regarded as unsigned. How rounding is done is not specified.

(fract_convert:m x)

Represents the result of converting fixed-point value x to fixed-point mode m, signed integer value x to fixed-point mode m, floating-point value x to fixed-point mode m, fixed-point value x to integer mode mregarded as signed, or fixed-point value x to floating-point mode m. When overflows or underflows happen, the results are undefined.

(sat_fract:m x)

Represents the result of converting fixed-point value x to fixed-point mode m, signed integer value x to fixed-point mode m, or floating-point value x to fixed-point mode m. When overflows or underflows happen, the results are saturated to the maximum or the minimum.

(unsigned_fract_convert:m x)

Represents the result of converting fixed-point value x to integer mode m regarded as unsigned, or unsigned integer value x to fixed-point mode m. When overflows or underflows happen, the results are undefined.

(unsigned_sat_fract:m x)

Represents the result of converting unsigned integer value x to fixed-point mode m. When overflows or underflows happen, the results are saturated to the maximum or the minimum.