Udostępnij za pośrednictwem


_mm_insert_si64, _mm_inserti_si64

Specyficzne dla firmy Microsoft

Generuje instrukcję insertq wstawiania bitów z drugiego operandu do pierwszego operandu.

Składnia

__m128i _mm_insert_si64(
   __m128i Source1,
   __m128i Source2
);
__m128i _mm_inserti_si64(
   __m128i Source1,
   __m128i Source2
   int Length,
   int Index
);

Parametry

Źródło1
[in] Pole 128-bitowe zawierające dane wejściowe w dolnej 64 bitach, do którego zostanie wstawione pole.

Źródło2
[in] Pole 128-bitowe zawierające dane do wstawienia w małych bitach. W przypadku _mm_insert_si64elementu element zawiera również deskryptor pól w jego dużych bitach.

Długość
[in] Stała całkowita określająca długość pola do wstawienia.

Indeks
[in] Stała całkowita określająca indeks najmniej znaczącego bitu pola, do którego zostaną wstawione dane.

Wartość zwracana

Pole 128-bitowe, którego dolne 64 bity zawierają oryginalne 64-bitowe wartości Source1, z określonym polem bitowym zastąpionym przez małe bity źródła 2. Górne 64 bity wartości zwracanej są niezdefiniowane.

Wymagania

Nieodłączny Architektura
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

Plik<nagłówka intrin.h>

Uwagi

Te funkcje wewnętrzne generują insertq instrukcję wstawiania bitów ze źródła 2 do źródła 1. Istnieją dwie wersje: _mm_inserti_si64, jest natychmiastową wersją i _mm_insert_si64 jest niezwłoczne. Każda wersja wyodrębnia pole bitowe danej długości ze źródła Source2 i wstawia je do źródła Source1. Wyodrębnione bity są najmniej znaczącymi bitami źródła 2. Pole Source1, w którym te bity zostaną wstawione, jest definiowane przez długość i indeks jego najmniej znaczący bit. Wartości długości i indeksu są pobierane mod 64, więc obie wartości -1 i 127 są interpretowane jako 63. Jeśli suma indeksu bitowego (zmniejszona) i (zmniejszona) długość pola jest większa niż 64, wyniki są niezdefiniowane. Wartość zero dla długości pola jest interpretowana jako 64. Jeśli długość pola i indeks bitowy są zerowe, bity 63:0 źródła 2 są wstawione do źródła 1. Jeśli długość pola wynosi zero, ale indeks bitowy jest inny niż zero, wyniki są niezdefiniowane.

W wywołaniu _mm_insert_si64 długość pola jest zawarta w bitach 77:72 źródła2 i indeksu w bitach 69:64.

Jeśli wywołasz metodę _mm_inserti_si64 z argumentami, których kompilator nie może określić jako stałe całkowite, kompilator generuje kod w celu spakowania tych wartości do rejestru XMM i wywołania metody _mm_insert_si64.

Aby określić obsługę sprzętu insertq instrukcji, wywołaj __cpuid funkcję wewnętrzną za pomocą InfoType=0x80000001 polecenia i sprawdź bit 6 z CPUInfo[2] (ECX). Ten bit to 1, jeśli instrukcja jest obsługiwana, a w przeciwnym razie 0. Jeśli uruchamiasz kod korzystający z wewnętrznego sprzętu, który nie obsługuje insertq instrukcji, wyniki są nieprzewidywalne.

Przykład

// Compile this sample with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;

union {
    __m128i m;
    unsigned __int64 ui64[2];
} source1, source2, source3, result1, result2, result3;

int
main()
{

    __int64 mask;

    source1.ui64[0] = 0xffffffffffffffffll;
    source2.ui64[0] = 0xfedcba9876543210ll;
    source2.ui64[1] = 0xc10;
    source3.ui64[0] = source2.ui64[0];

    result1.m = _mm_insert_si64 (source1.m, source2.m);
    result2.m = _mm_inserti_si64(source1.m, source3.m, 16, 12);
    mask = 0xffff << 12;
    mask = ~mask;
    result3.ui64[0] = (source1.ui64[0] & mask) |
                      ((source2.ui64[0] & 0xffff) << 12);

    cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
    cout << "result2 = 0x" << result2.ui64[0] << endl;
    cout << "result3 = 0x" << result3.ui64[0] << endl;

}
result1 = 0xfffffffff3210fff
result2 = 0xfffffffff3210fff
result3 = 0xfffffffff3210fff

END Microsoft Specific

Części Copyright 2007 firmy Advanced Micro Devices, Inc. Wszelkie prawa zastrzeżone. Odtworzony z uprawnieniami firmy Advanced Micro Devices, Inc.

Zobacz też

_mm_extract_si64, _mm_extracti_si64
Funkcje wewnętrzne kompilatora