31
1 Módulo VIII Intrínsecas WMMX

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

Embed Size (px)

Citation preview

Page 1: 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

1

Módulo VIII

Intrínsecas WMMX

Page 2: 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

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

Page 3: 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

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:

Page 4: 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

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

Page 5: 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

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)

Page 6: 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

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

Page 7: 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

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

Page 8: 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

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

Page 9: 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

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

Page 10: 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

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

Page 11: 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

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

Page 12: 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

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

Page 13: 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

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

Page 14: 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

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

Page 15: 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

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

Page 16: 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

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

Page 17: 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

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

Page 18: 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

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

Page 19: 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

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

Page 20: 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

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

Page 21: 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

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

Page 22: 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

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

Page 23: 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

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

Page 24: 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

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

Page 25: 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

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

Page 26: 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

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

Page 27: 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

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

Page 28: 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

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

Page 29: 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

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

Page 30: 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

30

Bibliografia

Intel® Wireless MMX™ Technology Developer Guide - Order Number: 251793-001

Page 31: 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

31

Módulo VIII

Laboratório