源码路径
llvm\include\llvm\IR\Instruction.h
llvm\include\llvm\IR\Instruction.def
llvm\include\llvm\IR\Instructions.h
llvm\include\llvm\IR\InstrTypes.h
Cast Operators
TruncInst(父类:CastInst)
trunc指令将操作数截断为另一个类型。
语法
<result> = trunc <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为整型或者整型矢量。
ty2:value截断后的类型,位宽必须小于ty。
语义
trunc指令截断value的高位,保留剩余的bit并转换为ty2。
示例
%X = trunc i32 257 to i8 ; yields i8:1
%Y = trunc i32 123 to i1 ; yields i1:true
%Z = trunc i32 122 to i1 ; yields i1:false
%W = trunc <2 x i16> <i16 8, i16 7> to <2 x i8> ; yields <i8 8, i8 7>
ZExtInst(父类:CastInst)
zext指令用0填充操作数扩展为另一个类型。
语法
<result> = zext <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为整型或者整型矢量。
ty2:value扩展后的类型,位宽必须大于ty。
语义
zext指令用0扩展value的高位直到位宽等于ty2的位宽。
示例
%X = zext i32 257 to i64 ; yields i64:257
%Y = zext i1 true to i32 ; yields i32:1
%Z = zext <2 x i16> <i16 8, i16 7> to <2 x i32> ; yields <i32 8, i32 7>
SExtInst(父类:CastInst)
sext指令用符号位扩展操作数为另一个类型。
语法
<result> = sext <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为整型或者整型矢量。
ty2:value扩展后的类型,位宽必须大于ty。
语义
sext指令用符号位填充value的高位直到位宽等于ty2的位宽。
示例
%X = sext i8 -1 to i16 ; yields i16 :65535
%Y = sext i1 true to i32 ; yields i32:-1
%Z = sext <2 x i16> <i16 8, i16 7> to <2 x i32> ; yields <i32 8, i32 7>
FPToUIInst(父类:CastInst)
fptoui指令将一个浮点数转换为无符号整数。
语法
<result> = fptoui <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为浮点或者浮点矢量。
ty2:value转换后的类型,必须为整型或整型矢量。
语义
fptoui指令将浮点数向0取整为最接近的无符号整数,如果转换后的值超过了ty2的范围,则result为Poison Value。
示例
%X = fptoui double 123.0 to i32 ; yields i32:123
%Y = fptoui float 1.0E+300 to i1 ; yields undefined:1
%Z = fptoui float 1.04E+17 to i8 ; yields undefined:1
FPToSIInst(父类:CastInst)
fptosi指令将浮点数转换为有符号整型。
语法
<result> = fptosi <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为浮点或者浮点矢量。
ty2:value转换后的类型,必须为整型或整型矢量。
语义
fptosi指令将浮点数向0取整为最接近的有符号整数,如果转换后的值超过了ty2的范围,则result为Poison Value。
示例
%X = fptosi double -123.0 to i32 ; yields i32:-123
%Y = fptosi float 1.0E-247 to i1 ; yields undefined:1
%Z = fptosi float 1.04E+17 to i8 ; yields undefined:1
UIToFPInst(父类:CastInst)
uitofp指令将无符号整数转换为浮点类型。
语法
<result> = uitofp <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为整型或整型矢量。
ty2:value转换后的类型,必须为浮点或者浮点矢量。
语义
uitofp
指令将无符号整数转换为浮点类型,如果值不能被精确转换,则采用默认的取整模式进行取整。
示例
%X = uitofp i32 257 to float ; yields float:257.0
%Y = uitofp i8 -1 to double ; yields double:255.0
SIToFPInst(父类:CastInst)
sitofp指令将有符号整数转换为浮点类型。
语法
<result> = sitofp <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为整型或整型矢量。
ty2:value转换后的类型,必须为浮点或者浮点矢量。
语义
sitofp
指令将有符号整数转换为浮点类型,如果值不能被精确转换,则采用默认的取整模式进行取整。
示例
%X = sitofp i32 257 to float ; yields float:257.0
%Y = sitofp i8 -1 to double ; yields double:-1.0
FPTruncInst(父类:CastInst)
fptrunc指令将
操作数截断为另一个类型。
语法
<result> = fptrunc <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为浮点类型。
ty2:value转换后的类型,必须为浮点类型且位宽小于ty。
语义
fptrunc指令将浮点数截断为一个更小的浮点类型。
示例
%X = fptrunc double 16777217.0 to float ; yields float:16777216.0
%Y = fptrunc double 1.0E+300 to half ; yields half:+infinity
FPExtInst(父类:CastInst)
fpext指令扩展操作数为另一个浮点类型。
语法
<result> = fpext <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为浮点类型。
ty2:value转换后的类型,必须为浮点类型且位宽大于ty。
语义
fpext指令将浮点数扩展为一个更大的浮点类型。
示例
%X = fpext float 3.125 to double ; yields double:3.125000e+00
%Y = fpext double %X to fp128 ; yields fp128:0xL00000000000000004000900000000000
PtrToIntInst(父类:CastInst)
ptrtoint指令将指针或者指针矢量转换为整型。
语法
<result> = ptrtoint <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型,必须为指针类型或者指针矢量类型。
ty2:value转换后的类型,必须为整型或者整型矢量。
语义
ptrtoint指令将指针通过截断或者填0扩展的方式转换为整型。
示例
%X = ptrtoint i32* %P to i8 ; yields truncation on 32-bit architecture
%Y = ptrtoint i32* %P to i64 ; yields zero extension on 32-bit architecture
%Z = ptrtoint <4 x i32*> %P to <4 x i64>; yields vector zero extension for a vector of addresses on 32-bit architecture
IntToPtrInst(父类:CastInst)
inttoptr指令将整型转换为指针类型。
语法
<result> = inttoptr <ty> <value> to <ty2>[, !dereferenceable !<deref_bytes_node>][, !dereferenceable_or_null !<deref_bytes_node>] ; yields ty2
参数说明:
ty:value原始类型,必须为整型或者整型矢量。
ty2:value转换后的类型,必须为指针类型或者指针矢量类型。
!dereferenceable<deref_bytes_node>(可选):转换后的
值是可以被解引用的,解引用的长度由deref_bytes_node对应的元数据指定。
!dereferenceable_or_null<deref_bytes_node>(可选):转换后的
值要么为null,要么是可以被解引用的,解引用的长度由deref_bytes_node对应的元数据指定。
语义
inttoptr指令将整型通过填0扩展或者截断转换为指针。
示例
%X = inttoptr i32 255 to i32* ; yields zero extension on 64-bit architecture
%Y = inttoptr i32 255 to i32* ; yields no-op on 32-bit architecture
%Z = inttoptr i64 0 to i32* ; yields truncation on 32-bit architecture
%Z = inttoptr <4 x i32> %G to <4 x i8*>; yields truncation of vector G to four pointers
BitCastInst(父类:CastInst)
bitcast指令将操作数转换为另一个类型,不改变操作数的值。
语法
<result> = bitcast <ty> <value> to <ty2> ; yields ty2
参数说明:
ty:value原始类型。
ty2:value转换后的类型,位宽必须和ty相同。
语义
bitcast指令将操作数转换为另一个类型,不改变操作数的值。
如果是指针间的类型转换,要求指针处于相同的地址空间(
address space)。
如果是矢量类型的转换,需要注意转换的结果可能和大小端相关。
示例
%X = bitcast i8 255 to i8 ; yields i8 :-1 %Y = bitcast i32* %x to i16* ; yields i16*:%x %Z = bitcast <2 x i32> %V to i64; ; yields i64: %V (depends on endianess) %Z = bitcast <2 x i32*> %V to <2 x i64*> ; yields <2 x i64*>
AddrSpaceCastInst(父类:CastInst)
addrspacecast指令转换指针操作数的地址空间和类型。
语法
<result> = addrspacecast <pty> <ptrval> to <pty2> ; yields pty2
参数说明:
pty:value原始类型,必须是指针或者指针矢量。
pty2:value转换后的类型,必须是指针或者指针矢量,且和pty必须属于不同的地址空间。
语义
addrspacecast指令转换指针操作数的地址空间和类型。如果转换成功,则操作数和result引用同一个内存位置。
示例
%X = addrspacecast i32* %x to i32 addrspace(1)* ; yields i32 addrspace(1)*:%x
%Y = addrspacecast i32 addrspace(1)* %y to i64 addrspace(2)* ; yields i64 addrspace(2)*:%y
%Z = addrspacecast <4 x i32*> %z to <4 x float addrspace(3)*> ; yields <4 x float addrspace(3)*>:%z