_mm_cmpistra
[Diese Dokumentation ist nur eine Vorschau und wird in späteren Versionen ggf. geändert. Blank topics are included as placeholders.]
Microsoft-spezifisch
Gibt die Anweisung pcmpistrider Streaming SIMD-Erweiterungen 4 (SSE4) aus. Diese Anweisung vergleicht zwei Parameter.
int _mm_cmpistra (
__m128i a,
__m128i b,
const int mode
);
Parameter
Parameter |
Beschreibung |
[in] a |
Ein Zeichenfolgen fragment mit einer maximalen Größe von 16 Byte pro Zeichen oder 8 Wortzeichen. |
[in] b |
Ein Zeichenfolgen fragment mit einer maximalen Größe von 16 Byte pro Zeichen oder 8 Wortzeichen. |
[in] mode |
Eine Konstante, die angibt, ob Zeichen oder Bytes Wörter, der Typ des Vergleichs sind, und das Format des zurückgegebenen Werts. |
Rückgabewert
Ein, wenn b ist, enthält nicht das NULL-Zeichen und die resultierende Maske entspricht null. Andernfalls Null. Die pcmpistri-Anweisung berechnet die Bitmaske, in der bit0, bit1, bit2… in der Maske auf das Ergebnis des Vorgangs auf a0, a1, a2… in aentsprechen.
Anforderungen
Intrinsisch |
Architektur |
_mm_cmpistra |
x86, x64 |
Headerdatei <nmmintrin.h>
Hinweise
b0, b1, b2… gibt das erste, zweite und dritte… Zeichen in ban. b0 wird in den niedrigstwertigen Byte aus bgespeichert. Dieselbe Schreibweise bezieht sich auf a. MaxSize ist entweder 16 oder 8 Byte pro Zeichen für Zeichen für Wortzeichen. Dies ist die maximale Anzahl von Zeichen, die in __m128i einen Datentyp passen. Die unteren 7 Bits in mode bestimmen den Typ der Eingabezeichen, die den Vergleich ausgeführt und das Format des Rückgabewerts. Sie werden in der folgenden Tabelle beschrieben:
mode in der Binärdatei |
Definierte Konstante |
Beschreibung |
xxxxxx00 |
_SIDD_UBYTE_OPS |
a und aus Zeichenfolgen enthalten b 8-Bit-Zeichen ohne Vorzeichen. |
xxxxxx01 |
_SIDD_UWORD_OPS |
a und b enthalten Zeichenfolgen aus 16-Bit-Zeichen ohne Vorzeichen. |
xxxxxx10 |
_SIDD_SBYTE_OPS |
a und aus Zeichenfolgen enthalten b 8-Bit-Zeichen mit Vorzeichen. |
xxxxxx11 |
_SIDD_SWORD_OPS |
a und b enthalten Zeichenfolgen aus 16-Bit-Zeichen mit Vorzeichen. |
xxxx00xx |
_SIDD_CMP_EQUAL_ANY |
Suchen, wenn gleich einem Modus: Für jedes Zeichen in ca, bestimmen Sie, ob ein Zeichen in b gleich cist. |
xxxx01xx |
_SIDD_CMP_RANGES |
Suchen Sie im Bereichsmodus: Für jedes Zeichen in cabestimmen, ob Sie b0 <= c <= b1or b2 <= c <= b3… |
xxxx10xx |
_SIDD_CMP_EQUAL_EACH |
Suchen, wenn gleich jeder Modus: Diese Zeichenfolgen gleichheits Algorithmus implementiert. |
xxxx11xx |
_SIDD_CMP_EQUAL_ORDERED |
Suchen, wenn gleicher geordneter Modus: Dieses implementiert den Teilzeichenfolgen suchende Algorithmus. |
xx01xxxx |
_SIDD_NEGATIVE_POLARITY |
Negation der resultierenden Bitmaske. |
xx11xxxx |
_SIDD_MASKED_NEGATIVE_POLARITY |
Negation der resultierenden Bitmaske außer Bits, die einen Index verfügen, der größer ist als die Größe von a oderb(siehe Details pcmpstri Statement). |
Vor der Verwendung dieses systeminterne Software muss sicherstellen, dass der Prozessor die Anweisung unterstützt.
Beispiel
#include <stdio.h>
#include <nmmintrin.h>
int main ()
{
__m128i a, b;
// Note: _SIDD_LEAST_SIGNIFICANT sets the same bit as _SIDD_BIT_MASK
const int mode = _SIDD_UWORD_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_LEAST_SIGNIFICANT;
a.m128i_u16[7] = 0xFFFF;
a.m128i_u16[6] = 0xFFFF;
a.m128i_u16[5] = 0xFFFF;
a.m128i_u16[4] = 0xFFFF;
a.m128i_u16[3] = 0xFFFF;
a.m128i_u16[2] = 0xFFFF;
a.m128i_u16[1] = 0xFFFF;
a.m128i_u16[0] = 0xFFFF;
b.m128i_u16[7] = 0x0001;
b.m128i_u16[6] = 0x0001;
b.m128i_u16[5] = 0x0001;
b.m128i_u16[4] = 0x0001;
b.m128i_u16[3] = 0x0001;
b.m128i_u16[2] = 0x0001;
b.m128i_u16[1] = 0x0001;
b.m128i_u16[0] = 0x0001;
int returnValue = _mm_cmpistra(a, b, mode);
printf_s("_mm_cmpistra return value should be 1: %i\n", returnValue);
b.m128i_u16[4] = 0x0000;
returnValue = _mm_cmpistra(a, b, mode);
printf_s("_mm_cmpistra return value should be 0: %i\n", returnValue);
b.m128i_u16[5] = 0xFFFF;
returnValue = _mm_cmpistrc(a, b, mode);
printf_s("_mm_cmpistrc return value should be 0: %i\n", returnValue);
b.m128i_u16[4] = 0x0001;
returnValue = _mm_cmpistrc(a, b, mode);
printf_s("_mm_cmpistrc return value should be 1: %i\n", returnValue);
returnValue = _mm_cmpistri(a, b, mode);
printf_s("_mm_cmpistri return value should be 5: %i\n", returnValue);
b.m128i_u16[0] = 0xFFFF;
__m128i fullResult = _mm_cmpistrm(a, b, mode);
printf_s("_mm_cmpistrm return value: 0x%016I64x 0x%016I64x\n",
fullResult.m128i_u64[1], fullResult.m128i_u64[0]);
returnValue = _mm_cmpistro(a, b, mode);
printf_s("_mm_cmpistro return value should be 1: %i\n", returnValue);
returnValue = _mm_cmpistrs(a, b, mode);
printf_s("_mm_cmpistrs return value should be 0: %i\n", returnValue);
a.m128i_u16[7] = 0x0000;
returnValue = _mm_cmpistrs(a, b, mode);
printf_s("_mm_cmpistrs return value should be 1: %i\n", returnValue);
returnValue = _mm_cmpistrz(a, b, mode);
printf_s("_mm_cmpistrz return value should be 0: %i\n", returnValue);
b.m128i_u16[7] = 0x0000;
returnValue = _mm_cmpistrz(a, b, mode);
printf_s("_mm_cmpistrz return value should be 1: %i\n", returnValue);
return 0;
}