Procesory sygnałowe
Wykład 4
Asembler procesora
ADSP-21065L (operacje ALU,
mnożarki i przesuwnika
bitowego)
Dr inż. Robert
Wielgat
Grupy instrukcji procesora
ADSP – 21065L
Językiem asemblera dla procesora ADSP-21065L jest język
easm21k
przeznaczony dla procesorów ADSP-21x6x typu
SHARC. W języku asemblera easm21k można wyróżnić
następujące grupy instrukcji:
• instrukcje arytmetyczne i zapisujące
• instrukcje sterujące
• instrukcje pośredniego zapisywania (ang. Immediate
move)
• pozostałe instrukcje
Każdy rozkaz asemblera należy zkończyć znakiem
‘;’
(średnik)
Komentarze zaczynają się od znaków
‘//’ (podwójny
ukośnik)
Rozróżniane są duże i małe litery
Oznaczenia rejestrów
Typ rejestru
Oznaczenie
rejestru
Funkcja rejestru
Plik
rejestrów
R0 – R15
Rejestry z pliku rejestrów. operacje
stałoprzecinkowe
F0 – F15
Rejestry z pliku rejestrów. operacje
zmiennoprzecinkowe
Sekwenter
Programow
y
PC
Licznik programu (tylko do odczytu)
PCSTK
Szczyt stosu PC (licznika programu)
PCSTKP
Wskaźnik stosu PC
FADDR
Pobieranie adresu (tylko do odczytu)
DADDR
Dekodowanie adresu (tylko do
odczytu)
LADDR
Adres zakończenia pętli (szczyt stosu
adresów pętli)
CURLCNTR
Licznik bieżącej pętli: szczyt stosu
licznika pętli
LCNTR
Liczba pętli dla następnej
zagnieżdżonej pętli kontrolowanej
przez licznik
Oznaczenia rejestrów
Typ
rejestru
Oznaczenie
rejestru
Funkcja rejestru
Rejestry
generatoró
w adresów
danych
I0-I7
Rejestry indeksowe DAG1
M0 – M7
Rejestry modyfikujące DAG1
L0 – L7
Rejestry długości (length) DAG1
B0 – B7
Rejestry bazowe DAG1
I8 – I15
Rejestry indeksowe DAG2
M8 – M15
Rejestry modyfikujące DAG2
L8 – L15
Rejestry długości DAG2
B8 – B15
Rejestry bazowe DAG2
Rejestry
wymiany
danych
PX1
Wymiana danych między PMD a DMD
(16 bitów)
PX2
Wymiana danych między PMD a DMD
(32 bity)
PX
48-bitowe połączenie PX1 oraz PX2
Operacje stałoprzecinkowe na
ALU – dodawanie i odejmowanie
Rn = Rx + Ry
np. R1 = R2 +
R3
Rn = Rx - Ry
Rn = Rx + Ry + CI
(
dodawanie z
przeniesieniem
)
Rn = Rx - Ry + CI -1
(
odejmowanie z pożyczką
)
32-bitowy wynik jest zapisywany w stałoprzecinkowym polu 40-
bitowego rejestru Rn.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ jeżeli wynik jest zerowy, AN jeżeli najbardziej znaczący bit
jest jedynką, AV jeżeli wystąpi przepełnienie, AC jeżeli wystąpi
przeniesienie (pożyczka), pozostałe flagi (AU, AS, AI) są
zerowane.
Przykład dodawania i
odejmowania
// Realizowana operacja dodawania:
// a = b + c – (d + e)
R2 = 67;
// b=67
R3 = 12;
// c=12
R4 = 31;
// d=31
R5 = 8;
// e = 8
R1 = R2 + R3;
// R1 = b + c
R6 = R4 + R5;
// R6 = d + e
R1 = R1 – R6;
// nowa zawartość R1 = stara
zawartość
// R1 – zawartość R6: a
= b + c - (d + e)
Operacje stałoprzecinkowe na
ALU
Rn = (Rx + Ry)/2
COMP(Rx, Ry)
(
operacja porównania
)
Tryb zaokrąglania może być zaokrąglaniem ku najbliższemu
(toward nearest) lub zaokrąglaniem przez obcięcie (truncation)
Powyższa operacja ustawia następujące flagi w rejestrze ASTAT:
AZ jeżeli wynik jest zerowy, AN jeżeli najbardziej znaczący bit
jest jedynką, AC jeżeli wystąpi przeniesienie (pożyczka),
pozostałe flagi (AV, AU, AS, AI) są zerowane.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ jeżeli operand Rx jest równy operandowi Ry,wynik jest
zerowy, AN jeżeli operand Rx jest mniejszy niż operand Ry,
pozostałe flagi (AV, AC, AU, AS, AI, ) są zerowane.
Rejestr
ASTAT
przechowuje wyniki
8 ostatnich wyników
porównań na bitach 24:31 (CACC0:CACC7).
Operacje stałoprzecinkowe na
ALU
Rn = Rx + CI
(
dodawanie przeniesienia
)
Rn = Rx + CI - 1
(
dodawanie pożyczki
)
Rn = Rx + 1
(
inkrementacja
)
Rn = Rx – 1
(
dekrementacja
)
32-bitowy wynik jest zapisywany w stałoprzecinkowym polu 40-
bitowego rejestru Rn.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ jeżeli wynik jest zerowy, AN jeżeli najbardziej znaczący bit
jest jedynką, AV jeżeli wystąpi przepełnienie, AC jeżeli wystąpi
przeniesienie (pożyczka), pozostałe flagi (AU, AS, AI) są
zerowane.
Rn = - Rx
Operacje stałoprzecinkowe na
ALU
Rn = ABS Rx
(
wartość bezwzględna
)
Rn = PASS Rx
Powyższa operacja ustawia następujące flagi w rejestrze ASTAT:
AZ i AN jak w poprzednim rozkazie, AV jeżeli wystąpi
przepełnienie, AC jeżeli wystąpi przeniesienie (pożyczka), AS
jeżeli Rx jest ujemne, flagi AU, AI są zerowane.
Powyższa operacja
przenosi
operand
Rx
za pomocą ALU
do
rejestru Rn
.
Operacja ustawia następujące flagi w rejestrze ASTAT: AZ i AN jak
w poprzednim rozkazie, flagi AU, AV, AC, AS, AI są zerowane.
Operacje stałoprzecinkowe na
ALU
Rn = Rx AND Ry
Rn = Rx OR Ry
Rn = Rx XOR Ry
Rn = NOT Rx
Powyższe operacje stanowią grupę
operacji logicznych
z
wykorzystaniem ALU. Operacje logiczne wykonywane są na
każdej parze
odpowiadających sobie bitów
operandów Rx
oraz Ry, a w przypadku instrukcji NOT na każdym bicie
operandu Rx.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ, AN, AV, AC, AU, AS, AI jak w poprzednim rozkazie.
Operacje stałoprzecinkowe na
ALU
Rn = MIN(Rx,Ry)
Rn = MAX(Rx,Ry)
Rn = CLIP Rx BY Ry
Powyższe operacje zwracają
mniejszy
albo
większy
z
operandów Rx, Ry.
Powyższe operacje ustawiają następujące flagi w rejestrze ASTAT:
AZ, AN, AV, AC, AU, AS, AI jak w poprzednim rozkazie.
Powyższa operacja zwraca operand
Rx
jeżeli
wartość
bezwzględna
operandu
Rx
jest
mniejsza niż
wartość
bezwzględna
operandu
Ry
. W przeciwnym przypadku zwraca
|
Ry|
jeżeli
Rx
jest
dodatnie
oraz
-|Ry|
jeżeli
Rx
jest
ujemne
.
Powyższe operacje ustawiają następujące flagi w rejestrze ASTAT:
AZ, AN, AV, AC, AU, AS, AI jak w poprzednim rozkazie.
Operacje zmiennoprzecinkowe
na ALU
Fn = Fx + Fy
np. F1 =
F2 + F3
Fn = Fx - Fy
W powyższych operacjach jest wykonywane
dodawanie
(
odejmowanie
)
liczb zmiennoprzecinkowych
oraz
średnia
dwóch liczb
. Znormalizowany wynik jest umieszczany w
rejestrze Fn. W operacjach wykorzystywane są dwa tryby
zaokrągleń: zaokrąglenie ku najbliższemu (toward nearest) lub
zaokrąglenie przez obcięcie do zakresu 32 lub 40 bitowego.
Powyższe operacje ustawiają następujące flagi w rejestrze ASTAT:
AZ jeżeli zaokrąglony wynik jest niestandardowy (wykładnik
potęgi
e < -126) lub zerowy, AU jeżeli zaokrąglony wynik jest
niestandardowy, AN jeżeli wynik jest ujemny, AV jeżeli wystąpi
przepełnienie zaokrąglonego wyniku (wykładnik potęgi e > +127)
, AI jeżeli obydwa wejściowe operandy nie są liczbami (NaN) lub
mają wartości nieskończoność o przeciwnych znakach, flagi AC,
AS są zerowane.
Fn = (Fx +
Fy)/2
Operacje zmiennoprzecinkowe
na ALU
Fn = ABS(Fx + Fy)
Fn = ABS(Fx – Fy)
W powyższych operacjach jest obliczana
wartość
bezwzględna sumy
(
różnicy
) dwóch liczb
zmiennoprzecinkowych:
Fx
oraz
Fy
. Znormalizowany wynik jest
umieszczany w rejestrze Fn. W operacjach wykorzystywane są
dwa tryby zaokrągleń: zaokrąglenie ku najbliższemu (toward
nearest) lub zaokrąglenie przez obcięcie do zakresu 32 lub 40
bitowego.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ jeżeli zaokrąglony wynik jest niestandardowy (wykładnik
potęgi
e < -126) lub zerowy, AU jeżeli zaokrąglony wynik jest
niestandardowy, AV jeżeli wystąpi przepełnienie zaokrąglonego
wyniku (wykładnik potęgi e > +127)
, AI jeżeli obydwa
wejściowe operandy nie są liczbami (NaN) lub mają wartości
nieskończoność o przeciwnych znakach, flagi AN, AC, AS są
zerowane.
Operacje zmiennoprzecinkowe na ALU
COMP(Fx, Fy)
(
operacja porównania
)
Operacja porównania liczb zmiennoprzecinkowych działa
analogicznie jak operacja porównania liczb stałoprzecinkowych.
Jedyna różnica polega na ustawianiu flagi AI jeżeli którykolwiek
z operandów jest typu NaN w przypadku porównania liczb
zmiennoprzecinkowych. W przeciwnym przypadku flaga AI jest
zerowana.
Fn = - Fx
Operacja
zmienia znak
operandu na przeciwny.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ jeżeli wynik jest zerowy, AN jeżeli wynik operacji jest ujemny,
AI jeżeli wynik operacji jes typu NaN, flagi AV, AC, AU, AS są
zerowane.
Operacje zmiennoprzecinkowe na ALU
Fn=ABS Fx
Operacja zwraca
wartość bezwzględną
operandu w rejestrze
Fx przez ustawienie bitu znaku operandu na zero.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ jeżeli wynik jest równy +zero., AS jeżeli operand wejściowy
jest ujemny, AI jeżeli wynik operacji jes typu NaN, flagi AV, AC,
AU, AS są zerowane.
Fn = PASS Fx
Operacja
przenosi
zmiennoprzecinkowy operand
Fx
przez ALU
do
zmiennoprzecinkowego pola w rejestrze
Fn
.
Powyższe operacje ustawiają następujące flagi w rejestrze
ASTAT:
AZ jeżeli wynik jest +/- zero, AN jeżeli wynik operacji jest
ujemny, AI jeżeli wynik operacji jes typu NaN, flagi AV, AC, AU,
AS są zerowane.
Operacje zmiennoprzecinkowe na ALU
Fn=RND Fx
Operacja
zaokrągla
zmiennoprzecinkowy operand w rejestrze
Fx do zakresu 32 bitów. Zaokrąglanie może być w kierunku zera
lub ku najbliższemu zgodnie z ustawieniem bitu zaokrągleń w
rejestrze MODE1.
Fn = SCALB Fx BY Ry
Skaluje
wykładnik operandu w rejestrze Fx poprzez dodanie do
niego stałoprzecinkowej liczby w kodzie uzupełnień do dwóch z
rejestru Ry.
Rn = MANT Fx
Operacja
zwraca mantysę
(część ułamkową z
jawnym
bitem
ukrytym z pominięciem bitu znaku zmiennoprzecinkowego
operandu w Fx. Mantysa jest zapisywana w formacie 1.31 w
stałoprzecinkowym polu w rejestrze Rn
Rn = LOGB Fx
Przekształca wykładnik zmiennoprzecinkowego operandu w Fx
w stałoprzecinkową liczbę bez znaku w kodzie uzupełnień do
dwóch.
Operacje zmiennoprzecinkowe na ALU
Rn = FIX Fx
Rn = TRUNC Fx
Operacja przekształca zmiennoprzecinkowy operand z rejestru Fx
na 32-bitową liczbę całkowitą w kodzie uzupełnień do dwóch.
Jeżeli bit TRUNC w rejestrze MODE1 jest ustawiony na 1 operacja
FIX obcina mantysę w kierunku -nieskończoność, jeżeli
natomiast bit TRUNC w rejestrze MODE1 jest ustawiony na 0
operacja FIX zaokrągla mantysę do najbliższej liczby całkowitej.
Operacja TRUNC zawsze obcina mantysę w kierunku zera
niezależnie od ustawienia bitu TRUNC.
Rn = FIX Fx BY Ry
Rn = TRUNC Fx BY Ry
W powyższych operacjach przed konwersją do wykładnika
potęgi operandu w rejestrze Fx jest dodawany całkowity
stałoprzecinkowy czynnik skalujący w kodzie uzupełnień do
dwóch zapisany w Ry. Wynik operacji jest zapisywany w
stałoprzecinkowym polu rejestru Rn w formacie 32.0
Operacje zmiennoprzecinkowe na ALU
Fn = FLOAT Rx
Operacja przekształca stałoprzecinkowy operand z rejestru Rx na
liczbę zmiennoprzecinkową.
W powyższej operacji przed konwersją do wykładnika potęgi
operandu w rejestrze Rx jest dodawany całkowity
stałoprzecinkowy czynnik skalujący w kodzie uzupełnień do
dwóch zapisany w Ry.
Fn = FLOAT Rx BY Ry
Fn = RECIPS Fx
Operacja zwraca liczbę stanowiącą podstawę do obliczenia
odwrotności operandu Fx. Wartości zwracanych liczb są
stablicowane w wewnętrznej pamięci ROM.
Fn = RSQRTS Fx
Operacja zwraca liczbę stanowiącą podstawę do obliczenia
odwrotności pierwiastka kwadratowego operandu Fx. Wartości
zwracanych liczb są stablicowane w wewnętrznej pamięci ROM.
Operacje zmiennoprzecinkowe na ALU
Fn = Fx COPYSIGN Fy
Operacja
kopiuje znak
zmiennoprzecinkowego operandu z Fy do
operandu Fx nie zmieniając jego mantysy i wykładnika. Rezultat jest
zapisywany do rejestru Fn.
Fn = MIN(Fx,Fy)
Fn = MAX(Fx,Fy)
Działanie analogiczne jak w przypadku Rn = MAX(Rx, Ry). Dodatkowo
jest ustawiana flaga AI w przypadku, gdy przynajmniej jeden z
operandów jest typu NaN.
Fn = CLIP Fx BY Fy
Działanie analogiczne jak w przypadku Rn = MIN(Rx, Ry). Dodatkowo
jest ustawiana flaga AI w przypadku, gdy przynajmniej jeden z
operandów jest typu NaN.
Działanie analogiczne jak w przypadku Rn = CLIP Rx by Ry.
Operacja zwraca
operand Fx jeżeli wartość bezwzględna operandu Fx jest mniejsza niż
wartość bezwzględna operandu Fy. W przeciwnym przypadku zwraca |Fy|
jeżeli Fx jest dodatnie oraz -|Fy| jeżeli Fx jest ujemne. Dodatkowo jest
ustawiana flaga AI w przypadku, gdy przynajmniej jeden z operandów jest
typu NaN
Operacje
mnożarki
Rn = Rx * Ry
MRF = Rx * Ry mod2
MRB = Rx * Ry mod2
Operacja
oblicza iloczyn operandów
z rejestrów Rx oraz Ry. Wynik jest
zapisywany do rejestru Rn lub do jednego z rejestrów akumulacyjnych
mnożarki MRF oraz MRB. Jeżeli jako rejestr docelowy jest określony rejestr
Rn wówczas jest zapisywana jedynie 32-bitowa część wyniku. Jeżeli są
wyspecyfikowane rejestry MRF lub MRB wówczas jest zapisywany cały 80-
bitowy wynik.
Ustawiane flagi: MN jeżeli wynik jest ujemny; MV jeżeli nie wszystkie
najbardziej znaczące bity wyniku są równe 0 (wynikiem jest liczba ze
znakiem lub bez znaku) lub 1 (wynikiem jest liczba ze znakiem). Liczba
najbardziej znaczących bitów wyniku zależy od formatu. 49 bitów (48
bitów)– liczba całkowita bez znaku (ze znakiem), 33 bity (32 bity)– liczba
ułamkowa bez znaku (ze znakiem); MU jeżeli 48 najbardziej znaczących
bitów wyniku ułamkowego jest równych zero (wynikiem jest liczba ze
znakiem lub bez znaku)
lub jeden (wynikiem jest liczba ze znakiem), a nie
wszystkie 32 mniej znaczące bity są równe zero. Jest to sytuacja tzw.
niedomiaru (ang. underflow). W przypadku liczb całkowitych niedomiar nie
występuje; Flaga MI jest zerowana.
Operacje MAC mnożarki
Rn = MRF + Rx * Ry mod2
Rn = MRB + Rx * Ry mod2
MRF = MRF + Rx * Ry mod2
MRB = MRB + Rx * Ry mod2
Operacja
oblicza iloczyn operandów
z rejestrów Rx oraz Ry i
dodaje wynik
do wyspecjalizowanego rejestru MR. Wynik jest zapisywany do rejestru Rn
lub do jednego z rejestrów akumulacyjnych mnożarki MRF oraz MRB. W
przypadku liczb ułamkowych wynik jest zaokrąglany o ile jest aktywny
tryb zaokrąglania. Jeżeli jako rejestr docelowy jest określony rejestr Rn
wówczas jest zapisywana jedynie 32-bitowa część wyniku. Jeżeli są
wyspecyfikowane rejestry MRF lub MRB wówczas jest zapisywany cały 80-
bitowy wynik.
Ustawiane flagi: tak jak w przypadku operacji mnożenia
Operacje MAC mnożarki
(odejmowanie)
Rn = MRF - Rx * Ry mod2
Rn = MRB - Rx * Ry mod2
MRF = MRF - Rx * Ry mod2
MRB = MRB - Rx * Ry mod2
Operacja
oblicza iloczyn operandów
z rejestrów Rx oraz Ry i
odejmuje
wynik
od zawartości rejestru MR. Wynik jest zapisywany do rejestru Rn
lub do jednego z rejestrów akumulacyjnych mnożarki MRF oraz MRB. W
przypadku liczb ułamkowych wynik jest zaokrąglany o ile jest aktywny
tryb zaokrąglania. Jeżeli jako rejestr docelowy jest określony rejestr Rn
wówczas jest zapisywana jedynie 32-bitowa część wyniku. Jeżeli są
wyspecyfikowane rejestry MRF lub MRB wówczas jest zapisywany cały 80-
bitowy wynik.
Ustawiane flagi: tak jak w przypadku operacji mnożenia
Operacje mnożarki
Rn = SAT MRF
Rn = SAT MRB mod1
MRF = SAT MRF mod1
MRB = SAT MRB mod1
Jeżeli wartość w wyspecyfikowanym rejestrze jest większa niż wartość
maksymalna wyspecyfikowanego formatu danych wówczas mnożarka
ustawia wynik operacji na maksimum. W innym przypadku wartość w
rejestrze MR nie jest zmieniana. Jeżeli jako rejestr docelowy jest określony
rejestr Rn wówczas jest zapisywana jedynie 32-bitowa część wyniku. Jeżeli
są wyspecyfikowane rejestry MRF lub MRB wówczas jest zapisywany cały
80-bitowy wynik.
Ustawiane flagi: MN jeżeli wynik jest ujemny; MV jest zerowana; MU jeżeli
48 najbardziej znaczących bitów wyniku ułamkowego jest równych zero
(wynikiem jest liczba ze znakiem lub bez znaku)
lub jeden (wynikiem jest
liczba ze znakiem), a nie wszystkie 32 mniej znaczące bity są równe zero.
Jest to sytuacja tzw. niedomiaru (ang. underflow). W przypadku liczb
całkowitych niedomiar nie występuje; Flaga MI jest zerowana.
Operacje mnożarki
Rn = RND MRF mod1
Rn = RND MRB mod1
MRF = RND MRF mod1
MRB = RND MRB mod1
Zaokrągla wartość w rejestrze MR ku najbliższemu na pozycji 32 bitu.
Jeżeli jako rejestr docelowy jest określony rejestr Rn wówczas jest
zapisywana jedynie 32-bitowa część wyniku. Jeżeli są wyspecyfikowane
rejestry MRF lub MRB wówczas jest zapisywany cały 80-bitowy wynik.
Ustawiane flagi: tak jak w przypadku operacji mnożenia
MRF = 0
MRB = 0
Zeruje wszystkie bity wyspecyfikowanego rejestru MR.
Ustawiane flagi: Flagi MN, MV, MU, MI są zerowane
Operacje mnożarki
MR =Rn
Rn = MR
Operacja przenoszenia danych. Przeniesienie danych do rejestru MR
powoduje wpisanie stałoprzecinkowego pola w rejestrze Rn do
wyspecyfikowanego rejestru MR. Transfer do rejestru Rn powoduje
transfer zawartości określonego rejestru MR do stałoprzecinkowego pola w
rejestrze Rn. MR może przyjmować wartość: MR0F, MR1F, MR2F, MR0B,
MR1B, MR2B.
Ustawiane flagi: Flagi MN, MV, MU, MI są zerowane
Fn = Fx * Fy
Mnożenie dwóch zmiennoprzecinkowych operandów Fx oraz Fy.
Wynik jest umieszczany w rejestrze Fn.
Ustawiane flagi: MN jest ustawiane, gdy wynik operacji jest ujemny,
MV jest ustawiane, gdy wykładnik potęgowy wyniku jest większy niż
127, MU jest ustawiane, gdy wykładnik potęgowy wyniku jest
mniejszy niż -126, MI jest ustawiane, gdy jeden z operandów
wejściowych jest typu NaN, lub gdy posiada wartość +/-
nieskończoność lub +/- zero.
Operacje przesuwania logicznego
Rn = LSHIFT Rx BY Ry
Rn = LSHIFT Rx BY <data8>
Operacja
logicznie przesuwa
zawartość Rx o 32-bitową wartość zawartą
w rejestrze Ry lub 8-bitową wartość natychmiastową podaną w kodzie
rozkazu. Wynik jest zapisywany na 32 najstarszych bitach rejestru Rn.
Dodatnia wartość
natychmiastowa lub w rejestrze Ry powoduje
przesuwanie logiczne bitów
w lewo
natomiast
ujemna w prawo
. 8-
bitowa wartość natychmiastowa z zakresu od -128 do 127 pozwala na
przesuwanie bitów poza 32 bitowe stałoprzecinkowe pole bitowe w lewą
lub prawą stronę.
Flaga SZ jest ustawiana jeżeli wynik przesuwania jest równy zero, w
innym przypadku jest zerowana. Flaga SV jest ustawiana jeżeli wartość w
rejestrze Rx jest przesuwana więcej niż 0, w przeciwnym przypadku jest
zerowana. Flaga SS jest zerowana
Rn = Rn OR LSHIFT Rx BY Ry
Rn = Rn OR LSHIFT Rx BY <data8>
Działanie operacji jak wyżej. Dodatkowo jest dokonywana suma logiczna
wyniku przesunięcia z polem stałoprzecinkowym rejestru Rn. Bity od 0 do
7 rejestru Rn są zerowane.
Operacje przesuwania
arytmetycznego
Rn = ASHIFT Rx BY Ry
Rn = ASHIFT Rx BY <data8>
Operacja
arytmetycznie przesuwa
stałoprzecinkową zawartość Rx o 32-
bitową wartość zawartą w rejestrze Ry lub 8-bitową wartość
natychmiastową podaną w kodzie rozkazu. Wynik jest zapisywany na 32
najstarszych bitach rejestru Rn. Dodatnia wartość natychmiastowa lub w
rejestrze Ry powoduje przesuwanie arytmetyczne bitów w lewo natomiast
ujemna w prawo. 8-bitowa wartość natychmiastowa z zakresu od -128 do
127 pozwala na przesuwanie bitów poza 32 bitowe stałoprzecinkowe pole
bitowe w lewą lub prawą stronę.
Flaga SZ jest ustawiana, jeżeli wynik przesuwania jest równy zero, w
innym przypadku jest zerowana. Flaga SV jest ustawiana jeżeli wartość w
rejestrze Rx jest przesuwana więcej niż 0, w przeciwnym przypadku jest
zerowana. Flaga SS jest zerowana
Rn = Rn OR ASHIFT Rx BY Ry
Rn = Rn OR ASHIFT Rx BY <data8>
Działanie operacji jak wyżej.
Dodatkowo
jest dokonywana
suma
logiczna
wyniku przesunięcia z polem stałoprzecinkowym rejestru Rn.
Bity od 0 do 7 rejestru Rn są zerowane.
Operacje przesuwnika bitowego –
rotacja bitów
Rn = ROT Rx BY Ry
Rn = ROT Rx BY <data8>
Operacja dokonuje
rotacji
stałoprzecinkowego operandu w rejestrze Rx.
Liczbę rotacji określa stałoprzecinkowa zawartość rejestru Ry lub 8-bitowa
wartość natychmiastowa podana w kodzie rozkazu. Wynik rotacji jest
zapisywany w stałoprzecinkowym polu rejestru Rn. Bity od 7 do 0 rejestru
Rn są zerowane. Liczba rotacji może być liczbą dodatnią, wtedy rotacja
bitów odbywa się w lewo lub liczbą ujemną, wtedy rotacja bitów odbywa
się w prawo. 8-bitowa wartość natychmiastowa z zakresu od -128 do 127
pozwala na uzyskanie pełnego „zawinięcia” bitów 32 bitowego argumentu
w lewo lub w prawo.
Flaga SZ jest ustawiana, jeżeli wynik rotacji jest równy zero, w innym
przypadku jest zerowana. Flagi SV oraz SS są zerowane.
Operacje przesuwnika bitowego –
zerowanie bitów
Rn = BCLR Rx BY Ry
Rn = BCLR Rx BY <data8>
Operacja
zeruje podany bit
w stałoprzecinkowym polu w rejetrze Rx.
Pozycję bitu określa 32-bitowa wartość w rejestrze Ry lub 8-bitowa
wartość natychmiastowa podana w kodzie rozkazu. Może ona przybierać
wartości z zakresu od 0 do 31 włącznie i pozwala wyzerować dowolny bit
w 32 bitowym operandzie. Gdy wartość jest większa od 31 lub mniejsza od
0 żaden bit nie jest zerowany. Wynik operacji jest umieszczany w
stałoprzecinkowym polu rejestru Rn. Bity od 0 do 7 rejestru Rn w
przypadku danych 40 bitowych są zerowane.
Flaga SZ jest ustawiana, jeżeli operand wyjściowy jest równy zero, w
innym przypadku jest zerowana. Flaga SV jest ustawiana jeżeli pozycja
bitu jest większa niż 31, w innym przypadku jest zerowana. Flaga SS jest
zerowana.
UWAGA: Rozkazu nie należy mylić z instrukcją BIT CLR, która może
zerować jeden lub więcej bitów w grupie rejestrów systemowych (rejestry:
ASTAT, IRPTL, IMASK, IMASKP, MODE1, MODE2, STKY, USTAT1, USTAT2)
Operacje przesuwnika bitowego –
ustawianie bitów
Rn = BSET Rx BY Ry
Rn = BSET Rx BY <data8>
Operacja
ustawia podany bit
w stałoprzecinkowym polu w rejetrze Rx.
Pozycję bitu określa 32-bitowa wartość w rejestrze Ry lub 8-bitowa
wartość natychmiastowa podana w kodzie rozkazu. Może ona przybierać
wartości z zakresu od 0 do 31 włącznie i pozwala ustawić dowolny bit w 32
bitowym operandzie. Gdy wartość jest większa od 31 lub mniejsza od 0
żaden bit nie jest ustawiany. Wynik operacji jest umieszczany w
stałoprzecinkowym polu rejestru Rn. Bity od 0 do 7 rejestru Rn w
przypadku danych 40-bitowych są zerowane.
Flaga SZ jest ustawiana, jeżeli operand wyjściowy jest równy zero, w
innym przypadku jest zerowana. Flaga SV jest ustawiana jeżeli pozycja
bitu jest większa niż 31, w innym przypadku jest zerowana. Flaga SS jest
zerowana.
UWAGA: Rozkazu nie należy mylić z instrukcją BIT SET, która może
ustawiać jeden lub więcej bitów w grupie rejestrów systemowych (rejestry:
ASTAT, IRPTL, IMASK, IMASKP, MODE1, MODE2, STKY, USTAT1, USTAT2)
Operacje przesuwnika bitowego –
negowanie bitów
Rn = BTGL Rx BY Ry
Rn = BTGL Rx BY <data8>
Operacja
neguje podany bit
w stałoprzecinkowym polu w rejetrze Rx.
Pozycję bitu określa 32-bitowa wartość w rejestrze Ry lub 8-bitowa
wartość natychmiastowa podana w kodzie rozkazu. Może ona przybierać
wartości z zakresu od 0 do 31 włącznie i pozwala zanegować dowolny bit
w 32 bitowym operandzie. Gdy wartość jest większa od 31 lub mniejsza od
0 żaden bit nie jest negowany. Wynik operacji jest umieszczany w
stałoprzecinkowym polu rejestru Rn. Bity od 0 do 7 rejestru Rn w
przypadku danych 40-bitowych są zerowane.
Flaga SZ jest ustawiana, jeżeli operand wyjściowy jest równy zero, w
innym przypadku jest zerowana. Flaga SV jest ustawiana jeżeli pozycja
bitu jest większa niż 31, w innym przypadku jest zerowana. Flaga SS jest
zerowana.
UWAGA: Rozkazu nie należy mylić z instrukcją BIT TGL, która może
zanegować jeden lub więcej bitów w grupie rejestrów systemowych
(rejestry: ASTAT, IRPTL, IMASK, IMASKP, MODE1, MODE2, STKY, USTAT1,
USTAT2)
Operacje przesuwnika bitowego –
testowanie bitów
Rn = BTST Rx BY Ry
Rn = BTST Rx BY <data8>
Operacja
testuje wartość
podanego bitu w stałoprzecinkowym polu w
rejetrze Rx. Pozycję bitu określa 32-bitowa wartość w rejestrze Ry lub 8-
bitowa wartość natychmiastowa podana w kodzie rozkazu. Może ona
przybierać wartości z zakresu od 0 do 31 włącznie i pozwala zanegować
dowolny bit w 32 bitowym operandzie. Gdy wartość jest większa od 31 lub
mniejsza od 0 żaden bit nie jest negowany.
Flaga SZ jest zerowana, jeżeli testowany bit jest równy 1, natomiast jest
ustawiana jeżeli testowany bit jest równy zero lub pozycja bitowa jest
większa niż 31. Flaga SV jest ustawiana jeżeli pozycja bitu jest większa niż
31, w innym przypadku jest zerowana. Flaga SS jest zerowana.
UWAGA: Rozkazu nie należy mylić z instrukcją BIT TST, która testuje jeden
lub więcej bitów w grupie rejestrów systemowych (rejestry: ASTAT, IRPTL,
IMASK, IMASKP, MODE1, MODE2, STKY, USTAT1, USTAT2). Instrukcja BIT
TST ustawia flagę BTF, gdy wszystkie wyspecyfikowane bity są
przetestowane.
Wstawianie pola bitowego
Rn = FDEP Rx BY Ry
Rn = FDEP Rx BY <bit6>:<len6>
Rozkaz
wstawia pole bitowe
z rejestru Rx do Rejestru Rn. Pole bitowe
jest wyrównane do prawej wewnątrz stałoprzecinkowego pola w rejestrze
Rx. Jego długość jest określona przez 6 bitową liczbę zapisaną na bitach
od 14 do 19 w rejestrze Ry lub jako wartość natychmiastowa
len6
w
kodzie rozkazu.
Pole bitowe jest odkładane w stałoprzecinkowym polu rejestru Rn
rozpoczynającym się od bitu określonego przez 6 bitową liczbę zapisaną w
Ry na bitach od 8 do 13 lub przez wartość natychmiastową
bit6
w kodzie
rozkazu.
Bity po lewej i prawej stronie odłożonego w rejestrze Rn pola bitowego są
zerowane, dotyczy to również pola zmiennoprzecinkowego w rejestrach 40
bitowych (bity od 0 do 7).
Wartości
bit6
oraz
len6
mogą przyjmować wartości od 0 do 63 włącznie
pozwalając na odkładanie pól o długościach od 0 do 32 bitów
zaczynających się na dowolnej pozycji po lewej od punktu odniesienia,
czyli od 0 w rejestrach 32-bitowych i od 8 bitu w rejestrach 40-bitowych.
Flaga SZ jest ustawiana, gdy operand wyjściowy jest równy 0, flaga SV
jest ustawiana jeżeli jakieś bity są odkładane na lewo od 32 bitowego
docelowego pola stałoprzecinkowego (tzn. bit6 + len6 > 32), flaga SS jest
zerowana.
Wstawianie pola bitowego c.d.
Rn = Rn OR FDEP Rx BY Ry
Rn = Rn OR FDEP Rx BY <bit6>:<len6>
Podstawowy opis oraz ustawienia flag takie jak w podstawowej wersji
rozkazu FDEP.
Dodatkowo
, wstawiane pole bitowe jest poddawane
sumie
logicznej
z oryginalną zawartością Rn i następnie zapisywane do rejestru
Rn.
Rn = FDEP Rx BY Ry (SE)
Rn = FDEP Rx BY <bit6>:<len6> (SE)
Podstawowy opis oraz ustawienia flag takie jak w podstawowej wersji
rozkazu FDEP.
Dodatkowo
, najbardziej znaczące bity rejestru Rn są
wypełniane najstarszym bitem
wstawianego pola bitowego – bitem
znaku (o ile nie znajdzie się on poza obszarem rejestru Rn).
Rn = Rn OR FDEP Rx BY Ry (SE)
Rn = Rn OR FDEP Rx BY <bit6>:<len6> (SE)
Podstawowy opis oraz ustawienia flag takie jak w rozkazie FDEP z
modyfikatorem (SE). Dodatkowo, wstawiane pole bitowe jest
poddawane sumie logicznej z oryginalną zawartością Rn i następnie
zapisywane do rejestru Rn.
„Pakowanie” liczb
Przykładem wykorzystania rozkazu FDEP jest pakowanie wartości
liczbowych w pola o możliwie małej szerokości bitowej. Poniższy
przykład pokazuje kodowanie trzech wartości liczbowych [11, -12,
10] odpowiednio za pomocą pól bitowych o następujących
szerokościach: [6 bitów w naturalnym kodzie binarnym, 5 bitów
U2, 6 bitów U2]. Pierwsza liczba rozpozczyna się na pozycji 23 bitu
w słowie i zajmuje bity 23÷28. Następne liczby należy zakodować
na kolejnych polach bitowych.
r5 = 11;
r6 = -12;
r7 = 10;
r0 = r0 OR FDEP r5 by 23:6;
// umieść pierwszą liczbę
r0 = r0 OR FDEP r6 by29:3;
// umieść trzy młodsze bity drugiej
liczby
r6 = ASHIFT r6 by -3;
// przesuń bity w prawo
r1 = FDEP r6 by 0:2;
// umieść dwa starsze bity drugiej
liczby
r1 = r1 OR FDEP r7 by 2:6;
// umieść trzecią liczbę
Ekstrakcja pola bitowego
Rn = FEXT Rx BY Ry
Rn = FEXT Rx BY <bit6>:<len6>
Rozkaz dokonuje
ekstrakcji pola bitowego
z rejestru Rx, gdzie
parametry ekstrakcji są zawarte w rejestrze Ry lub stałych
natychmiastowych bit6 oraz len6. Długość ekstrahowanego pola bitowego
określa 6-bitowa wartość zapisana na bitach od 14 do 19 w rejestrze Ry
lub stała natychmiastowa len6. Bit startowy, od którego zaczyna się
ekstrakcja pola bitowego z rejestru Rx określa 6-bitowa wartość zapisana
na bitach od 8 do 13 w rejestrze Ry lub stała natychmiastowa bit6.
Bity po obydwu stronach ekstrahowanego pola w rejestrze Rn są
zerowane. Dotyczy to również zmiennoprzecinkowego pola w rejestrach
40-bitowych. Wartości len6 oraz bit6 zawierają się w zakresie od 0 do 63 i
pozwalają na ekstrahowanie pól bitowych o długościach od 0 do 32 bitów
oraz od pozycji startowej od 0 aż do całkowitego wysunięcia z lewej strony
poza 32-bitowe pole rejestru Rx.
Ustawiane flagi: SZ – jest ustawiana, jeżeli operand wyjściowy jest równy
zero, SV – jest ustawiana, jeżeli jakieś bity są ekstrahowane z lewej strony
32-bitowego wejściowego pola stałoprzecinkowego (tzn. jeżeli wartość
len6 + bit6 > 32), SS – jest zerowana.
Ekstrakcja pola bitowego c.d. i
inne operacje przesuwnika
bitowego
Rn = FEXT Rx BY Ry (SE)
Rn = FEXT Rx BY <bit6>:<len6> (SE)
Zasadniczy opis działania rozkazu oraz ustawienia flag tak jak w
przypadku podstawowej wersji rozkazu FEXT. Dodatkowo bity znajdujące
się po lewej stronie ekstrahowanego pola w Rn przyjmują wartość bitu
znaku. Nie dotyczy to sytuacji, gdy pole ekstrahowane jest spoza skali.
Rn = EXP Rx
Rozkaz
oblicza exponentę (wykładnik)
stałoprzecinkowego operandu
zawartego w rejestrze Rx. Exponenta jest obliczana jako liczba w kodzie
uzupełnienia do dwóch (U2) z pomniejszonej o jeden liczby bitów znaku w
rejestrze Rx . Eksponenta jest zapisywana w polu
shf8
w rejestrze Rn (bity
od 8 do 15).
„Rozpakowywanie”
liczb
W poniższym przykładzie ze spakowanych w poprzednim
przykładzie danych są odzyskiwane trzy wartości liczbowe [11,
-12, 10] o szerokości 32 bitowej. Dane początkowe, w których są
zawarte wartości liczbowe do rozpakowania znajdują się w
rejestrach R0 i R1.
r0 = 0x85C3C742;
// dane początkowe
r1 = 0x39BF1E2A;
// dane początkowe
r5 = FEXT r0 by 23:6;
// rozpakowanie pierwszej
// liczby (0..001011B NBC)
r6 = FEXT r0 by 29:3;
// rozpakowanie trzech
młodszych bitów
// drugiej liczby
(100B)
r7 = FEXT r1 by 0:2;
// rozpakowanie dwóch starszych
bitów
// drugiej liczby (10B)
r6 = r6 OR FDEP r7 by 3:2 (SE);
// złączenie części i
rozszerzenie o bit znaku
// (1..10100B U2)
r7 = FEXT r1 by 2:6 (SE);
// rozpakowanie trzeciej liczby
(0..01010B U2)
Inne operacje przesuwnika
bitowego
Rn = EXP Rx (EX)
Rozkaz
oblicza exponentę
(wykładnik) stałoprzecinkowego operandu
zawartego w rejestrze Rx z uwzględnieniem bitu AV (operand może być
wynikiem poprzedniej operacji ALU). Eksponenta jest zapisywana w polu
shf8 w rejestrze Rn.
Jeżeli bit AV jest równy zero, eksponentę oblicza się jako dopełnienie do
dwóch (U2) z pomniejszonej o jeden liczby bitów znaku w rejestrze Rx.
Jeżeli bit AV jest równy 1 zwracana jest wartość 0x0000 0001.
Rn = LEFTZ Rx
Rozkaz
oblicza liczbę wiodących zer
stałoprzecinkowego argumentu
zawartego w rejestrze Rx. Wynik jest umieszczany w polu bit6 w rejestrze
Rn (bity od 8 do 13).
Ustawiane flagi: SZ - Ustawiana jeżeli MSB rejestru Rx jest równa 1, SV –
ustawiana jeżeli wynik jest równy 32, SS – zerowana.
Rn = LEFTO Rx
Rozkaz
oblicza liczbę wiodących jedynek
stałoprzecinkowego
argumentu zawartego w rejestrze Rx. Wynik jest umieszczany w polu bit6
w rejestrze Rn (bity od 8 do 13). Ustawiane flagi: SZ - Ustawiana jeżeli
MSB rejestru Rx jest równa 1, SV – ustawiana jeżeli wynik jest równy 32,
SS – zerowana.
Konwersja formatów danych za
pomocą przesuwnika bitowego
Rn = FPACK Fx
Rozkaz konwertuje wartość w rejestrze Fx z 32-bitowego formatu
zmiennoprzecinkowe-go IEEE 754 do formatu zmiennoprzecinkowego o
precyzji 16-bitowej. Wynik jest umieszczany na szesnastu młodszych bitach
rejestru Rn. Format krótki posiada 11-bitową mantysę, 4-bitową eksponentę
oraz bit znaku. Gdy konwertowana wartość powoduje niedomiar, eksponenta
jest ustawiana na zero (0), a mantysa (zawierająca ukryty bit) jest
przesuwana w prawo o odpowiednią liczbę pozycji. Spakowana liczba 16-
bitowa jest w tym przypadku zdenormalizowana. Bit znaku nie zmienia się.
Warunek
Opis
exp > 135
Wartość maksymalna
120 < exp ≤
135
Eksponenta docelowa składa się z najstarszego bitu
eksponenty źródłowej połączonego z trzema
najmłodszymi bitami eksponenty źródłowej. Spakowana
mantysa jest zaokrąglana do 11 bitów mantysy
źródłowej.
109 < exp ≤
120
Eksponenta docelowa jest równa zero. Mantysa (wraz z
ukrytym bitem) jest przesuwana w prawo o odpowiednią
liczbę pozycji i zaokrąglana do 11-bitów
exp ≤ 109
Format spakowany zawiera same zera.
Exp – spolaryzowana eksponenta argumentu źródłowego.
Konwersja formatów danych za
pomocą przesuwnika bitowego
Fn = FUNPACK Rx
Rozkaz konwertuje wartość w rejestrze Rn z 16-bitowego spakowanego
formatu zmiennoprzecinkowego do formatu 32-bitowego IEEE 754. Wynik
jest zapisywany do rejestru Fn.
Warunek
Opis
0 < exp ≤ 15
Rozpakowana eksponenta składa się z trzech
najmłodszych bitów eksponenty źródłowej rozszerzonej o
jej najstarszy bit. Rozpakowana mantysa jest mantysą
źródłową uzupełnioną zerami z prawej strony.
exp = 0
Wartość rozpakowanej eksponenty wynosi (120-N), gdzie
N jest liczbą wiodących zer w źródłowej mantysie.
Rozpakowana mantysa jest przesuniętą w lewo
(unormowaną) mantysą źródłową, uzupełnioną
odpowiednią liczbą zer z prawej strony. Ukryty bit jest
usuwany.
Exp – spolaryzowana eksponenta argumentu
źródłowego.
Bit znaku pozostaje niezmieniony we wszystkich
przypadkach.
Literatura
1) Analog Devices, ADSP-21065L SHARC®
DSP. Technical Reference,
2) Analog Devices, ADSP-21065L SHARC®
DSP. User’s Manual, USA, 2003.
3)
Jacek Augustyn, „Asemblery μC51,
ADSP-21065L
SHARC”, Wydawnictwa
Naukowo-Dydaktyczne
PWSZ w
Tarnowie, Wyd. IGSMiE PAN, Kraków 2006,
str. 337 - 359
Opcje modyfikatora
mod2
Oznaczenia w tabeli:
S – operand wejściowy ze znakiem (ang.
signed)
U – operand wejściowy bez znaku (ang.
unsigned)
I – operandy wejściowe całkowite (ang.
integer)
F – operandy wejściowe ułamkowe (ang.
fractional)
R – wynik zaokrąglony ku najbliższemu (ang.
rounded-to-nearest) opcja stosowana przy
zapisywaniu wyniku do Rn
Opcje modyfikatora
mod1
Oznaczenia w tabeli:
S – operand wejściowy ze znakiem (ang. signed)
U – operand wejściowy bez znaku (ang. unsigned)
I – operandy wejściowe całkowite (ang. integer)
F – operandy wejściowe ułamkowe (ang. fractional)
Akumulacyjny rejestr porównań
0
0
0
0
1
0
0
0
1
0
1
1
0
0
1
1
COMP(R2, R3) R2>R3
COMP(R8, R4) R8<R4
COMP(R15, R5) R15>R5
COMP(R6, R5) R6>R5
COMP(R7, R10) R7=R10
COMP(R0, R14) R0<R14
COMP(R5, R7) R5>R7
COMP(R1, R15) R1>R15
0
1
0
0
0
1
0
0
AZ AN
ASTAT
CACC7
CACC6
CACC5
CACC4
CACC3
CACC2
CACC1
CACC0
24
31
Akumulacyjny rejestr porównań
1
0
0
0
0
1
0
0
0
1
0
1
1
0
0
1
COMP(R1, R3)
R2=R3
COMP(R2, R3)
R2>R3
COMP(R8, R4)
R8<R4
COMP(R15, R5)
R15>R5
COMP(R6, R5)
R6>R5
COMP(R7, R10)
R7=R10
COMP(R0, R14)
R0<R14
COMP(R5, R7)
R5>R7
0
0
1
0
0
0
1
0
AZ AN
ASTAT
CACC7
CACC6
CACC5
CACC4
CACC3
CACC2
CACC1
CACC0
24
31
Akumulacyjny rejestr porównań
0
1
0
0
0
0
1
0
1
0
1
0
1
1
0
0
COMP(R4, R5)
R4>R5
COMP(R1, R3)
R2=R3
COMP(R2, R3)
R2>R3
COMP(R8, R4)
R8<R4
COMP(R15, R5)
R15>R5
COMP(R6, R5)
R6>R5
COMP(R7, R10)
R7=R10
COMP(R0, R14)
R0<R14
0
0
0
1
0
0
0
1
AZ AN
ASTAT
CACC7
CACC6
CACC5
CACC4
CACC3
CACC2
CACC1
CACC0
24
31
Akumulacyjny rejestr porównań
0
0
1
0
0
0
0
1
1
1
0
1
0
1
1
0
COMP(R11, R2)
R11>R2
COMP(R4, R5)
R4>R5
COMP(R1, R3)
R2=R3
COMP(R2, R3)
R2>R3
COMP(R8, R4)
R8<R4
COMP(R15, R5)
R15>R5
COMP(R6, R5)
R6>R5
COMP(R7, R10)
R7=R10
0
0
0
0
1
0
0
0
AZ AN
ASTAT
CACC7
CACC6
CACC5
CACC4
CACC3
CACC2
CACC1
CACC0
24
31