llvm libLLVMCore源码分析 09 - Cast Operators

源码路径

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN IT狂飙上传的代码均可运行,功能ok的情况下才上传的,直接替换数据即可使用,小白也能轻松上手 【资源说明】 基于MATLAB实现的有限差分法实验报告用MATLAB中的有限差分法计算槽内电位;对比解析法和数值法的异同点;选取一点,绘制收敛曲线;总的三维电位图+使用说明文档 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2020b;若运行有误,根据提示GPT修改;若不会,私信博主(问题描述要详细); 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可后台私信博主; 4.1 期刊或参考文献复现 4.2 Matlab程序定制 4.3 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 5、欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值