_mm_com_epi16
Visual Studio 2010 SP1 wird benötigt.
Microsoft-spezifisch
Generiert die XOP-Anweisung vpcomw, um eine Bitmaske zurückzugeben, die durch einen wortweisen vorzeichenbehafteten Vergleich der ersten beiden Quellen generiert wird, wobei die von der dritten Quelle angegebene Bedingung verwendet wird.
__m128i _mm_com_epi16 (
__m128i src1,
__m128i src2,
int condition
);
Parameter
[in] src1
Gepacktes 128-Bit-Array von acht 16-Bit-Ganzzahlen mit Vorzeichen.[in] src2
Gepacktes 128-Bit-Array von acht 16-Bit-Ganzzahlen mit Vorzeichen.[in] condition
Eine 32-Bit-Ganzzahl-Bedingung, die im Vergleich verwendet werden soll. Gültige Werte sind 0 bis 7.
Rückgabewert
Ein gepacktes 128-Bit-Array-r mit acht 16-Bit-Ganzzahlen ohne Vorzeichen, von denen jede entweder den Wert 0x0000 oder 0xFFFF hat. Wenn cond der durch den Wert von condition vorgegebene logische Operator ist, dann ist
r[i] := src1[i] cond src2[i] ? 0xFFFF : 0x0000;
Anforderungen
Intrinsisch |
Architektur |
---|---|
_mm_com_epi16 |
XOP |
Headerdatei <intrin.h>
Hinweise
Diese Anweisung vergleicht jedes Byte von src1 mit dem entsprechenden Byte von src2 und verwendet den in condition beschriebenen Vergleichsoperator. (Jedes Paar Bytes verwendet den gleichen Vergleichsoperator.) Die condition für gültige Werte gibt 0 bis 7 an. Durch Einbinden von <intrin.h> sind Sie in der Lage, statt der numerischen Werte die folgenden Namen für condition zu verwenden:
Ganzzahliger Wert |
Symbolischer Name |
Bedeutung |
---|---|---|
0 |
_MM_PCOMCTRL_LT |
r[i] = (src1[i] < src2[i]) ? 0xFFFF : 0x0000 |
1 |
_MM_PCOMCTRL_LE |
r[i] = (src1[i] <= src2[i]) ? 0xFFFF : 0x0000 |
2 |
_MM_PCOMCTRL_GT |
r[i] = (src1[i] > src2[i]) ? 0xFFFF : 0x0000 |
3 |
_MM_PCOMCTRL_GE |
r[i] = (src1[i] >= src2[i]) ? 0xFFFF : 0x0000 |
4 |
_MM_PCOMCTRL_EQ |
r[i] = (src1[i] == src2[i]) ? 0xFFFF : 0x0000 |
5 |
_MM_PCOMCTRL_NEQ |
r[i] = (src1[i] != src2[i]) ? 0xFFFF : 0x0000 |
6 |
_MM_PCOMCTRL_FALSE |
r[i] = 0x0000 (Maske alle 0 (null)) |
7 |
_MM_PCOMCTRL_TRUE |
r[i] = 0xFFFF (Maske alle 1) |
Wenn Sie dies vorziehen, können Sie die folgenden Makros verwenden, die durch das Einschließen von <intrin.h> definiert werden:
Makro |
Bedeutung |
---|---|
_mm_comlt_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 0) |
_mm_comle_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 1) |
_mm_comgt_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 2) |
_mm_comge_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 3) |
_mm_comeq_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 4) |
_mm_comneq_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 5) |
_mm_comfalse_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 6) |
_mm_comtrue_epi16(src1, src2) |
_mm_com_epi16(src1, src2, 7) |
Die vpcomb-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>
main()
{
__m128i a, b, d;
int i;
for (i = 0; i < 8; i++) {
a.m128i_i16[i] = ((20011*i) % 65535) - 32768;
b.m128i_i16[i] = ((32767*i) % 65535) - 32768;
}
printf("src1: ");
for (i = 0; i < 8; i++) printf_s(" %6d", a.m128i_i16[i]);
printf_s("\nsrc2: ");
for (i = 0; i < 8; i++) printf_s(" %6d", b.m128i_i16[i]);
printf_s("\n< mask:");
d = _mm_com_epi16(a, b, _MM_PCOMCTRL_LT);
for (i = 0; i < 8; i++) printf_s(" %04x", d.m128i_u16[i]);
printf_s("\n== mask:");
d = _mm_com_epi16(a, b, _MM_PCOMCTRL_EQ);
for (i = 0; i < 8; i++) printf_s(" %04x", d.m128i_u16[i]);
printf("\n");
}
Siehe auch
Weitere Ressourcen
In Visual Studio 2010 SP1 hinzugefügte systeminterne XOP-Funktionen
Änderungsprotokoll
Datum |
Versionsgeschichte |
Grund |
---|---|---|
März 2011 |
Diesen Inhalt hinzugefügt. |
SP1-Funktionsänderung. |