19.12 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 plus
operation 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 VOIDmode
because the mode in which to do the conversion would not be known.
The conversion must either be done at compile-time or x
must be placed into a register.
(sign_extend:m x)
- Represents the result of sign-extending the value x
to 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 x
to 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 x
to 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 x
to 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 x
to 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 x
to 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 x
to 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 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.
(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.
This document was generated
by Vincent Chung on June, 26 2001
using texi2html