Next: , Previous: Vector Operations, Up: RTL


10.13 转换

所有机器模式之间的转换都必须使用显示的转换符来表示。例如,一个表示字节和全字之和的表达式就不能写成(plus:SI (reg:QI 34) (reg:SI 80)),因为plus操作符需要两个具有相同机器模式的操作符。因此,字节长度的操作数被封装在一个转换操作中,如

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

转换符并不仅仅是一个形式上的占位符,因为可能会有多种方式将给出的最初模式转换为期望的最终模式。转换符指出了如何进行这种操作。

对于所有的转换操作,x不能为VOIDmode,因为这样就无法知道如何进行转换操作。转换必须在编译时进行或者x必须被放入寄存器中。

(sign_extend:m x)
表示将x的值符号扩展为机器模式m后的结果。m必须是一个定点模式,并且x是一个比m模式窄的定点值。


(zero_extend:m x)
表示将x的值零扩展为机器模式m后的结果。m必须是一个定点模式,并且x是一个比m模式窄的定点值。


(float_extend:m x)
表示将x的值扩展为机器模式m后的结果。m必须是一个浮点模式,并且x是一个比m模式窄的浮点值。


(truncate:m x)
表示将x的值截短为机器模式m后的结果。m必须是一个定点模式,并且x是一个比m模式宽的定点值。


(ss_truncate:m x)
表示将x的值截短为机器模式m后的结果,并且在溢出时作为有符号数处理。mx的模式都必须是定点模式。


(us_truncate:m x)
表示将x的值截短为机器模式m后的结果,并且在溢出时作为无符号数处理。mx的模式都必须是定点模式。


(float_truncate:m x)
表示将x的值截短为机器模式m后的结果。m必须是一个浮定点模式,并且x是一个比m模式宽的浮点值。


(float:m x)
表示将定点值x转换为有符号的浮点模式m后的结果。


(unsigned_float:m x)
表示将定点值x转换为无符号的浮点模式m后的结果。


(fix:m x)
m是一个浮点模式时,表示将浮点值x(对模式m有效)转换为整形,仍然使用浮点模式m表示,只不过是向零方向进行舍入。

m是一个定点模式时,表示将浮点值x转换为有符号的模式m的结果。具体如何舍入没有做出规定。所以,这个操作可能只是被用在编译C代码时的整数值的操作数。


(unsigned_fix:m x)
表示将浮点值x转换为无符号的定点模式m。具体如何舍入没有做出规定。


(fract_convert:m x)
表示将定点值转换成定点机器模式m,将有符号整数值x转换成定点机器模式m,将浮点值x转换成定点机器模式m,将定点值x转换成有符号整数机器模式m,或者将浮点值x转换成浮点机器模式的结果。当发生溢出或者下溢,则结果未定义。


(sat_fract:m x)
表示将定点值x转换为浮点模式m,将有符号整数值x转换为定点模式m,或者将浮点值x转换为定点模式m的结果。当发生溢出或者下溢,则结果被饱和为最大值或者最小值。


(unsigned_fract_convert:m x)
表示将定点值x转换为无符号整数模式m,或者将无符号整数值x转换为定点模式m的结果。当发生溢出或者下溢,则结果未定义。


(unsigned_sat_fract:m x)
表示将无符号整数值x转换为定点模式m的结果。当发生溢出或者下溢,则结果被饱和为最大值或者最小值。