_mm_extract_si64, _mm_extracti_si64
Seção específica da Microsoft
Gera a instrução extrq
para extrair bits especificados dos 64 bits inferiores do primeiro argumento dela.
Sintaxe
__m128i _mm_extract_si64(
__m128i Source,
__m128i Descriptor
);
__m128i _mm_extracti_si64(
__m128i Source,
int Length,
int Index
);
Parâmetros
Origem
[in] Um campo de 128 bits com dados de entrada em seus 64 bits inferiores.
Descritor
[in] Um campo de 128 bits que descreve o campo de bits a ser extraído.
Comprimento
[in] Um inteiro que especifica o comprimento do campo a ser extraído.
Index
[in] Um inteiro que especifica o índice do campo a ser extraído
Retornar valor
Um campo de 128 bits com o campo extraído nos bits menos significativos dele.
Requisitos
Intrinsic | Arquitetura |
---|---|
_mm_extract_si64 |
SSE4a |
_mm_extracti_si64 |
SSE4a |
Arquivo de cabeçalho<intrin.h>
Comentários
Esses intrínsecos geram a instrução extrq
para extrair bits de Source. Há duas versões: _mm_extracti_si64
é a versão imediata e _mm_extract_si64
é a não imediata. Cada versão extrai de Source um campo de bits definido pelo comprimento dele e o índice do bit menos significativo dele. Os valores de comprimento e índice são submetidos a mod 64, portanto, tanto -1 quanto 127 são interpretados como 63. Se a soma do índice (reduzido) e do comprimento do campo (reduzido) for maior que 64, os resultados serão indefinidos. Um valor zero para o comprimento do campo é interpretado como 64. Se o índice de comprimento e bit do campo for zero, os bits 63:0 de Source serão extraídos. Se o comprimento do campo for zero, mas o índice de bits não for zero, os resultados serão indefinidos.
Em uma chamada a _mm_extract_si64
, o Descriptor contém o índice nos bits 13:8 e o comprimento do campo dos dados a serem extraídos nos bits 5:0.
Se você chamar _mm_extracti_si64
com argumentos que o compilador não pode determinar como constantes inteiras, o compilador gerará código para empacotar esses valores em um registro XMM (Descriptor) e chamará _mm_extract_si64
.
Para determinar o suporte de hardware para a instrução extrq
, chame o intrínseco __cpuid
com InfoType=0x80000001
e verifique o bit 6 de CPUInfo[2] (ECX)
. Se a instrução tiver suporte, esse bit será 1, caso contrário, 0. Se você executar o código que usa esse hardware intrínseco que não dá suporte à instrução extrq
, os resultados serão imprevisíveis.
Exemplo
// Compile this sample with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;
union {
__m128i m;
unsigned __int64 ui64[2];
} source, descriptor, result1, result2, result3;
int
main()
{
source.ui64[0] = 0xfedcba9876543210ll;
descriptor.ui64[0] = 0x0000000000000b1bll;
result1.m = _mm_extract_si64 (source.m, descriptor.m);
result2.m = _mm_extracti_si64(source.m, 27, 11);
result3.ui64[0] = (source.ui64[0] >> 11) & 0x7ffffff;
cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
cout << "result2 = 0x" << result2.ui64[0] << endl;
cout << "result3 = 0x" << result3.ui64[0] << endl;
}
result1 = 0x30eca86
result2 = 0x30eca86
result3 = 0x30eca86
Fim da seção específica da Microsoft
Partes com Copyright 2007 da Advanced Micro Devices, Inc. Todos os direitos reservados. Reproduzido com permissão da Advanced Micro Devices, Inc.
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de