Post on 19-Apr-2015
1
Módulo VIII
Intrínsecas WMMX
2
Funções Intrínsecas Funções que executam as instruções Wireless MMX Sintaxe no formato da linguagem “C” Trabalham principalmente com o tipo __m64 Fácil utilização Localizadas em “mmintrin.h” Só funcionam com o compilador Intel
O compilador deve possuir a chave /QTPxsc3
Nem todas as instruções Wireless MMX são suportadas como intrínsecas, para melhor
desempenho, escreva seu código em assembly
3
Configurando o compilador Intel
C:\Program Files\Microsoft eMbedded C++ 4.0\EVC\wce420\bin
Nos arquivos fontes que usam intrinsecas WMMX
inclua#include “mmintrin.h”
No Microsoft IDE, Tools->Options, aba Directories, selecione
Include files e inclua o diretório:
4
Tipos de dado Wireless MMX™
A tecnologia Intel® Wireless MMX™ define 3 tipos de dados empacotados e uma double-world 64bit (__m64)
Elementos com dados empacotados são inteiros ponto fixo que podem ser com ou sem sinal
0781516
63
01516 31 63
0 3132
63
0 63
8 bytes
4 meias words 16 bits
2 words 32 bits
1 valor 64 bits
5
O Tipo _ _m64 Tipo especial de dados WMMX
Somente o compilador Intel reconhece este tipo
Compilador Intel armazena preferencialmente as variáveis desse tipo em registradores WMMX (wRn)
__m64 pode armazenar
oito valores de 1 byte (8 bits)
quatro valores de 2 bytes (16 bits)
dois valores de 4 bytes (32 bits)
um valor de 8 bytes (64 bits)
6
O Tipo _ _m64 Só pode ser utilizado nas seguintes situações
Um dos lados de uma atribuição
Como um valor de retorno
Parâmetro
Não pode ser utilizado em outras expressões aritméticas, como “+”, “-”, etc
Pode ser utilizado como objetos em agregações (como unions)
Nas funções intrínsecas é suportado nos dois lados de uma instrução de atribuição, como
Parâmetro de uma chamada a uma função
Valor de retorno de uma chamada a uma função
7
Sintaxe das funções intrínsecas
data_type intrinsic_name (parameters);
É o tipo do retorno, Geralmente void, int, ou __m64. Pode
retornar outros tipos de dados
É o nome da intrínseca. É como uma função que pode ser usada no código C/C++
Representa os parâmetros requeridos por cada intrínseca
8
Nomenclatura das funções
_mm_intrin_suffix
_intrin: Indica a operação intrínseca, por exemplo, add para adição e sub para subtração
Exemplo:_mm_add_pi8
_mm_ror_pi16
_mm_and_si64
Denota o tipo operado pela função. A primeira ou as duas primeiras letras denotam como o dado será empacotado (p), ou escalar (s). As letras remanescentes denotam o tipo:
i64 - inteiro 64 bit com sinalu64 - inteiro 64 bit sem sinali32 - inteiro 32 bit com sinalu32 - inteiro 32 bit sem sinali16 - inteiro 16 bit com sinalu16 - inteiro 16 bit sem sinali8 - inteiro 8 bit com sinalu8 - inteiro 8 bit sem sinal
9
Exemplo de utilização de Instrínsecasvoid soma_vetor(INT16* vet1, INT16* vet2,
INT16* vet3, int tam_vet) {
for(int i=0; i< tam_vet; i+=4) {
__m64 &aux = *(__m64*)&vet3[i];
aux = mm_add_pi16( *(__m64*)&vet1[i], *(__m64*)&vet2[i]);
} return;}
Tenha muito cuidado com o alinhamento dos dados, um percurso desalinhado no
vetor gera uma exceção
10
Funções intrínsecas Aritméticas Soma: 8, 16 ou 32 bits com ou sem sinal
Subtração: 8, 16 ou 32 bits com ou sem sinal
Multiplicação: 16 bits com ou sem sinal
Acumulação: 8, 16 ou 32 bits sem sinal
Multiplicação com Acumulador: 16 ou 32 bits com ou sem sinal
11
Nome Instrução Sinal Argumento: Resultado:
Nº Valores Bits/Valor Nº Valores Bits/Valor
_mm_add_pi8 WADDB -- 8 8 8 8
_mm_add_pi16 WADDH -- 4 16 4 16
_mm_add_pi32 WADDW -- 2 32 2 32
_mm_adds_pi8 WADDBSS Sim 8 8 8 8
_mm_adds_pi16 WADDHSS Sim 4 16 4 16
_mm_adds_pi32 WADDWSS Sim 2 32 2 32
_mm_adds_pu8 WADDBUS Não 8 8 8 8
_mm_adds_pu16 WADDHUS Não 4 16 4 16
_mm_adds_pu32 WADDWUS Não 2 32 2 32
Funções intrínsecas Aritméticas - Adição
12
Nome Instrução Sinal Argumento: Resultado:
Nº Valores Bits/Valor Nº Valores Bits/Valor
_mm_sub_pi8 WSUBB -- 8 8 8 8
_mm_sub_pi16 WSUBH -- 4 16 4 16
_mm_sub_pi32 WSUBW -- 2 32 2 32
_mm_subs_pi8 WSUBBSS Sim 8 8 8 8
_mm_subs_pi16 WSUBHSS Sim 4 16 4 16
_mm_subs_pi32 WSUBWSS Sim 2 32 2 32
_mm_subs_pu8 WSUBBUS Não 8 8 8 8
_mm_subs_pu16 WSUBHS Não 4 16 4 16
_mm_subs_pu32 WSUBWUS Não 2 32 2 32
Funções intrínsecas Aritméticas - Subtração
13
Nome Instrução Sinal Argumento: Resultado:
Nº Valores Bits/Valor Nº ValoresBits/Valor
_mm_madd_pi16 WMADDS -- 4 16 2 32
_mm_madd_pu16 WMADDU Não 4 16 2 32
_mm_mulhi_pi16 WMULSH Sim 4 16 4 16
_mm_mulhi_pu16 WMULUH Sim 4 16 4 16
_mm_mullo_pi16 WMULSLWMULUL
-- 4 16 4 16
Funções intrínsecas Aritméticas - Multiplicação
14
Nome Instrução Sinal Argumento: Resultado:
Nº Valores Bits/Valor Nº Valores Bits/Valor
_mm_mac_pi16 WMACS Sim 4 16 4 16
_mm_mac_pu16 WMACU Não 4 16 4 16
_mm_macz_pi16 WMACSZ Sim 4 16 4 16
_mm_macz_pu16 WMACUZ Não 4 16 4 16
_mm_mia_si64 TMIA Sim 2 32 1 64
_mm_miaph_si64 TMIAPH Sim 2 16 1 64
_mm_miabb_si64 TMIABB Sim 2 16 1 64
_mm_miabt_si64 TMIABT Sim 2 16 1 64
_mm_miatb_si64 TMIATB Sim 2 16 1 64
_mm_miatt_si64 TMIATT Sim 2 16 1 64
Funções intrínsecas Aritméticas – Multiplicação com acumulação
15
Nome Instrução Sinal Argumento: Resultado:
Nº Valores Bits/Valor Nº
ValoresBits/Valor
_mm_acc_pu8 WACCB Não 8 8 1 8
_mm_acc_pu16 WACCH Não 4 16 1 16
_mm_acc_pu32 WACCW Não 2 32 1 32
Funções intrínsecas Aritméticas – Acumulação
16
Funções intrínsecas de deslocamento Deslocamento lógico para a esquerda: 16, 32 ou 64 bits
Deslocamento lógico para a direita: 16, 32 ou 64 bits
Deslocamento aritmético para a direita: 16, 32 ou 64 bits
Rotação para a direita: 16, 32 ou 64 bits
17
Nome Direção Tipo Instrução
_mm_sll_pi16 Esquerda Lógico WSLLH
_mm_slli_pi16 Esquerda Lógico Composto
_mm_sll_pi32 Esquerda Lógico WSLLW
_mm_slli_pi32 Esquerda Lógico Composto
_mm_sll_si64 Esquerda Lógico WSLLD
_mm_slli_si64 Esquerda Lógico Composto
_mm_sra_pi16 Direita Aritmética WSRAH
_mm_srai_pi16 Direita Arithmetic Composto
_mm_sra_pi32 Direita Aritmética WSRAW
_mm_srai_pi32 Direita Aritmética Composto
_mm_sra_si64 Direita Aritmética WSRAD
_mm_srai_si64 Direita Aritmética Composto
Funções intrínsecas de deslocamento
18
Nome Direção Tipo Instrução
_mm_srl_pi16 Direita Lógico WSRLH
_mm_srli_pi16 Direita Lógico Composto
_mm_srl_pi32 Direita Lógico WSRLW
_mm_srli_pi32 Direita Lógico Composto
_mm_srl_si64 Direita Lógico WSRLD
_mm_srli_si64 Direita Lógico Composto
_mm_ror_pi16 Rotação Direita Lógico WRORH
_mm_ror_pi32 Rotação Direita Lógico WRORW
_mm_ror_si64 Rotação Direita Lógico WRORD
_mm_rori_pi16 Rotação Direita Lógico Composto
_mm_rori_pi32 Rotação Direita Lógico Composto
_mm_rori_si64 Rotação Direita Lógico Composto
Funções intrínsecas de deslocamento
19
Funções intrínsecas lógicas AND bit a bit com valores __m64
NOT Lógico com valores __m64
OR bit a bit com valores __m64
XOR bit a bit com valores __m64
Nome Operação Instrução
_mm_and_si64 E binário WAND
_mm_andnot_si64 Negação Lógica WANDN
_mm_or_si64 OU binário WOR
_mm_xor_si64 OU exclusivo binário WXOR
20
Funções intrínsecas de comparação
Igualdade: 8, 16 ou 32 bits
Maior: 8, 16 ou 32 bits com ou sem sinal
Nome ComparaçãoNº de
ElementosTamanho do
Elemento em Bits Instrução
_mm_cmpeq_pi8 igualdade 8 8 WCMPEQB
_mm_cmpeq_pi16 igualdade 4 16 WCMPEQH
_mm_cmpeq_pi32 igualdade 2 32 WCMPEQW
_mm_cmpgt_pi8 maior com sinal 8 8 WCMPGTSB
_mm_cmpgt_pu8 maior sem sinal 8 8 WCMPGTUB
_mm_cmpgt_pi16 maior com sinal 4 16 WCMPGTSH
_mm_cmpgt_pu16 maior sem sinal 4 16 WCMPGTUH
_mm_cmpgt_pi32 maior com sinal 2 32 WCMPGTSW
_mm_cmpgt_pu32 maior sem sinal 2 32 WCMPGTUW
21
Funções intrínsecas de empacotamento PACK/UNPACK
Empacotamento: 16 , 32 ou 64 bits com ou sem sinal com saturação
Intercalação: 8, 16 ou 32 bits
Desempacotamento: 8, 16 ou 32 bits com propagação do sinal ou de zeros
22
Funções intrínsecas de empacotamento
Nome Instrução Operação Sinal Saturação _mm_packs_pi16 WPACKHSS Empacotar Sim Sim
_mm_packs_pi32 WPACKWSS Empacotar Sim Sim
_mm_packs_pu16 WPACKHUS Empacotar Não Sim
_mm_unpackhi_pi8 WUNPCKIHB Alternar -- --
_mm_unpackhi_pi16 WUNPCKIHH Alternar -- --
_mm_unpackhi_pi32 WUNPCKIHW Alternar -- --
_mm_unpacklo_pi8 WUNPCKILB Alternar -- --
_mm_unpacklo_pi16 WUNPCKILH Alternar -- --
_mm_unpacklo_pi32 WUNPCKILW Alternar -- --
_mm_packs_si64 WPACKDSS Empacotar Sim Sim
_mm_packs_su64 WPACKDUS Empacotar Não Sim
_mm_packs_pu32 WPACKWUS Empacotar Não Sim
23
Funções intrínsecas de empacotamento
Nome Instrução Operação Sinal Saturação _mm_unpackeh_pi8 WUNPCKEHSB Estender Sinal Sim Não
_mm_unpackeh_pi16 WUNPCKEHSH Estender Sinal Sim Não
_mm_unpackeh_pi32 WUNPCKEHSW Estender Sinal Sim Não
_mm_unpackeh_pu8 WUNPCKEHUB Estender zero Não Não
_mm_unpackeh_pu16 WUNPCKEHUH Estender zero Não Não
_mm_unpackeh_pu32 WUNPCKEHUW Estender zero Não Não
_mm_unpackel_pi8 WUNPCKELSB Estender Sinal Sim Não
_mm_unpackel_pi16 WUNPCKELSH Estender Sinal Sim Não
_mm_unpackel_pi32 WUNPCKELSW Estender Sinal Não No
_mm_unpackel_pu8 WUNPCKELUB Estender Sinal No No
_mm_unpackel_pu16 WUNPCKELUH Estender Sinal No No
_mm_unpackel_pu32 WUNPCKELUW Estender zero No No
24
Funções intrínsecas de ajuste (SET/GET)
Alterar conteúdo de valores __m64:
8 bits, 16 bits, 32 bits e zero
Alterar o valor do registrador diretamente
Pegar o valor do registrador
25
Funções intrínsecas de ajuste
Nome Operação Nº Eltos Instrução Tam. Elto Sinal Reveso
_mm_setzero_si64 Zero 1 WZERO 64 Não Não
_mm_set_pi32 Valores Inteiros 2 Composite 32 Não Não
_mm_set_pi16 Valores Inteiros 4 Composite 16 Não Não
_mm_set_pi8 Valores Inteiros 8 Composite 8 Não Não
_mm_set1_pi32 Valores Inteiros 2 TBCSTW 32 Sim Não
_mm_set1_pi16 Valores Inteiros 4 TBCSTH 16 Sim Não
_mm_set1_pi8 Valores Inteiros 8 TBCSTB 8 Sim Não
_mm_setr_pi32 Valores Inteiros 2 Composite 32 Não Sim
_mm_setr_pi16 Valores Inteiros 4 Composite 16 Não Sim
_mm_setr_pi8 Valores Inteiros 8 Composite 8 Não Sim
_mm_setwcx Registrador -- TMCR -- -- --
_mm_getwcx Pega registrador
-- TMRC -- -- --
26
Funções intrínsecas gerais Extração de valores de uma valor __m64: 8, 16 ou 32 bits
Inserção de valores num valor __m64: 8, 16 ou 32 bits
Cálculo do máximo de valores: 8, 16 ou 32 bits com ou sem sinal
Cálculo do mínimo de valores: 8, 16 ou 32 bits com ou sem sinal
Criação de máscaras: 8, 16 ou 32 bits
Cálculo de médias: 8 ou 16 bits
Cálculo de soma absoluta de diferenças
Conversão de tipos para __m64
27
Nome Operação Instrução Sinal
_mm_extract_pi8 Extrai um de oito bytes TEXTRMSB Sim
_mm_extract_pi16 Extrai uma de quatro meia-words TEXTRMSH Sim
_mm_extract_pi32 Extrai uma of duas words TEXTRMSW Sim
_mm_extract_pu8 Extrai um de oito bytes TEXTRMUB Não
_mm_extract_pu16 Extrai uma de quatro meia-words TEXTRMUH Não
_mm_extract_pu32 Extrai uma de duas words TEXTRMUW Não
_mm_insert_pi8 Insere um byte TINSRB --
_mm_insert_pi16 Insere uma meia word TINSRH --
_mm_insert_pi32 Insere uma word TINSRW --
_mm_max_pi8 Calcula o máximo WMAXSB
_mm_max_pi16 Calcula o máximo WMAXSH
_mm_max_pi32 Calcula o máximo WMAXSW
Funções intrínsecas gerais
28
Nome Operação Instrução Sinal
_mm_max_pu8 Calcula o máximo, sem sinal WMAXUB
_mm_max_pu16 Calcula o máximo, sem sinal WMAXUH
_mm_max_pu32 Calcula o máximo, sem sinal WMAXUW
_mm_min_pi8 Calcula o mínimo WMINSB
_mm_min_pi16 Calcula o mínimo WMINSH
_mm_min_pi32 Calcula o mínimo WMINSW
_mm_min_pu8 Calcula o mínimo, sem sinal WMINUB
_mm_min_pu16 Calcula o mínimo, sem sinal WMINUH
_mm_min_pu32 Calcula o mínimo, sem sinal WMINUW
_mm_movemask_pi8 Cria uma máscara de 8 bits TMOVMSKB
_mm_movemask_pi16 Cria uma máscara de 16 bits TMOVMSKH
_mm_movemask_pi32 Cria uma máscara de 32 bits TMOVMSKW
_mm_shuffle_pi16 Retorna uma combinaçãod e 4 meia-words
WSHUFH
Funções intrínsecas gerais
29
Nome Operação Instrução Sinal
_mm_avg_pu8 Calcula a média arredondada WAVG2BR
_mm_avg_pu16 Calcula a média arredondada WAVG2HR
_mm_avg2_pu8 Calcula a média arredondada WAVG2B
_mm_avg2_pu16 Calcula a média sem arredondamento WAVG2H
_mm_sad_pu8 Calcula a soma das diferenças absolutas WSADBZ
_mm_sad_pu16 Calcula a soma das diferenças absolutas WSADHZ
_mm_sada_pu8 Acumula a soma das diferenças absolutas
WSADB
_mm_sada_pu16 Acumula a soma das diferenças absolutas
WSADH
_mm_align_si64 Extrai um valor 64 bits WALIGNI/WALIGNR --
_mm_cvtsi64_m64 Transfere TMCRR --
_mm_cvtm64_si64 Transfere TMRRC --
_mm_cvtsi32_si64 Converte de inteiro TMCRR --
_mm_cvtsi64_si32 Converte para inteiro TMRRC --
Funções intrínsecas gerais
30
Bibliografia
Intel® Wireless MMX™ Technology Developer Guide - Order Number: 251793-001
31
Módulo VIII
Laboratório