[x64] Add i64x2.abs
This instruction has a single instruction lowering in AVX512F/VL and a three instruction lowering in AVX but neither is currently supported in the x64 backend. To implement this, we instead subtract the vector from 0 and use a blending instruction to pick the lanes containing the absolute value.
This commit is contained in:
@@ -470,6 +470,7 @@ pub enum SseOpcode {
|
||||
Andpd,
|
||||
Andnps,
|
||||
Andnpd,
|
||||
Blendvpd,
|
||||
Comiss,
|
||||
Comisd,
|
||||
Cmpps,
|
||||
@@ -758,7 +759,8 @@ impl SseOpcode {
|
||||
| SseOpcode::Palignr
|
||||
| SseOpcode::Pshufb => SSSE3,
|
||||
|
||||
SseOpcode::Insertps
|
||||
SseOpcode::Blendvpd
|
||||
| SseOpcode::Insertps
|
||||
| SseOpcode::Packusdw
|
||||
| SseOpcode::Pcmpeqq
|
||||
| SseOpcode::Pextrb
|
||||
@@ -816,6 +818,7 @@ impl fmt::Debug for SseOpcode {
|
||||
SseOpcode::Andps => "andps",
|
||||
SseOpcode::Andnps => "andnps",
|
||||
SseOpcode::Andnpd => "andnpd",
|
||||
SseOpcode::Blendvpd => "blendvpd",
|
||||
SseOpcode::Cmpps => "cmpps",
|
||||
SseOpcode::Cmppd => "cmppd",
|
||||
SseOpcode::Cmpss => "cmpss",
|
||||
|
||||
@@ -1845,6 +1845,7 @@ pub(crate) fn emit(
|
||||
SseOpcode::Andpd => (LegacyPrefixes::_66, 0x0F54, 2),
|
||||
SseOpcode::Andnps => (LegacyPrefixes::None, 0x0F55, 2),
|
||||
SseOpcode::Andnpd => (LegacyPrefixes::_66, 0x0F55, 2),
|
||||
SseOpcode::Blendvpd => (LegacyPrefixes::_66, 0x0F3815, 3),
|
||||
SseOpcode::Cvttps2dq => (LegacyPrefixes::_F3, 0x0F5B, 2),
|
||||
SseOpcode::Cvtdq2ps => (LegacyPrefixes::None, 0x0F5B, 2),
|
||||
SseOpcode::Divps => (LegacyPrefixes::None, 0x0F5E, 2),
|
||||
|
||||
@@ -3426,6 +3426,12 @@ fn test_x64_emit() {
|
||||
"orps %xmm5, %xmm4",
|
||||
));
|
||||
|
||||
insns.push((
|
||||
Inst::xmm_rm_r(SseOpcode::Blendvpd, RegMem::reg(xmm15), w_xmm4),
|
||||
"66410F3815E7",
|
||||
"blendvpd %xmm15, %xmm4",
|
||||
));
|
||||
|
||||
// ========================================================
|
||||
// XMM_RM_R: Integer Packed
|
||||
|
||||
|
||||
Reference in New Issue
Block a user