Freigeben über


_mm_sha_epi8

Visual Studio 2010 SP1 wird benötigt.

Microsoft-spezifisch

Generiert die XOP-Anweisung vpshab, um jedes Byte der ersten Quelle arithmetisch um einen in der zweiten Quelle angegebenen Wert zu verschieben.

__m128i _mm_sha_epi8 (
   __m128i src,
   __m128i counts
);

Parameter

  • [in] src
    Ein 128-Bit-Parameter, der sechzehn 8-Bit-Ganzzahlen mit Vorzeichen enthält.

  • [in] counts
    Ein 128-Bit-Parameter, der sechzehn 8-Bit-Ganzzahlen mit Vorzeichen enthält.

Rückgabewert

Ein 128-Bit-Ergebnis r, der sechzehn 8-Bit-Ganzzahlen mit Vorzeichen enthält.

r[i] := (counts[i] >= 0) ? src[i] << counts[i]) : 
                           src[i] >> -counts[i]);

Anforderungen

Intrinsisch

Architektur

_mm_sha_epi8

XOP

Headerdatei <intrin.h>

Hinweise

Jeder 8-Bit-Ganzzahlwert mit Vorzeichen in src wird um die im zugehörigen Wert in counts angegebene Anzahl Bits verschoben, und das 8-Bit-Ganzzahlergebnis mit Vorzeichen wird im zugehörigen Wert im Ziel gespeichert. Wenn der Wert in counts positiv ist, erfolgt eine Verschiebung nach links (zum höchstwertigen Bit), und die niederwertigen Bits werden mit Nullen aufgefüllt. Andernfalls erfolgt die Verschiebung nach rechts, und die höherwertigen Bits werden mit dem Wert des Vorzeichenbits aufgefüllt. Wenn ein Verschiebungswert größer als 7 ist, beträgt der zugehörige Ergebniswert 0 (null). Wenn ein Verschiebungswert kleiner als -7 ist, ist das Ergebnis -1, wenn der Wert in src negativ ist, andernfalls 0 (null).

Die vpshab-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()
{
    __m128i a, b, d;
    int i;
    for (i = 0; i < 16; i++) {
        a.m128i_u8[i] = i | (15 - i) << 4;
        b.m128i_i8[i] = i - 8;
    }
    printf_s("data:       ");
    for (i = 0; i < 16; i++) printf_s(" %02x", a.m128i_u8[i]);
    printf_s("\nshifted by  ");
    for (i = 0; i < 16; i++) printf_s(" %2d", b.m128i_i8[i]);
    d = _mm_sha_epi8(a, b);
    printf_s("\ngives       ");
    for (i = 0; i < 16; i++) printf_s(" %02x", d.m128i_u8[i]);
    printf_s("\n");
}
  

Siehe auch

Referenz

__cpuid, __cpuidex

Weitere Ressourcen

_mm_sha_epi16

_mm_sha_epi32

_mm_sha_epi64

_mm_shl_epi8

_mm_rot_epi8

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

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

März 2011

Diesen Inhalt hinzugefügt.

SP1-Funktionsänderung.