Não são implementados nos microcontroladores UC3. São 29 instruções disponíveis a saber:
PABS.{SB/SH} – empacota o valor absoluto
Descrição: Calcula os valores absolutos de
quatro bytes com sinal empacotados (pabs.sb) ou duas meias palavras
com sinal empacotado (pabs.sh) da registrador fonte e armazenar os
resultados como bytes empacotados ou meias palavras no registrador
destino.
Operação:
I.
Rd[31:24] ← | Rs[31:24] |; Rd[23:16] ← | Rs[23:16] |;
Rd[15:8]
← | Rs[15:8] |; Rd[7:0] ← | Rs[7:0] |;
II.
Rd[31:16] ← | Rs[31:16] |;
Rd[15:0]
← | Rs[15:0] |;
Sintaxe:
I.
pabs.sb
Rd, Rs
II.
pabs.sh
Rd, Rs
Operandos:
I, II.
{d, s} ∈ {0, 1, ..., 15}
PACKSH.{UB/SB} – empacota bytes em meia palavra com sinal
Descrição: Coloca os quatro meias palavras com sinal localizados
nos dois registradores fonte em quatro bytes no registrador destino.
Cada uma das meias palavras com sinal são byte saturados sem sinal
(packsh.ub) ou com sinal (packsh.sb).
Operação:
I.
Rd[31:24] ← SATSU(Rx[31:16], 8); Rd[23:16] ← SATSU(Rx[15:0],
8);
Rd[15:8]
← SATSU(Ry[31:16], 8); Rd[7:0] ← SATSU(Ry[15:0], 8);
II.
Rd[31:24] ← SATS(Rx[31:16], 8); Rd[23:16] ← SATS(Rx[15:0], 8);
Rd[15:8]
← SATS(Ry[31:16], 8); Rd[7:0] ← SATS(Ry[15:0], 8);
Sintaxe:
I.
packsh.ub
II.
packsh.sb
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II. {d, x, y} ∈ {0, 1, ..., 15}
PACKSH.{UB/SB} – empacota bytes em meia palavra com sinal
Descrição: Coloca os quatro meias palavras com sinal localizados
nos dois registradores fonte em quatro bytes no registrador destino.
Cada uma das meias palavras com sinal são byte saturados sem sinal
(packsh.ub) ou com sinal (packsh.sb).
Operação:
I.
Rd[31:24] ← SATSU(Rx[31:16], 8); Rd[23:16] ← SATSU(Rx[15:0],
8);
Rd[15:8]
← SATSU(Ry[31:16], 8); Rd[7:0] ← SATSU(Ry[15:0], 8);
II.
Rd[31:24] ← SATS(Rx[31:16], 8); Rd[23:16] ← SATS(Rx[15:0], 8);
Rd[15:8]
← SATS(Ry[31:16], 8); Rd[7:0] ← SATS(Ry[15:0], 8);
Sintaxe:
I.
packsh.ub
II.
packsh.sb
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II. {d, x, y} ∈ {0, 1, ..., 15}
PACKW.SH – Empacote as palavras com sinal palavras
Descrição: Empacota as duas palavras apresentadas no registrador
fonte em dois meias palavras no registo de destino. Cada uma das
palavras são saturados de meia palavras com sinal antes de serem
empacotadas.
Operação:
I.
Rd[31:16] ← SATS(Rx, 16);
Rd[15:0]
← SATS(Ry, 16);
Sintaxe:
I.
packw.sh Rd, Rx, Ry
Operandos:
I. {d, x, y} ∈ {0, 1, ..., 15}
PADD.{B/H} – Empacota a adição
Descrição: Executa a adição de quatro pares de bytes empacotados
(padd.b) ou dois pares de meias palavras (padd.h). Após
transbordamento quaisquer bits adicionais são descartadas e o
resultado é embrulhado em torno de si.
Operação:
I. Rd[31:24] ← Rx[31:24] + Ry[31:24]; Rd[23:16] ← Rx[23:16] +
Ry[23:16];
Rd[15:8]
← Rx[15:8] + Ry[15:8]; Rd[7:0] ← Rx[7:0] + Ry[7:0];
II.
Rd[31:16] ← Rx[31:16] + Ry[31:16];
Rd[15:0]
← Rx[15:0] + Ry[15:0];
Sintaxe:
I. padd.b
II.
padd.h Rd, Rx, Ry Rd, Rx, Ry
Operandos:
I, II. {d, x, y} ∈ {0, 1, ..., 15}
PADDH.{UB/SH} – Empacota: Adição com Reduzir para metade
Descrição: Realizar adição de quatro pares de bytes sem sinal
empacotados (paddh.ub) ou dois pares de meias palavras embalados
assinados (paddh.sh) com uma redução para metade do resultado para
evitar transbordamentos ocorram.
Operação:
I. Rd[31:24] ← LSR(ZE(Rx[31:24], 9) + ZE(Ry[31:24], 9), 1) ;
Rd[23:16]
← LSR(ZE(Rx[23:16], 9) + ZE(Ry[23:16], 9), 1);
Rd[15:8]
← LSR(ZE(Rx[15:8], 9) + ZE(Ry[15:8], 9), 1);
Rd[7:0] ←
LSR(ZE(Rx[7:0], 9) + ZE(Ry[7:0], 9), 1);
II.
Rd[31:16] ← ASR(SE(Rx[31:16], 17) + SE(Ry[31:16], 17), 1);
Rd[15:0]
← ASR(SE(Rx[15:0], 17) + SE(Ry[15:0], 17), 1);
Sintaxe:
I. paddh.ub
II.
paddh.sh Rd, Rx, Ry Rd, Rx, Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
PADDS.{UB/SB/UH/SH} – Adição Embalado com saturação
Descrição: Executar a adição de quatro pares de bytes empacotados
ou dois pares de meias palavras. O resultado é saturado de tanto
bytes sem sinal (padds.ub), bytes assinados (padds.sb), meia palavra
não assinada (padds.uh) ou meia palavra com sinal meias palavras
(padds.sh).
Operação:
I.
Rd[31:24]
← SATU(ZE(Rx[31:24], 9) + ZE(Ry[31:24], 9), 8) ;
Rd[23:16]
← SATU(ZE(Rx[23:16], 9) + ZE(Ry[23:16], 9), 8);
Rd[15:8]
← SATU(ZE(Rx[15:8], 9) + ZE(Ry[15:8], 9), 8);
Rd[7:0] ←
SATU(ZE(Rx[7:0], 9) + ZE(Ry[7:0], 9), 8);
II.
Rd[31:24]
← SATS(SE(Rx[31:24], 9) + SE(Ry[31:24], 9), 8);
Rd[23:16]
← SATS(SE(Rx[23:16], 9) + SE(Ry[23:16], 9), 8);
Rd[15:8]
← SATS(SE(Rx[15:8], 9) + SE(Ry[15:8], 9), 8);
Rd[7:0] ←
SATS(SE(Rx[7:0], 9) + SE(Ry[7:0], 9), 8);
III.
Rd[31:16]
← SATU(ZE(Rx[31:16], 17) + ZE(Ry[31:16], 17), 16);
Rd[15:0]
← SATU(ZE(Rx[15:0], 17) + ZE(Ry[15:0], 17), 16);
IV.
Rd[31:16]
← SATS(SE(Rx[31:16], 17) + SE(Ry[31:16], 17), 16);
Rd[15:0]
← SATS(SE(Rx[15:0], 17) + SE(Ry[15:0], 17), 16);
Sintaxe:
I. padds.ub
II.
padds.sb
III.
padds.uh
IV.
padds.sh
Rd, Rx,
Ry
Rd, Rx,
Ry
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II, III, IV.{d, x, y} ∈ {0, 1, ..., 15}
PADDSUB.H – Empacota meia palavra com adição e subtração
Descrição: Realizar uma adição e subtração com os mesmos meia
palavra operandos que são selecionados a partir dos registradores de
origem. Os dois resultados de meia palavra são empacotados no
registrador de destino sem realizar qualquer saturação.
Operação:
I.
If (Rx-part == t) then operand1 = Rx[31:16] else operand1 =
Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← operand1 + operand2;
Rd[15:0]
← operand1 - operand2;
Sintaxe:
I.
paddsub.h
Rd, Rx:<part>, Ry:<part>
Operandos:
I.
{d, x, y} ∈ {0, 1, ..., 15} / part ∈ {t,b}
PADDSUBH.SH – Empacota meia palavra com adição e subtração e com redução pela metade
Descrição: Realizar uma adição e subtração com os mesmos
operandos em meia palavra com sinal que são selecionados a partir
dos registradores de origem. Os resultados em meias palavras são
reduzidos pela metade, a fim de evitar que ocorram excessos.
Operação:
I. If (Rx-part == t) then operand1 = Rx[31:16] else operand1 =
Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← ASR(SE(operand1, 17) + SE(operand2, 17), 1);
Rd[15:0]
← ASR(SE(operand1, 17) - SE(operand2, 17), 1);
Sintaxe:
I.
paddsubh.sh
Rd, Rx:<part>, Ry:<part>
Operandos:
I.
{d, x, y} ∈ {0, 1, ..., 15}
/ part ∈ {t,b}
PADDSUBS.{UH/SH} – Empacota a meia palavra da adição e subtração com saturação
Descrição:
Realizar uma adição e subtração com os mesmos operandos em meia
palavra que são selecionados a partir dos registradores de origem.
As meias palavras resultantes estão saturados sem sinal
(paddsubs.uh) ou meias palavras com sinal (paddsubs.sh) e em seguida
empacotadas em conjunto no registrador destino.
Operação:
I. If (Rx-part == t) then operand1 = Rx[31:16] else operand1 =
Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← SATU(ZE(operand1, 17) + ZE(operand2, 17), 16);
Rd[15:0]
← SATSU(ZE(operand1, 17) - ZE(operand2, 17), 16);
II.
If
(Rx-part == t) then operand1 = Rx[31:16] else operand1 = Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← SATS(SE(operand1, 17) + SE(operand2, 17), 16);
Rd[15:0]
← SATS(SE(operand1, 17) - SE(operand2, 17), 16);
Sintaxe:
I.
paddsubs.uh
II.
paddsubs.sh
Rd, Rx:<part>, Ry:<part>
Rd, Rx:<part>,
Ry:<part>
Operandos:
I,II.
{d, x, y} ∈ {0, 1, ..., 15}
/ part ∈ {t,b}
PADDX.H – Empacota meia palavra da adição com Operando cruzados
Descrição: Soma a metade superior da palavra em Rx com a metade
inferior da palavra em Ry e a metade inferior da palavra em Rx com a
metade superior palavra em Ry. As meias palavras resultantes são
empacotadas em conjunto no registrador destino sem realizar qualquer
saturação.
Operação:
I.
Rd[31:16] ← Rx[31:16] + Ry[15:0] ;
Rd[15:0]
← Rx[15:0] + Ry[31:16];
Sintaxe:
I.
paddx.h
Rd, Rx, Ry
Operandos:
I. {d, x, y} ∈ {0, 1, ..., 15}
PADDXH.SH – Empacota a adição de meias palavras com sinal, com Operando cruzados e Redução pela metade
Descrição: Soma a metade superior da palavra em Rx com a metade
inferior da palavra em Ry e a metade inferior da palavra em Rx com a
metade superior da palavra em Ry. As meias palavras resultantes são
reduzidos pela metade, de modo a evitar qualquer transbordamento e,
em seguida, empacotadas em conjunto no registrador destino.
Operação:
I.
Rd[31:16] ← ASR(SE(Rx[31:16], 17) + SE(Ry[15:0], 17), 1);
Rd[15:0]
← ASR(SE(Rx[15:0], 17) + SE(Ry[31:16], 17), 1);
Sintaxe:
I. paddxh.sh Rd, Rx, Ry
Operandos:
I. {d, x, y} ∈ {0, 1, ..., 15}
PADDXS.{UH/SH} – Empacota a adição de meias palavras com o operando cruzados e saturação
Descrição:
Soma a metade superior da palavra em Rx com a metade inferior da
palavra em Ry e a metade inferior da palavra e Rx com a metade
superior palavra em Ry. Resultando em meias palavras saturadas sem
sinal (paddxh.uh) ou palavras meias assinados (paddxh.sh) e em
seguida empacotadas em conjunto no registrador destino.
Operação:
I.
Rd[31:16] ← SATU(ZE(Rx[31:16], 17) + ZE(Ry[15:0], 17), 16) ;
Rd[15:0]
← SATU(ZE(Rx[15:0], 17) + ZE(Ry[31:16], 17), 16);
II.
Rd[31:16] ← SATS(SE(Rx[31:16], 17) + SE(Ry[15:0], 17), 16) ;
Rd[15:0]
← SATS(SE(Rx[15:0], 17) + SE(Ry[31:16], 17), 16);
Sintaxe:
I.
paddxs.uh
II.
paddxs.sh
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
PASR.{B/H} – Empacota o deslocamento aritmética à direita
Descrição: Realizar um deslocamento aritmético à direita em cada
um dos bytes empacotados ou palavras meia no registador fonte.
Operação:
I.
Rd[31:24] ← ASR(Rs[31:24], sa3);
Rd[23:16]
← ASR(Rs[23:16], sa3);
Rd[15:8]
← ASR(Rs[15:8], sa3);
Rd[7:0] ←
ASR(Rs[7:0], sa3);
II.
Rd[31:16] ← ASR(Rs[31:16], sa4);
Rd[15:0]
← ASR(Rs[15:0], sa4);
Sintaxe:
I.
pasr.b
II.
pasr.h
Rd, Rs,
sa
Rd, Rs,
sa
Operandos:
I, II. {d, s} ∈ {0, 1, ..., 15}
I.
sa ∈
{0, 1, ..., 7}
II.
sa ∈
{0, 1, ..., 15}
PAVG.{UB/SH} – empacota a média
Descrição: Calcula a média dos pares de bytes empacotados sem
sinal (pavg.ub) ou meias palavras empacotados com sinal (pavg.sh). As
médias são calculadas adicionando dois valores ao mesmo tempo, a
adição de um fator de arredondamento no bit menos significativo. O
resultado é então reduzido pela metade, deslocando-se uma posição
à direita.
Operação:
I.
Rd[31:24] ← LSR(ZE(Rx[31:24], 9) + ZE(Ry[31:24], 9) + 1, 1);
Rd[23:16]
← LSR(ZE(Rx[23:16], 9) + ZE(Ry[23:16], 9) + 1, 1);
Rd[15:8]
← LSR(ZE(Rx[15:8], 9) + ZE(Ry[15:8], 9) + 1, 1);
Rd[7:0] ←
LSR(ZE(Rx[7:0], 9) + ZE(Ry[7:0], 9) + 1, 1);
II.
Rd[31:16] ← ASR(SE(Rx[31:16], 17) + SE(Ry[31:16], 17) + 1, 1);
Rd[15:0]
← ASR(SE(Rx[15:0], 17) + SE(Ry[15:0], 17) + 1, 1);
Sintaxe:
I.
pavg.ub
II.
pavg.sh
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
PLSL.{B/H} – empacota o deslocamento lógico a esquerda
descrição:
realizar um deslocamento lógico à direita em cada um dos bytes
empacotados ou meias palavras e armazena os resultados nos
respectivos registadores destinos.
Operação:
I.
Rd[31:24] ← LSL(Rs[31:24], sa3);
Rd[23:16]
← LSL(Rs[23:16], sa3);
Rd[15:8]
← LSL(Rs[15:8], sa3);
Rd[7:0] ←
LSL(Rs[7:0], sa3);
II.
Rd[31:16] ← LSL(Rs[31:16], sa4);
Rd[15:0]
← LSL(Rs[15:0], sa4);
Sintaxe:
I. plsl.b
II.
plsl.h
Rd, Rs,
sa
Rd, Rs,
sa
Operandos:
I, II. {d, s} ∈ {0, 1, ..., 15}
I.
sa ∈
{0, 1, ..., 7}
II.
sa ∈
{0, 1, ..., 15}
PLSR.{B/H} – empacota o deslocamento lógico a direita
descrição: realizar um deslocamento lógico à
direita em cada um dos bytes empacotados ou meias palavras e armazena
os resultados nos respectivos registadores destinos.
Sintaxe:
I.
plsr.b
II.
plsr.h
Rd, Rs,
sa
Rd, Rs,
sa
Operandos:
I, II. {d, s} ∈ {0, 1, ..., 15}
I.
sa ∈
{0, 1, ..., 7}
II.
sa ∈
{0, 1, ..., 15}
PMAX.{UB/SH} – Empacota o valor máximo
Descrição: Calcule os valores máximos dos pares de bytes
empacotados sem sinal (pmax.ub) ou meias palavras empacotadas com
sinal (pmax.sh).
Operação:
I.
If ( Rx[31:24] > Ry[31:24] ) then Rd[31:24] ← Rx[31:24] else
Rd[31:24] ← Ry[31:24] ;
If (
Rx[23:16] > Ry[23:16] ) then Rd[23:16] ← Rx[23:16] else
Rd[23:16] ← Ry[23:16] ;
If (
Rx[15:8] > Ry[15:8] ) then Rd[15:8] ← Rx[15:8] else Rd[15:8] ←
Ry[15:8] ;
If (
Rx[7:0] > Ry[7:0] ) then Rd[7:0] ← Rx[7:0] else Rd[7:0] ←
Ry[7:0] ;
II.
If (
Rx[31:16] > Ry[31:16] ) then Rd[31:16] ← Rx[31:16] else
Rd[31:16] ← Ry[31:16] ;
PMIN.{UB/SH} – Empacota o valor mínimo
Descrição: Calcule os valores mínimos dos pares de bytes
empacotados sem sinal (pmin.ub) ou meias palavras empacotas sem sinal
(pmin.sh).
Operação:
I.
If ( Rx[31:24] < Ry[31:24] ) then Rd[31:24] ← Rx[31:24] else
Rd[31:24] ← Ry[31:24] ;
If (
Rx[23:16] < Ry[23:16] ) then Rd[23:16] ← Rx[23:16] else
Rd[23:16] ← Ry[23:16] ;
If (
Rx[15:8] < Ry[15:8] ) then Rd[15:8] ← Rx[15:8] else Rd[15:8] ←
Ry[15:8] ;
If (
Rx[7:0] < Ry[7:0] ) then Rd[7:0] ← Rx[7:0] else Rd[7:0] ←
Ry[7:0] ;
II.
If (
Rx[31:16] < Ry[31:16] ) then Rd[31:16] ← Rx[31:16] else
Rd[31:16] ← Ry[31:16] ;
If (
Rx[15:0] < Ry[15:0] ) then Rd[15:0] ← Rx[15:0] else Rd[15:0] ←
Ry[15:0] ;
Sintaxe:
I.
pmin.ub
Rd, Rx,
Ry
II.
pmin.sh
Rd, Rx,
Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
PSAD – empacota a diferença absoluta da soma
Descrição: Calcule a soma absoluta das diferenças (SAD) de quatro
pares de bytes empacotados sem sinal a partir dos registradores de
origem e armazena o resultado no registrador de destino.
Operação:
I. Rd ← | Rx[31:24] - Ry[31:24] | + | Rx[23:16] - Ry[23:16] | +
|
Rx[15:8] - Ry[15:8] | + | Rx[7:0] - Ry[7:0] |;
Sintaxe:
I.
psad
Rd, Rx,
Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
PSUB.{B/H} – empacota a subtração
Descrição:
Realizar a subtração de quatro pares de bytes empacotados (psub.b)
ou dois pares de meias palavras (psub.h). Após são descartados o
estouro adicional em qualquer bit e o resultado é enrolado.
Operação:
I.
Rd[31:24] ← Rx[31:24] - Ry[31:24]; Rd[23:16] ← Rx[23:16] -
Ry[23:16];
Rd[15:8]
← Rx[15:8] - Ry[15:8]; Rd[7:0] ← Rx[7:0] - Ry[7:0];
II.
Rd[31:16] ← Rx[31:16] - Ry[31:16];
Rd[15:0]
← Rx[15:0] - Ry[15:0];
Sintaxe:
I.
psub.b
II.
psub.h
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II. {d, x, y} ∈ {0, 1, ..., 15}
PSUBADD.H – Empacota a meia palavra da subtração e adição
Descrição:
Realizar uma subtração e adição em meia palavra nos mesmos
operandos que são selecionados a partir dos registrador de origem.
Os dois meias palavras resultantes são empacotados no registrador
destino sem realizar qualquer saturação.
Operação:
I.
If (Rx-part == t) then operand1 = Rx[31:16] else operand1 =
Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← operand1 - operand2;
Rd[15:0]
← operand1 + operand2;
Sintaxe:
I.
psubadd.h
Rd,
Rx:<part>, Ry:<part>
Operandos:
I.
{d, x, y} ∈ {0, 1, ..., 15}
/ part ∈ {t,b}
PSUBADDH.SH – Empacota subtração de meia palavra com sinal e adição com redução à metade
Descrição: Realiza uma subtração e adição nos mesmos operandos
meia palavra que são selecionados a partir dos registrores de
origem. Os resultados em meia palavra são reduzidos pela metade a
fim de evitar que ocorram em excessos.
Operação:
I.
If (Rx-part == t) then operand1 = Rx[31:16] else operand1 =
Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← ASR(SE(operand1, 17) - SE(operand2, 17), 1);
Rd[15:0]
← ASR(SE(operand1, 17) + SE(operand2, 17), 1);
Sintaxe:
I.
psubaddh.sh
Rd,
Rx:<part>, Ry:<part>
Operandos:
I.
{d, x, y} ∈ {0, 1, ..., 15}
/ part ∈ {t,b}
PSUBADDS.{UH/SH} – Empacota a subtração de meia palavra e adição com saturação
Descrição: Realizar uma subtração e adição nos mesmos operandos
em meia palavra que são selecionados a partir dos registrores de
origem. As meias palavras resultantes estão saturados sem sinal
(psubadds.uh) ou meias palavras com sinal (psubadds.sh) e, em
seguida, empacotado em conjunto no registrador destino.
Operação:
I.
If (Rx-part == t) then operand1 = Rx[31:16] else operand1 =
Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← SATSU(ZE(operand1, 17) - ZE(operand2, 17), 16);
Rd[15:0]
← SATU(ZE(operand1, 17) + ZE(operand2, 17), 16);
II.
If
(Rx-part == t) then operand1 = Rx[31:16] else operand1 = Rx[15:0];
If
(Ry-part == t) then operand2 = Ry[31:16] else operand2 = Ry[15:0];
Rd[31:16]
← SATS(SE(operand1, 17) - SE(operand2, 17), 16 );
Rd[15:0]
← SATS(SE(operand1, 17) + SE(operand2, 17), 16);
Sintaxe:
I.
psubadds.uh
II.
psubadds.sh
Rd,
Rx:<part>, Ry:<part>
Rd,
Rx:<part>, Ry:<part>
Operands:
I.
{d, x, y} ∈ {0, 1, ..., 15}
/ part ∈ {t,b}
PSUBH.{UB/SH} – Empacota a subtração com redução à metade
Descrição: Realiza a subtração de quatro pares de bytes sem sinal
empacotados (psub.ub) ou dois pares de meias palavras com sinal
(psub.sh) com redução à metade do resultado para evitar que
ocorram transbordamentos.
Operação:
I.
Rd[31:24] ← LSR(ZE(Rx[31:24], 9) - ZE(Ry[31:24], 9), 1);
Rd[23:16]
← LSR(ZE(Rx[23:16], 9) - ZE(Ry[23:16], 9), 1);
Rd[15:8]
← LSR(ZE(Rx[15:8], 9) - ZE(Ry[15:8], 9), 1);
Rd[7:0] ←
LSR(ZE(Rx[7:0], 9) - ZE(Ry[7:0], 9), 1);
II.
Rd[31:16] ← ASR(SE(Rx[31:16], 17) - SE(Ry[31:16], 17), 1);
Rd[15:0]
← ASR(SE(Rx[15:0], 17) - SE(Ry[15:0], 17), 1);
Sintaxe:
I.
psubh.ub
II.
psubh.sh
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
PSUBS.{UB/SB/UH/SH} – Empacota a subtração com saturação
Descrição: Executa a subtração de quatro pares de bytes
empacotados ou dois pares de meias palavras. O resultado é saturado
em bytes sem sinal (psubs.ub), bytes com sinal (psubs.sb), meia
palavra sem sinal (psubs.uh) ou meia palavra sem sinal (psubs.sh).
Operação:
I.
Rd[31:24] ← SATSU(ZE(Rx[31:24], 9) - ZE(Ry[31:24], 9), 8) ;
Rd[23:16]
← SATSU(ZE(Rx[23:16], 9) - ZE(Ry[23:16], 9), 8);
Rd[15:8]
← SATSU(ZE(Rx[15:8], 9) - ZE(Ry[15:8], 9), 8);
Rd[7:0] ←
SATSU(ZE(Rx[7:0], 9) - ZE(Ry[7:0], 9), 8);
II.
Rd[31:24] ← SATS(SE(Rx[31:24], 9) - SE(Ry[31:24], 9), 8);
Rd[23:16]
← SATS(SE(Rx[23:16], 9) - SE(Ry[23:16], 9), 8);
Rd[15:8]
← SATS(SE(Rx[15:8], 9) - SE(Ry[15:8], 9), 8);
Rd[7:0] ←
SATS(SE(Rx[7:0], 9) - SE(Ry[7:0], 9), 8);
III.
Rd[31:16] ← SATSU(ZE(Rx[31:16], 17) - ZE(Ry[31:16], 17), 16);
Rd[15:0]
← SATSU(ZE(Rx[15:0], 17) - ZE(Ry[15:0], 17), 16);
IV.
Rd[31:16] ← SATS(SE(Rx[31:16], 17) - SE(Ry[31:16], 17), 16);
Rd[15:0]
← SATS(SE(Rx[15:0], 17) - SE(Ry[15:0], 17), 16);
Sintaxe:
I.
psubs.ub
Rd, Rx,
Ry
II.
psubs.sb
Rd, Rx,
Ry
III.
psubs.uh
Rd, Rx,
Ry
IV.
psubs.sh
Rd, Rx,
Ry
Operandos:
I, II, III, IV.{d, x, y} ∈ {0, 1, ..., 15}
PSUBX.H – Embalado meia palavra subtração com operando cruzados
Descrição: Subtrai a metade inferior da palavra em Ry com a metade
superior palavra em Rx e a metade superior palavra em Ry com a da
metade inferior da palavra em Rx. As meias palavras resultantes são
embalados juntas no registrador de destino sem realizar qualquer
saturação.
Operação:
I.
Rd[31:16] ← Rx[31:16] - Ry[15:0] ;
Rd[15:0]
← Rx[15:0] - Ry[31:16];
Sintaxe:
I.
psubx.h
Rd, Rx,
Ry
Operandos:
I.
{d, x, y} ∈ {0, 1, ..., 15}
PSUBXH.SH – embala a subtração com sinal das meias palavras com Operando cruzados e redução a metade
Descrição: Subtraia a metade inferior da palavra em Ry com a metade
superior da palavra em Rx e a metade superior da palavra em Ry com a
metade inferior da palavra em Rx. As meias palavras resultantes são
reduzidos a metade, de modo a evitar qualquer transbordamento e, em
seguida, embalados em conjunto no registrador de destino.
Operação:
I.
Rd[31:16] ← ASR(SE(Rx[31:16], 17) - SE(Ry[15:0], 17), 1);
Rd[15:0]
← ASR(SE(Rx[15:0], 17) - SE(Ry[31:16], 17), 1);
Sintaxe:
I.
psubxh.sh
Rd, Rx,
Ry
Operandos:
I.
{d, x, y} ∈ {0, 1, ..., 15}
PSUBXS.{UH/SH} – Empacota a subtração das meias palavras com operandos cruzados e saturação
Descrição:
Subtrai a metade inferior da meia palavra em Ry com a metade superior
da palavra em Rx e metade superior da palavra em Ry com a metade
inferior da palavra em Rx. As meias palavras resultantes estão
saturadas na meia palavra sem sinal (psubxh.uh) ou na meia palavra
com sinal (psubxh.sh) e em seguida embalados em conjunto no
registrador destino.
Operação:
I.
Rd[31:16] ← SATSU(ZE(Rx[31:16], 17) - ZE(Ry[15:0], 17), 16) ;
Rd[15:0]
← SATSU(ZE(Rx[15:0], 17) - ZE(Ry[31:16], 17), 16);
II.
Rd[31:16] ← SATS(SE(Rx[31:16], 17) - SE(Ry[15:0], 17), 16) ;
Rd[15:0]
← SATS(SE(Rx[15:0], 17) - SE(Ry[31:16], 17), 16);
Sintaxe:
I.
psubxs.uh
II.
psubxs.sh
Rd, Rx,
Ry
Rd, Rx,
Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
PUNPCK{SB/UB}.H – descompacta um byte em duas meia palavras
Descrição:
Descompacta dois bytes sem sinal (punpckub.h) ou dois bytes com sinal
(punpcksb.h) do registador fonte para duas meia palavras embaladas no
registrador destino.
Operação:
I.
se ( Rs-part == top ) então
Rd[31:16]
← ZE(Rs[31:24], 16); Rd[15:0] ← ZE(Rs[23:16], 16);
senão
Rd[31:16]
← ZE(Rs[15:8], 16); Rd[15:0] ← ZE(Rs[7:0], 16);
II.
se (
Rs-part == top ) então
Rd[31:16]
← SE(Rs[31:24], 16); Rd[15:0] ← SE(Rs[23:16], 16);
senão
Rd[31:16]
← SE(Rs[15:8], 16); Rd[15:0] ← SE(Rs[7:0], 16);
Sintaxe:
I.
punpckub.h
II.
punpcksb.h
Rd,
Rs:<part>
Rd,
Rs:<part>
Operandos:
I, II.
{d, s} ∈ {0, 1, ..., 15}
/ part ∈ {t, b}
If (
Rx[15:0] > Ry[15:0] ) then Rd[15:0] ← Rx[15:0] else Rd[15:0] ←
Ry[15:0] ;
Sintaxe:
I.
pmax.ub
Rd, Rx, Ry
II.
pmax.sh Rd, Rx, Ry
Operandos:
I, II.
{d, x, y} ∈ {0, 1, ..., 15}
Nenhum comentário:
Postar um comentário