_mm256_cmov_si256

Visual Studio 2010 SP1 wird benötigt.

Microsoft-spezifisch

Generiert die XOP YMM-Anweisung vpcmov, um abhängig vom Wert der dritten Quelle eine bitweise bedingte Verschiebung der ersten beiden Quellen auszuführen.

__m256i _mm256_cmov_si256 (
   __m256i src1,
   __m256i src2,
   __m256i selector
);

Parameter

  • [in] src1
    Ein 256-Bit-Parameter.

  • [in] src2
    Ein 256-Bit-Parameter.

  • [in] selector
    Ein 256-Bit-Parameter, der Bits aus src1 und src2 auswählt.

Rückgabewert

Ein 256-Bit-Ergebnis r, der Bits von src1 und src2 enthält. Das ausgewählte Bit hängt von selector ab.

Anforderungen

Intrinsisch

Architektur

_mm256_cmov_si256

XOP

Headerdatei <intrin.h>

Hinweise

Jedes Bit im Ergebnis wird aus der entsprechenden Bitposition entweder in src1 oder in src2 (abhängig vom Wert dieser Bitposition in selector) ausgewählt (kopiert). Wenn das Bit in selector den Wert 1 hat, wird das Bit von src1 ausgewählt. Andernfalls wird das Bit von src2 ausgewählt.

Die vpcmov-Anweisung ist Teil der XOP-Anweisungsfamilie. Bevor Sie diese systeminterne Funktion verwenden, müssen Sie sicherstellen, dass der Prozessor diese Anweisung unterstützt. Um die Hardwareunterstützung für diese Anweisung zu bestimmen, rufen Sie die systeminterne Funktion __cpuid mit InfoType = 0x80000001 auf, und prüfen Sie Bit 11 von CPUInfo[2] (ECX). Dieses Bit ist 1, wenn die Anweisung unterstützt wird, und andernfalls 0.

Beispiel

#include <stdio.h>
#include <intrin.h>
int main()
{
    __m256i a, b, selector, d;
    int i;
    a.m256i_u64[3] = 0xffffffffffffffffll;
    a.m256i_u64[2] = 0xeeeeeeeeeeeeeeeell;
    a.m256i_u64[1] = 0xccccccccccccccccll;
    a.m256i_u64[0] = 0x8888888888888888ll;
    b.m256i_u64[3] = 0x0000000000000000ll;
    b.m256i_u64[2] = 0x1111111111111111ll;
    b.m256i_u64[1] = 0x3333333333333333ll;
    b.m256i_u64[0] = 0x7777777777777777ll;
    selector.m256i_u64[3] = 0xfedcba9876543210ll;
    selector.m256i_u64[2] = 0x0123456789abcdefll;
    selector.m256i_u64[1] = 0xfedcba9876543210ll;
    selector.m256i_u64[0] = 0x0123456789abcdefll;
    d = _mm256_cmov_si256(a, b, selector);
    printf_s("a:        %016I64x %016I64x\n",
              a.m256i_u64[3], a.m256i_u64[2]);
    printf_s("          %016I64x %016I64x\n",
              a.m256i_u64[1], a.m256i_u64[0]);
    printf_s("b:        %016I64x %016I64x\n",
              b.m256i_u64[3], b.m256i_u64[2]);
    printf_s("          %016I64x %016I64x\n",
              b.m256i_u64[1], b.m256i_u64[0]);
    printf_s("selector  %016I64x %016I64x\n",
              selector.m256i_u64[3], selector.m256i_u64[2]);
    printf_s("          %016I64x %016I64x\n",
              selector.m256i_u64[1], selector.m256i_u64[0]);
    printf_s("result:   %016I64x %016I64x\n",
              d.m256i_u64[3], d.m256i_u64[2]);
    printf_s("          %016I64x %016I64x\n",
              d.m256i_u64[1], d.m256i_u64[0]);
}
  

Siehe auch

Referenz

__cpuid, __cpuidex

Weitere Ressourcen

_mm_cmov_si128

In Visual Studio 2010 SP1 hinzugefügte systeminterne XOP-Funktionen

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

März 2011

Diesen Inhalt hinzugefügt.

SP1-Funktionsänderung.