fatal error: error in backend: Cannot select: xxx: v4i32 =any_extend xxx[ID=126]
xxx: v4i16
解决步骤:
在 sourceinsight R里搜索 any_extend或者缩小搜索范围,在ISDOpcodes.h里搜索:
根据注释说明得到 了解这个any_extend是什么意思:
/// ANY_EXTEND - Used for integer types. The high bits are undefined.
接着在 TargetSelectionDAG.td 找到 DAG:
def
anyext : SDNode<"ISD::ANY_EXTEND" , SDTIntExtendOp>;
节点 anytxt 对应 指令 ISD::ANY_EXTEND.
节点 anytxt 对应 指令 ISD::ANY_EXTEND.
现在是逆向通过 指令错误找到了,节点名称 是anyext。
下步是对该节点做处理,以通过。
我们知道,该指令是意思是int的扩展,
那么为什么没有select成功?是因为跟 目标平台 机器指令对不上。
那么我们看看目标平台实现对应功能的机器指令有没有,有的话是哪一个机器指令:
这需要 对应目标平台支持指令的spec文档:
pack 是 打包 对应 压缩类型
unpack是 对应 扩展。
[
unpack high 扩展高位 如 0x1000 -> 0x
00001000
实现细节:如是大端机器(arm), 对应把 寄存器低位 置0.
数据高位<=> 寄存器低位
]可能是错的。
key 1411
unpack u low => 对应 (type) 强制类型转,如 把 short 强制转成 int
结束时,pack low 也对应强制类型转换成 小的类型。
接下来,在td文件里,把对应的set 写上 set xxx anyext 。。。xxx