对 节点:v4f32 sint_to_fp v4i16 select的支持
(去掉xxx,xxx for anquaxieyi)
方法一:
//def:Pat<(v4f32 (sintxxx_to_fp (v4i16 XDRegs:$src))),
// (vitof32xxx_s32_xqn_xqn (vlunpk_s16l_xqn_xdn XDRegs:$src))>;//byzlg
方法二:(最好)
def : Pat<(v4f32 (sint_to_fp (v4i16 XDRegs:$src3))),
(vlitof32xxx_s16_xqn_xqn(INSERT_SUBREG(v4i32 (IMPLICIT_DEF)), XDRegs:$src3, xq_sub_odd))>;
或: (vlitof32xxx_s16_xqn_xqn(INSERT_SUBREG(v8i16 (IMPLICIT_DEF)), XDRegs:$src3, xq_sub_odd))>; //实际指令实现是,操作的 i16,只不过,只取了v8的一半。
结果diff:
diff xxx_s16.s xxx_s16.s_zyk
43,45c43,44
< ldp xd0,(r0)
< vlunpkxxx.s16l xq0,xd0
< vitof32xxx.s32 xq0,xq0
---
> ldp xd1,(r0)
> vlitof32xxx.s16 xq0,xq0
可以看出,上面的方法一 比方法二的汇编多了一条指令。