machinst x64: add packed moves for different vector types

This commit is contained in:
Andrew Brown
2020-08-04 14:19:45 -07:00
parent debacec1c5
commit cf598dc35b
2 changed files with 15 additions and 3 deletions

View File

@@ -380,6 +380,8 @@ pub enum SseOpcode {
Movaps, Movaps,
Movapd, Movapd,
Movd, Movd,
Movdqa,
Movdqu,
Movq, Movq,
Movss, Movss,
Movsd, Movsd,
@@ -487,6 +489,8 @@ impl SseOpcode {
| SseOpcode::Movq | SseOpcode::Movq
| SseOpcode::Movsd | SseOpcode::Movsd
| SseOpcode::Movupd | SseOpcode::Movupd
| SseOpcode::Movdqa
| SseOpcode::Movdqu
| SseOpcode::Mulpd | SseOpcode::Mulpd
| SseOpcode::Mulsd | SseOpcode::Mulsd
| SseOpcode::Orpd | SseOpcode::Orpd
@@ -571,6 +575,8 @@ impl fmt::Debug for SseOpcode {
SseOpcode::Movaps => "movaps", SseOpcode::Movaps => "movaps",
SseOpcode::Movapd => "movapd", SseOpcode::Movapd => "movapd",
SseOpcode::Movd => "movd", SseOpcode::Movd => "movd",
SseOpcode::Movdqa => "movdqa",
SseOpcode::Movdqu => "movdqu",
SseOpcode::Movq => "movq", SseOpcode::Movq => "movq",
SseOpcode::Movss => "movss", SseOpcode::Movss => "movss",
SseOpcode::Movsd => "movsd", SseOpcode::Movsd => "movsd",

View File

@@ -1596,8 +1596,12 @@ pub(crate) fn emit(
let rex = RexFlags::clear_w(); let rex = RexFlags::clear_w();
let (prefix, opcode) = match op { let (prefix, opcode) = match op {
SseOpcode::Cvtss2sd => (LegacyPrefix::_F3, 0x0F5A),
SseOpcode::Cvtsd2ss => (LegacyPrefix::_F2, 0x0F5A),
SseOpcode::Movaps => (LegacyPrefix::None, 0x0F28), SseOpcode::Movaps => (LegacyPrefix::None, 0x0F28),
SseOpcode::Movapd => (LegacyPrefix::_66, 0x0F28), SseOpcode::Movapd => (LegacyPrefix::_66, 0x0F28),
SseOpcode::Movdqa => (LegacyPrefix::_66, 0x0F6F),
SseOpcode::Movdqu => (LegacyPrefix::_F3, 0x0F6F),
SseOpcode::Movsd => (LegacyPrefix::_F2, 0x0F10), SseOpcode::Movsd => (LegacyPrefix::_F2, 0x0F10),
SseOpcode::Movss => (LegacyPrefix::_F3, 0x0F10), SseOpcode::Movss => (LegacyPrefix::_F3, 0x0F10),
SseOpcode::Movups => (LegacyPrefix::None, 0x0F10), SseOpcode::Movups => (LegacyPrefix::None, 0x0F10),
@@ -1606,8 +1610,6 @@ pub(crate) fn emit(
SseOpcode::Sqrtpd => (LegacyPrefix::_66, 0x0F51), SseOpcode::Sqrtpd => (LegacyPrefix::_66, 0x0F51),
SseOpcode::Sqrtss => (LegacyPrefix::_F3, 0x0F51), SseOpcode::Sqrtss => (LegacyPrefix::_F3, 0x0F51),
SseOpcode::Sqrtsd => (LegacyPrefix::_F2, 0x0F51), SseOpcode::Sqrtsd => (LegacyPrefix::_F2, 0x0F51),
SseOpcode::Cvtss2sd => (LegacyPrefix::_F3, 0x0F5A),
SseOpcode::Cvtsd2ss => (LegacyPrefix::_F2, 0x0F5A),
_ => unimplemented!("Opcode {:?} not implemented", op), _ => unimplemented!("Opcode {:?} not implemented", op),
}; };
@@ -1839,10 +1841,14 @@ pub(crate) fn emit(
srcloc, srcloc,
} => { } => {
let (prefix, opcode) = match op { let (prefix, opcode) = match op {
SseOpcode::Movaps => (LegacyPrefix::None, 0x0F29),
SseOpcode::Movapd => (LegacyPrefix::_66, 0x0F29),
SseOpcode::Movdqa => (LegacyPrefix::_66, 0x0F7F),
SseOpcode::Movdqu => (LegacyPrefix::_F3, 0x0F7F),
SseOpcode::Movss => (LegacyPrefix::_F3, 0x0F11), SseOpcode::Movss => (LegacyPrefix::_F3, 0x0F11),
SseOpcode::Movsd => (LegacyPrefix::_F2, 0x0F11), SseOpcode::Movsd => (LegacyPrefix::_F2, 0x0F11),
SseOpcode::Movaps => (LegacyPrefix::None, 0x0F29),
SseOpcode::Movups => (LegacyPrefix::None, 0x0F11), SseOpcode::Movups => (LegacyPrefix::None, 0x0F11),
SseOpcode::Movupd => (LegacyPrefix::_66, 0x0F11),
_ => unimplemented!("Opcode {:?} not implemented", op), _ => unimplemented!("Opcode {:?} not implemented", op),
}; };
let dst = &dst.finalize(state); let dst = &dst.finalize(state);