[machinst x64]: add extractlane implementation
This commit is contained in:
@@ -788,8 +788,6 @@ impl Inst {
|
||||
imm: u8,
|
||||
w: bool,
|
||||
) -> Inst {
|
||||
debug_assert!(dst.to_reg().get_class() == RegClass::V128);
|
||||
debug_assert!(imm < 8);
|
||||
Inst::XmmRmRImm {
|
||||
op,
|
||||
src,
|
||||
@@ -1736,10 +1734,17 @@ fn x64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
|
||||
collector.add_mod(*dst);
|
||||
}
|
||||
}
|
||||
Inst::XmmRmRImm { src, dst, .. } => {
|
||||
Inst::XmmRmRImm { op, src, dst, .. } => {
|
||||
if inst.produces_const() {
|
||||
// No need to account for src, since src == dst.
|
||||
collector.add_def(*dst);
|
||||
} else if *op == SseOpcode::Pextrb
|
||||
|| *op == SseOpcode::Pextrw
|
||||
|| *op == SseOpcode::Pextrd
|
||||
|| *op == SseOpcode::Pshufd
|
||||
{
|
||||
src.get_regs_as_uses(collector);
|
||||
collector.add_def(*dst);
|
||||
} else {
|
||||
src.get_regs_as_uses(collector);
|
||||
collector.add_mod(*dst);
|
||||
@@ -2038,6 +2043,7 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
map_def(mapper, dst);
|
||||
}
|
||||
Inst::XmmRmRImm {
|
||||
ref op,
|
||||
ref mut src,
|
||||
ref mut dst,
|
||||
..
|
||||
@@ -2045,6 +2051,13 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
|
||||
if produces_const {
|
||||
src.map_as_def(mapper);
|
||||
map_def(mapper, dst);
|
||||
} else if *op == SseOpcode::Pextrb
|
||||
|| *op == SseOpcode::Pextrw
|
||||
|| *op == SseOpcode::Pextrd
|
||||
|| *op == SseOpcode::Pshufd
|
||||
{
|
||||
src.map_uses(mapper);
|
||||
map_def(mapper, dst);
|
||||
} else {
|
||||
src.map_uses(mapper);
|
||||
map_mod(mapper, dst);
|
||||
|
||||
Reference in New Issue
Block a user