Add remaining X86_64 support for pack w/ signed/unsigned saturation
Adds lowering for packssdw, packusdw, packuswb
This commit is contained in:
@@ -467,7 +467,10 @@ pub enum SseOpcode {
|
||||
Pabsb,
|
||||
Pabsw,
|
||||
Pabsd,
|
||||
Packssdw,
|
||||
Packsswb,
|
||||
Packusdw,
|
||||
Packuswb,
|
||||
Paddb,
|
||||
Paddd,
|
||||
Paddq,
|
||||
@@ -633,7 +636,9 @@ impl SseOpcode {
|
||||
| SseOpcode::Mulpd
|
||||
| SseOpcode::Mulsd
|
||||
| SseOpcode::Orpd
|
||||
| SseOpcode::Packssdw
|
||||
| SseOpcode::Packsswb
|
||||
| SseOpcode::Packuswb
|
||||
| SseOpcode::Paddb
|
||||
| SseOpcode::Paddd
|
||||
| SseOpcode::Paddq
|
||||
@@ -696,6 +701,7 @@ impl SseOpcode {
|
||||
| SseOpcode::Pshufb => SSSE3,
|
||||
|
||||
SseOpcode::Insertps
|
||||
| SseOpcode::Packusdw
|
||||
| SseOpcode::Pcmpeqq
|
||||
| SseOpcode::Pextrb
|
||||
| SseOpcode::Pextrd
|
||||
@@ -801,7 +807,10 @@ impl fmt::Debug for SseOpcode {
|
||||
SseOpcode::Pabsb => "pabsb",
|
||||
SseOpcode::Pabsw => "pabsw",
|
||||
SseOpcode::Pabsd => "pabsd",
|
||||
SseOpcode::Packssdw => "packssdw",
|
||||
SseOpcode::Packsswb => "packsswb",
|
||||
SseOpcode::Packusdw => "packusdw",
|
||||
SseOpcode::Packuswb => "packuswb",
|
||||
SseOpcode::Paddb => "paddb",
|
||||
SseOpcode::Paddd => "paddd",
|
||||
SseOpcode::Paddq => "paddq",
|
||||
|
||||
@@ -1781,7 +1781,10 @@ pub(crate) fn emit(
|
||||
SseOpcode::Mulsd => (LegacyPrefixes::_F2, 0x0F59, 2),
|
||||
SseOpcode::Orpd => (LegacyPrefixes::_66, 0x0F56, 2),
|
||||
SseOpcode::Orps => (LegacyPrefixes::None, 0x0F56, 2),
|
||||
SseOpcode::Packssdw => (LegacyPrefixes::_66, 0x0F6B, 2),
|
||||
SseOpcode::Packsswb => (LegacyPrefixes::_66, 0x0F63, 2),
|
||||
SseOpcode::Packusdw => (LegacyPrefixes::_66, 0x0F382B, 3),
|
||||
SseOpcode::Packuswb => (LegacyPrefixes::_66, 0x0F67, 2),
|
||||
SseOpcode::Paddb => (LegacyPrefixes::_66, 0x0FFC, 2),
|
||||
SseOpcode::Paddd => (LegacyPrefixes::_66, 0x0FFE, 2),
|
||||
SseOpcode::Paddq => (LegacyPrefixes::_66, 0x0FD4, 2),
|
||||
|
||||
@@ -3151,12 +3151,30 @@ fn test_x64_emit() {
|
||||
"pshufb %xmm11, %xmm2",
|
||||
));
|
||||
|
||||
insns.push((
|
||||
Inst::xmm_rm_r(SseOpcode::Packssdw, RegMem::reg(xmm11), w_xmm12),
|
||||
"66450F6BE3",
|
||||
"packssdw %xmm11, %xmm12",
|
||||
));
|
||||
|
||||
insns.push((
|
||||
Inst::xmm_rm_r(SseOpcode::Packsswb, RegMem::reg(xmm11), w_xmm2),
|
||||
"66410F63D3",
|
||||
"packsswb %xmm11, %xmm2",
|
||||
));
|
||||
|
||||
insns.push((
|
||||
Inst::xmm_rm_r(SseOpcode::Packusdw, RegMem::reg(xmm13), w_xmm6),
|
||||
"66410F382BF5",
|
||||
"packusdw %xmm13, %xmm6",
|
||||
));
|
||||
|
||||
insns.push((
|
||||
Inst::xmm_rm_r(SseOpcode::Packuswb, RegMem::reg(xmm9), w_xmm4),
|
||||
"66410F67E1",
|
||||
"packuswb %xmm9, %xmm4",
|
||||
));
|
||||
|
||||
insns.push((
|
||||
Inst::xmm_rm_r(SseOpcode::Punpckhbw, RegMem::reg(xmm3), w_xmm2),
|
||||
"660F68D3",
|
||||
|
||||
Reference in New Issue
Block a user