Procesory sygnałowe 4

background image

Procesory sygnałowe

Wykład 4

Asembler procesora

ADSP-21065L (operacje ALU,

mnożarki i przesuwnika

bitowego)

Dr inż. Robert
Wielgat

background image

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

background image

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

background image

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

background image

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.

background image

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)

background image

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

background image

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

background image

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.

background image

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.

background image

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.

background image

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

background image

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.

background image

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.

background image

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.

background image

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.

background image

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

background image

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.

background image

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

background image

Operacje

mnożarki

Rn = Rx * Ry

mod2

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.

background image

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

background image

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

background image

Operacje mnożarki

Rn = SAT MRF

mod1

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.

background image

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

background image

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.

background image

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.

background image

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.

background image

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.

background image

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)

background image

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)

background image

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)

background image

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.

background image

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.

background image

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.

background image

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

background image

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.

background image

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

background image

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

background image

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.

background image

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.

background image

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.

background image

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

background image

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

background image

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)

background image

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

background image

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

background image

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

background image

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


Document Outline


Wyszukiwarka

Podobne podstrony:
Lab4 Procesory sygnałowe sprawozdanie PWR, PWr, sprawozdania
lab9 procesory sygnalowe, LABORATORIUM
6 Procesy i sygnaly
16 procesory sygnalowe ADSP21
Procesory sygnałowe 1
Procesory sygnałowe 2
Procesory sygnałowe 6
Lab1 Procesory sygnałowe sprawozdanie PWR, PWr, sprawozdania
Lab5 Procesory sygnałowe sprawozdanie PWR, PWr, sprawozdania
Procesory sygnałowe 3
Sitek-wykłady, Komunikacja między procesami, Komunikacja między procesami: sygnały
ele4 z2, 7 semestr, Procesory Sygnałowe, Laboratoria
Instrukcja PS1, 7 semestr, Procesory Sygnałowe, Laboratoria
Procesory sygnałowe 3
Ćwiczenie 18 & 19 Procesory Sygnalowe
Procesory sygnałowe 7
Procesory sygnałowe 2
Lab2 Procesory sygnałowe sprawozdanie PWR, PWr, sprawozdania
Lab3 Procesory sygnałowe sprawozdanie PWR, PWr, sprawozdania

więcej podobnych podstron