Condividi tramite


_mm_insert_si64, _mm_inserti_si64

Sezione specifica Microsoft

Genera l'istruzione insertq per inserire bit dal secondo operando al primo operando.

Sintassi

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

Parametri

Source1
[in] Campo a 128 bit con dati di input nei 64 bit inferiori in cui verrà inserito un campo.

Source2
[in] Campo a 128 bit con i dati da inserire nei bit bassi. Per _mm_insert_si64, contiene anche un descrittore di campo nei relativi bit alti.

Lunghezza
[in] Costante integer che specifica la lunghezza del campo da inserire.

Indice
[in] Costante integer che specifica l'indice del bit meno significativo del campo in cui verranno inseriti i dati.

Valore restituito

Campo a 128 bit, i cui 64 bit inferiori contengono i 64 bit originali di Source1, con il campo di bit specificato sostituito dai bit bassi di Source2. I 64 bit superiori del valore restituito non sono definiti.

Requisiti

Intrinsic Architettura
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

<File di intestazione intrin.h>

Osservazioni:

Questi intrinseci generano l'istruzione insertq per inserire bit da Source2 in Source1. Esistono due versioni: _mm_inserti_si64, è la versione immediata ed _mm_insert_si64 è quella non immediata. Ogni versione estrae un campo di bit di una determinata lunghezza da Source2 e lo inserisce in Source1. I bit estratti sono i bit meno significativi di Source2. Il campo Source1 in cui verranno inseriti questi bit è definito dalla lunghezza e dall'indice del bit meno significativo. I valori della lunghezza e dell'indice vengono acquisiti mod 64, quindi sia -1 che 127 vengono interpretati come 63. Se la somma dell'indice di bit (ridotto) e della lunghezza del campo (ridotta) è maggiore di 64, i risultati non sono definiti. Il valore zero per la lunghezza del campo viene interpretato come 64. Se la lunghezza del campo e l'indice di bit sono entrambi zero, i bit 63:0 di Source2 vengono inseriti in Source1. Se la lunghezza del campo è zero, ma l'indice di bit è diverso da zero, i risultati non sono definiti.

In una chiamata a _mm_insert_si64, la lunghezza del campo è contenuta in bit 77:72 di Source2 e l'indice in bit 69:64.

Se si chiama _mm_inserti_si64 con argomenti che il compilatore non può determinare come costanti integer, il compilatore genera il codice per comprimere tali valori in un registro XMM e per chiamare _mm_insert_si64.

Per determinare il supporto hardware per l'istruzione insertq , chiamare l'oggetto __cpuid intrinseco con InfoType=0x80000001 e controllare il bit 6 di CPUInfo[2] (ECX). Questo bit è 1 se l'istruzione è supportata e 0 in caso contrario. Se si esegue codice che usa l'intrinseco sull'hardware che non supporta l'istruzione insertq , i risultati sono imprevedibili.

Esempio

// 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

Fine sezione specifica Microsoft

Parti copyright 2007 di Advanced Micro Devices, Inc. Tutti i diritti riservati. Riprodotto con l'autorizzazione da Advanced Micro Devices, Inc.

Vedi anche

_mm_extract_si64, _mm_extracti_si64
Intrinseci del compilatore