ANDPD: Logical AND Packed Double-Precision Floating-Point Values

For information about interpreting this page, see the help page.
Opcode and MnemonicEncoding16 bit Mode32 bit Mode64 bit ModeCPUID Feature FlagDescription
66 0F 54 /r
ANDPD xmm1, xmm2/m128
LEGACYInvalidValidValidSSE2ANDs packed double-precision floating-point values from xmm2/m128 and xmm1. Stores the result in xmm1.
VEX.128.66.0F.WIG 54 /r
VANDPD xmm1, xmm2, xmm3/m128
VEXInvalidValidValidAVXANDs packed double-precision floating-point values from xmm3/m128 and xmm2. Stores the result in xmm1.
VEX.256.66.0F.WIG 54 /r
VANDPD ymm1, ymm2, ymm3/m256
VEXInvalidValidValidAVXANDs packed double-precision floating-point values from ymm3/m256 and ymm2. Stores the result in ymm1.
EVEX.128.66.0F.W1 54 /r
VANDPD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst
EVEXInvalidValidValidAVX512VL
AVS512DQ
ANDs packed double-precision floating-point values from xmm3/m128/m64bcst and xmm2. Stores the result in xmm1.
EVEX.256.66.0F.W1 54 /r
VANDPD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst
EVEXInvalidValidValidAVX512VL
AVS512DQ
ANDs packed double-precision floating-point values from ymm3/m256/m64bcst and ymm2. Stores the result in ymm1.
EVEX.512.66.0F.W1 54 /r
VANDPD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst
EVEXInvalidValidValidAVX512DQANDs packed double-precision floating-point values from zmm3/m512/m64bcst and zmm2. Stores the result in zmm1.

Encoding

EncodingTuple TypeOperand 1Operand 2Operand 3
LEGACYN/AModRM.reg[rw]ModRM.r/m[r]
VEXN/AModRM.reg[rw]VEX.vvvv[r]ModRM.r/m[r]
EVEXFullModRM.reg[rw]EVEX.vvvv[r]ModRM.r/m[r]

Description

The (V)ANDPD instruction ANDs two, four, or eight double-precision floating-point values from the first source operand to the second source operand. The result is stored in in the destination operand.

This instruction, despite being named as if it operates on floating-point numbers, internally operates on 64 bit integers. The "Operation" section below has been updated to reflect this (using SimdU64 instead of SimdF64).

All versions except the legacy SSE version zero the unused upper SIMD register bits.

Operation

This pseudo-code uses C# syntax. A list of the types used is available here.
public void ANDPD(SimdU64 dest, SimdU64 src)
{
  dest[0] &= src[0];
  dest[1] &= src[1];
  // dest[2..Simd.Max] (unmodified)
}

void VANDPD_Vex(SimdU64 dest, SimdU64 src1, SimdU64 src2, int kl)
{
  for (int n = 0; n < kl, n++)
    dest[n] = src1[n] & src2[n];
  dest[kl..Simd.MAX] = 0;
}
public void VANDPD_Vex128(SimdU64 dest, SimdU64 src1, SimdU64 src2)
{
  VANDPD_Vex(dest, src1, src2, 2);
}
public void VANDPD_Vex256(SimdU64 dest, SimdU64 src1, SimdU64 src2)
{
  VANDPD_Vex(dest, src1, src2, 4);
}

void VANDPD_EvexMemory(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k, int kl)
{
  for (int n = 0; n < kl, n++)
  {
    if (k[n])
    {
      if (EVEX.b)
        dest[n] = src1[n] & src2[0];
      else
        dest[n] = src1[n] & src2[n];
    }
    else if (EVEX.z)
    {
      dest[n] = 0;
    }
  }
  dest[kl..Simd.MAX] = 0;
}
public void VANDPD_Evex128Memory(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k)
{
  VANDPD_EvexMemory(dest, src1, src2, k, 2);
}
public void VANDPD_Evex256Memory(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k)
{
  VANDPD_EvexMemory(dest, src1, src2, k, 4);
}
public void VANDPD_Evex512Memory(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k)
{
  VANDPD_EvexMemory(dest, src1, src2, k, 8);
}

void VANDPD_EvexRegister(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k, int kl)
{
  for (int n = 0; n < kl, n++)
  {
    if (k[n])
      dest[n] = src1[n] & src2[n];
    else if (EVEX.z)
      dest[n] = 0;
  }
  dest[kl..Simd.MAX] = 0;
}
public void VANDPD_Evex128Register(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k)
{
  VANDPD_EvexRegister(dest, src1, src2, k, 2);
}
public void VANDPD_Evex256Register(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k)
{
  VANDPD_EvexRegister(dest, src1, src2, k, 4);
}
public void VANDPD_Evex512Register(SimdU64 dest, SimdU64 src1, SimdU64 src2, KMask k)
{
  VANDPD_EvexRegister(dest, src1, src2, k, 8);
}

C Intrinsics

Exceptions

SIMD Floating-Point

None

Other

VEX encoded form: see Exceptions Type 4.

EVEX encoded form: see Exceptions Type E4.