Architektura IA-64 jest tak pomyślana aby większość zasobów procesora udostępniać bezpośrednio oprogramowaniu. Nie jest inaczej z rejestrami. Ilość rejestrów jest jedną z kluczowych cech IA-64 która odróżnia tą architekturę od procesorów IA-32, a także od procesorów RISCowych. Co prawda nowe procesory RISCowe mają już dużą fizyczną liczbę rejestrów, ale i tak liczba rejestrów pomyślana dla IA-64 jest dużo większa. Istnieje wiele zalet dużej liczby rejestrów, główną zaletą jest to iż nie trzeba się często odwoływać do pamięci operacyjnej. Kompilator ma dostęp do całego zestawu rejestrów, co umożliwia mu śmielszą optymalizację kodu. Przykładem może być technika „wyrolowywania” pętli. W porównaniu z IA-32 duży zestaw rejestrów zmiennoprzecinkowych powiada dodatkową zaletę, a mianowicie eliminuje niepożądany mechanizm stosu zmiennoprzecinkowego. W programach dla x86 większość operacji zmiennoprzecinkowych mogło operować jedynie na szczycie ośmioelementowego stosu, co zmuszało na częste używanie bezcelowego w IA-64 instrukcji fxch (exchange witch top of stack) czyli wymiany szczytu stosu rejestrów. Już procesory które mają tylko 32 rejestry zmiennoprzecinkowe nie doznają tej niedogodności, a pierwsza implementacja IA-64 ma nieć tych rejestrów aż 128. Wadami wielkiej liczby rejestrów są: zajmowanie fizycznie dużej ilości miejsca w procesorze, ale nie wydaje się to znaczącą wadą, gdyż pierwsza implementacja IA-64 będzie wykonana w technologii 18 mikronów. Główną wadą takiej ilości jest zwiększenie długości każdej instrukcji związanej z adresacją rejestrów.
Przegląd rejestrów dostępnych w architekturze IA-64:
(General Purpose Registers) Są to 64-bitowe rejestry które mogą być wykorzystywane do przechowywania wszystkiego rodzaju danych. Są one jednak zwykle używane przy obliczeniach stałoprzecinkowych, oraz multimedialnych. Rejestry te są podzielone na dwie części statyczną oraz stosową. Część statyczna zajmuje jedną czwartą całego zestawu jest dostępna bezpośrednio przez oprogramowanie. Część stosowa zajmująca pozostałą pulę to rejestry rotujące są one dostępne poprzez tzw. rejestry RRB (Rotating Register Base, zwane także Register Rename Base) które wskazują od którego numeru rejestry stosowe są wolne i można z nich korzystać. Pierwszy rejestr ogólnego przeznaczenia jest rejestrem specjalnym i jest tylko do odczytu, ma on zawsze wartość 0. Próba zapisu danych do rejestru zerowego powoduje wygenerowanie błędu.
(Not a Thing registers) Są to 1-bitowe rejestry z których każdy jest dodatkiem do odpowiedniego rejestru ogólnego przeznaczenia. Jeden bit zawarty w tych rejestrach ma za zadanie informować czy dane zawarte w rejestrach ogólnego przeznaczenia są poprawne. Wykonywanie spekulatywnych operacji przez procesor IA-64 daje możliwość nietrafnego załadowania rejestru. Bity NaT informują właśnie o poprawności danych związanym z tym mechanizmem.
(Floating point registers) Są to 82-bitowe zmiennoprzecinkowe rejestry które są używane przy obliczeniach zmiennoprzecinkowych. Rejestry te są podzielone na dwie części. Pierwsza część zajmująca jedną czwartą zestawu nazwana jest częścią statyczną Rejestry od 8 do 31 są używane w trybie IA-32 jako rejestry zmiennoprzecinkowe, oraz multimedialne znane z procesorów IA-32. Reszta rejestrów nazwana jest częścią rotująca. Część to jest dynamicznie przydzielana oprogramowaniu aby przyspieszyć wykonywanie pętli. Pierwsze dwa rejestry są tylko do odczytu i mają wartość +0.0 oraz +1.0. Jeśli któryś z tych rejestrów jest używany jako rejestr docelowy jakiejś operacji to generowany jest błąd. Rejestry te nie są wyposażone w dodatkowe bity typu NaT, jest jednak możliwość sygnalizowania niepoprawności danych związanych z mechanizmem spekulatywnego dostępu do danych. Specjalna wartość NaTVal (Not a Thing Value) jest wpisywana do odpowiedniego rejestru gdy dane nie zostały trafnie przewidziane do załadowania.
Format rejestru FP:
81 | 80 | 64 | 63 | 0 |
znak | wykładnik | część znacząca | ||
1 | 17 | 64 |
pole znaczące – (significand) w polu tym znajdują się cyfry znaczące liczby. Bit 63 jest | ||
częścią całkowitą liczby, natomiast pozostałe bity są częścią ułamkowa. | ||
wykładnik – (exponent) w tym przechowywany jest wykładnik liczby. Jeśli wszystkie | ||
bity wynoszą 1 to stan taki interpretowany jest jako nieskończoność. Jeśli wszystkie bity wynoszą 0, oraz wszystkie bity pola znaczącego są równe zero, oznacza to iż liczba wynosi 0. Natomiast w przypadku jeśli wszystkie bity tego pola wynoszą 0 natomiast pole znaczące nie wynosi zero to stan taki interpretuje tak że liczba jest typu IEEE double-extended real (pseudo)denormal | ||
znak – (sign) pole to określa czy liczba jest dodatnia (bit wynosi 0) czy ujemna (bit | ||
wynosi 1) |
Wartość zawarta w tym rejestrze można wyrazić:
przy założeniu, że wykładnik jest różny od zera
(-1)(znak) · 2(wykładnik - 65535) · (część_znacząca[63].część_znacząca[62:0])
przy założeniu, że wykładnik jest równy zero
(-1)(znak) · 2(- 16382) · (część_znacząca[63].część_znacząca[62:0])
(Application Registers) są rejestry różnego przeznaczenia, włączając w to rejestry specjalnego przeznaczenia, rejestry kontrolne, oraz rejestry, które zostały dodane do architektury IA-64 dla zachowania zgodności z architekturą IA-32. Rejestry aplikacyjne mogą być adresowane tylko przez jednostkę zarządzającą pamięcią (M-unit) albo przez stałoprzecinkową jednostkę arytmetyczno-logiczną (ALU).
Tabela przedstawiająca listę wszystkich rejestrów aplikacyjnych:
Numer rejestru | Nazwa | Opis | typ jednostki wykorzystującej rejestr |
AR 0-7 | KR 0-7 | Rejestry jądra | M |
AR 8-15 | Zarezerwowane | M | |
AR 16 | RSC | Rejestr konfiguracji stosu rejestrów | M |
AR 17 | BSP | Wskaźnik powrotu | M |
AR 18 | BSPSTORE | Wskaźnik powrotu dla pamięci | M |
AR 19 | RNAT | Rejestr kolekcji rejestrów NaT | M |
AR 20 | Zarezerwowane | M | |
AR 21 | FCR | Rejestr kontroli zmiennoprzecinkowej | M |
AR 22-23 | Zarezerwowane | M | |
AR 24 | EFLAG | Rejestr flag aplikacji | M |
AR 25 | CSD | Rejestr segmentowy programu | M |
AR 26 | SSD | Rejestr segmentowy stosu | M |
AR 27 | CFLG | Rejestr flag kontrolnych | M |
AR 28 | FSR | Rejestr statusu zmiennoprzecinkowego | M |
AR 29 | FIR | Rejestr instrukcji zmiennoprzecinkowych | M |
AR 30 | FDR | Rejestr danych zmiennoprzecinkowych | M |
AR 31 | Zarezerwowane | M | |
AR 32 | CCV | Rejestr porównania oraz wymiany | M |
AR 33-35 | Zarezerwowane | M | |
AR 36 | UNAT | Rejestr kolekcji użytkownika rejestrów NaT | M |
AR 37-39 | Zarezerwowane | M | |
AR 40 | FPSR | Rejestr statusu operacji zmiennoprzecinkowych | M |
AR 41-43 | Zarezerwowane | M | |
AR 44 | ITC | Licznik przedziałów czasowych | M |
AR 45-47 | Zarezerwowane | M | |
AR 48-63 | Ignorowane | M lub I | |
AR 64 | PFS | Poprzedni stan funkcji | I |
AR 65 | LC | Licznik pętli | I |
AR 66 | EC | Licznik instrukcji końcowych | I |
AR 67-111 | Zarezerwowane | I | |
AR 112-127 | Ignorowane | M lub I |
(Kernel Registers) Osiem dostępnych dla użytkownika rejestrów. Są to rejestry 64 bitowe. Ich zadaniem jest przekazywanie informacji z systemu operacyjnego do aplikacji. Rejestry te mogą być czytane przez wszystkie poziomy uprzywilejowania, ale zapisywane mogą być jedynie przez najbardziej uprzywilejowany poziom. Rejestry KR 0, KR 1, oraz KR 2 są także używane do trzymania dodatkowych informacji przeznaczonych dla zestawu instrukcji IA-32. Dzieje się to wtedy kiedy aktywnym jest zestaw instrukcji IA-32.
(Register Stack Configuration Register) Jest to 64-bitowy rejestr używany do kontroli operacji na stosie rejestrów wykonywanych przez RSE (Register Stack Engine) architektury IA-64.
format rejestru RSC:
63 | 30 | 29 | 16 | 15 | 5 | 4 | 3 | 2 | 1 | 0 |
rv | loadrs | rv | be | pl | mode | |||||
34 | 14 | 11 | 1 | 2 | 2 |
mode – (tryb) pole to kontroluje w jaki sposób RSE zapisuje oraz odczytuje ramki | ||
na/ze stosu gdy pole to jest ustawione w postaci
00 RSE pracuje leniwie (emforced lazy) 10 oznacza tryb intensywnego odczytu (load intensive) 01 oznacza tryb intensywnego odczytu (stroe intensive) 11 oznacza tryb szybki (eager) | ||
pl – (privilege level) pole to określa w jakim poziomie uprzywilejowanie ma pracować | ||
RSE | ||
be – (big endian) pole to kontroluje sposób zapisu oraz odczytu danych przez RSE. | ||
Jeśli bit ten jest ustawiony w pozycji 1 to znaczy że dostęp odbywa się według kolejności big-endian, natomiast jeśli w pozycji 0 to znaczy, że według kolejności little-endian | ||
loadrs – pole to jest używane przez instrukcję loadrs do synchronizacji RSE | ||
rv – (reserved) pole zarezerwowane |
(Backing Store Pointer) Jest to 61 bitowy rejestr. Rejestr jest tylko do odczytu, przechowuje on adres miejsca w pamięci w którym jest zapisane miejsce rejestru GR 32 z aktualnej ramki stosu. Co prawda rejestr ten zajmuje całe 64 bity, ale 3 bity są ignorowane.
Format rejestru BSP
63 | 3 | 2 | 0 |
pointer | ig | ||
61 | 3 |
(Backing Store Pointer for Memoru Strores) Jest to 61 bitowy rejestr. W rejestrze tym przechowywane są informacje o miejscu pamięci w którym RSE zapisze następną ramkę stosu.
Format rejestru BSPSTORE
63 | 3 | 2 | 0 |
pointer | ig | ||
61 | 3 |
(RSE NaT Collection Register). Jest to 64 bitowy rejestr który jest używany przez RSE do tymczasowego przechowywania wartości rejestrów NaT. Dane są do tego rejestru zapisywane
kiedy RSE zapisuje następną ramkę stosu. Bit 63 zawsze przy czytaniu zwraca zero i ignorowane są wszystkie próby zapisu do niego.
Format rejestru RNAT
63 | 62 | 0 |
ig | RSE NaT Collection | |
1 | 63 |
Rejestry IA-32 zostały dodane w celu zapewnienia kompatybilności z architekturą IA-32. Jest to zestaw rejestrów w których znajdują się rejestry znane z procesorów serii x86.
Rejestr FCR (AR 21) – w rejestrze tym znajdują się znane z IA-32 rejestry FCW, oraz MXCSR.
Rejestr EFLAG (AR 24) – rejestr ten odpowiada rejestrowi o takiej samej nazwie w IA-32
Rejestr CSD (AR 25) – rejestr ten odpowiada rejestrowi o takiej samej nazwie w IA-32 mimo iż istnieje lekka modyfikacja formatu
Rejestr SSD (AR 26) – rejestr ten odpowiada rejestrowi o takiej samej nazwie w IA-32 mimo iż istnieje lekka modyfikacja formatu
Rejestr CFLG (AR 27) – w rejestrze tym znajdują się rejestry CR0/CR4 znane z IA-32.
Rejestr FSR (AR 28) – w rejestrze tym znajdują się rejestry FSW, FTW, MXCSR znane z IA-32.
Rejestr FIR (AR 29) w rejestrze tym znajdują się rejestry FOP, FIP, FCS znane z IA-32.
Rejestr FDR (AR 30) w rejestrze tym znajdują się rejestry FEA, FDS znane z IA-32.
(Compare and Exchange Value Register) Jest to 64-bitowy rejestr który zawiera dane używane przez instrukcję cmpxchg.
(User Nat Collection Register) Jest to 64-bitowy rejestr który jest używany do tymczasowego przechowywania wartości rejestrów NaT. Dane do tego rejestry są zapisywane kiedy zostają wykonane instrukcje ld8.fill oraz ld8.spill
(Floating-point Status Register). Jest to 64-bitowy rejestr w którym przechowywane są informacje o operacjach zmiennoprzecinkowych. Za pomocą tego rejestru można dynamicznie kontrolować te operacje. Rejestr ten jest podzielony na 5 pól, jednym jest pole które opisuje sposób obsługi błędów, oraz 4 zestawy informacji statusowych (1 główny zestaw oraz 3 alternatywne).
Format rejestru FPSR:
63 | 58 | 57 | 45 | 44 | 32 | 31 | 19 | 18 | 6 | 5 | 0 |
rv | sf3 | sf2 | sf1 | sf0 | traps | ||||||
6 | 13 | 13 | 13 | 13 | 6 |
traps – (zapadki) bity w tym polu sygnalizują odpowiadające tym bitom błędy będą | ||
generowane | ||
sf0 – (status field 0) główne pole statusu | ||
sf1 – (status field 1) alternatywne pole statusu nr 1 | ||
sf2 – (status field 2) alternatywne pole statusu nr 2 | ||
sf3 – (status field 3) alternatywne pole statusu nr 3 | ||
rv – (reserved ) pole zarezerwowane |
Format pola traps:
5 | 4 | 3 | 2 | 1 | 0 |
id | ud | od | zd | dd | vd |
1 | 1 | 1 | 1 | 1 | 1 |
vd – bit w stanie wysokim blokuje wystąpienie błędu IEEE – Invalid Operation | ||
dd – bit w stanie wysokim blokuje wystąpienie błędu – Denormal/Unnormal Operand | ||
zd – bit w stanie wysokim blokuje wystąpienie błędu IEEE – Zero Divide | ||
od – bit w stanie wysokim blokuje wystąpienie błędu IEEE – Overflow | ||
ud – bit w stanie wysokim blokuje wystąpienie błędu IEEE – Underflow | ||
id – bit w stanie wysokim blokuje wystąpienie błędu IEEE – Inexact |
Każda instrukcja arytmetyczna wykonująca operacje zmiennoprzecinkowe ma specyfikator pola statusu. Specyfikator ten określa które z 4 pól statusu będzie używane do kontroli nad daną instrukcją.
Format pola statusu:
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
i | u | o | z | d | v | td | rc | pc | wre | ftz | ||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 1 | 1 |
ftz – (Flush-To-Zero) tryb czyszczenia do zera | |||
wre – (Widest Range Exponent) wielkość wykładnika | |||
pc – (Precision Control) kontrola precyzji | |||
rc – (Rounding Control) kontrola zaokrąglania 00 | |||
td – (Traps disabled) tryb w którym zapadki (traps) są zablokowane, nie dotyczy | |||
głównego pola statusu. | |||
v – (invalid operation) | bity te sygnalizują pojawienie się błędu który jest włączony w polu traps | ||
d – (Denornal/unnormal) | |||
z – (Zero divide) | |||
o – (Overflow) | |||
u – (Underflow) | |||
i – (Inexact) |
(Interval Time Counter) Jest to 64 bitowy rejestr w którym liczone są kolejne takty zegara. Aplikacje mogą bezpośrednio odczytywać ten licznik i w ten sposób dokonywać obliczeń wykorzystujących pomiar czasu, lub mierzących jakieś osiągi. System może zabronić dostępu do tego rejestru dla nieuprzywilejowanych aplikacji. Kiedy dostęp jest zabroniony, odczyt tego rejestru (z poziomów nieuprzywilejowanych) powoduje błąd. Dane do tego rejestru mogą być zapisywane jedynie przez najbardziej uprzywilejowany poziom. Rejestr ten jest równoważny rejestrowi TSC (Time Stamp Counter) znanego z IA-32 i może być odczytywany za pomocą instrukcji rdtsc (read time stamp counter). System może zabronić dostępu także w przypadku korzystania z trybu IA-32. W tym przypadku kiedy następuje wykonanie instrukcji rdstc (z poziomów nieuprzywilejowanych) powoduje błąd.
(Previous Function State) Rejestr ten zawiera wiele pól, które określają poprzedni stan układu rejestrów. Wartości do tych pól są kopiowane automatycznie przy wywołaniu z odpowiednich rejestrów, dla przyspieszenia wywoływań procedur.
Kiedy instrukcja br.call jest wykonana pola są inicjowane nowymi wartościami, a poprzednia wartości PFS są tracone. Kiedy wywoływana jest instrukcja br.ret odpowiednie pola są z powrotem kopiowane do odpowiednich rejestrów.
Format rejestru PFS
63 | 62 | 61 | 58 | 57 | 52 | 51 | 38 | 37 | 0 |
ppl | rv | pec | rv | pfm | |||||
2 | 4 | 6 | 14 | 38 |
pfm – (Previous Frame Marker) jest to odpowiednik Oznaczenia Aktualnej Ramki | ||
Stosu (CFM). Pole to tak jak rejestr CFM jest dodatkowo podzielone na pola:
RRB.PR, RRB.FR, RRB.GR, SOR, SOL, SOF | ||
pec – (Previous Epilog Count) jest to odpowiednik rejestru EC, (nie biorąc pod uwagę | ||
części ignorowanej tego rejestru) | ||
ppl – (Previous Privilege Level) jest to odpowiednik pola pl w rejestrze konfiguracji | ||
stosu rejestrów (RSC). Operacja przywracania wartości z tego pola do oryginalnego miejsca może spowodować zmianę aktualnego poziomu uprzywilejowania | ||
rv – (Reserved) pola zarezerwowane |
(Loop Count) Jest to rejestr 64-bitowy. Rejestr ten wykorzystuje się do zliczania przebiegów pętli. Wartość zawarta w tym rejestrze jest zmniejszana o 1 przy każdym skoku wykonywanym w pętli w której jest określona ilość przebiegów.
(Epilog Count) Jest to rejestr którego 6 bitów jest używane do zliczania ostatnia część (epilog) pętli. Epilog jest to ostatnia część pętli w której potok instrukcji nie jest już pełny, lecz powoli opróżnia się (ostatnia instrukcja pętli została już załadowana). Rejestr ten jest wykorzystywany w mechanizmie „wyrolowywania” pętli
Format rejestru EC
63 | 6 | 5 | 0 |
ig | epilog count | ||
58 | 6 |
(predicate registers) są to 1 bitowe rejestry które kontrolują warunkowe wykonywanie instrukcji oraz skoków. Są one używane do przechowywania rezultatów porównań. Rejestry predykatów są podzielona na dwie części. Pierwsza jest nazwana statyczną i zajmuje jedną czwartą całej liczby. Pozostała część rejestrów nazwana jest częścią rotującą. Rejestry te są dynamicznie przydzielane oprogramowaniu, podczas wykonania pętli. Pierwszy rejestr jest tylko do odczytu i ma zawsze wartość prawda. Kiedy ten rejestr jest używany jako cel zapisu jakiegoś wyniku, to wynik ten jest tracony.
(Branch registers) są to 64-bitowe rejestry które są używane do specyfikowania docelowego adresu skoku. Umożliwiają sprawniejsze działanie jednostki przewidywania skoków, oraz wykonywania skoków.
(Instruction pointer) Jest to rejestr 64 bitowy. W rejestrze tym przechowywany jest adres paczki instrukcji w której znajduje się aktualnie wykonywania instrukcja IA-64. Rejestr IP może być odczytywany bezpośrednio, jednakże nie może być bezpośrednio zapisywany. Rejest ten jest inkrementowany, kiedy paczka zostanie wykonana. Rejestr jest inicjowany nową wartością, w przypadku wykonania skoku.
(Current Frame Marker) Jest to zespół podrejestrów o łącznej długości 38 bitów. Każda ramka rejestrów jest powiązana ze rejestrem oznaczenia ramki. W tym rejestrze przechowywane są dane na temat aktualnego stanu ramki stosu. Rejestr ten nie może być bezpośrednio odczytywany, ani nie można do niego bezpośrednio nic zapisać, z poziomu aplikacji.
Rejestr ten podzielony jest na podrejestry, które zawierają informacje na temat długości niektórych elementów ramki stosu, oraz trzy rejestry zmiany RRB (Rotating Register Base), które są używane przy rotowaniu rejestrów.
Format rejestru CFM:
37 | 32 | 31 | 25 | 24 | 18 | 17 | 14 | 13 | 7 | 6 | 0 |
RRB.PR | RRB.FR | RRB.GR | SOR | SOL | SOF | ||||||
6 | 7 | 7 | 4 | 7 | 7 |
RRB.PR (Rotate Register Base for Predicate Registers) – podstawa rotujących | ||
rejestrów predykatowych (6 bitów) | ||
RRB.FR (Rotate Register Base for Floating-point Registers) – podstawa rotujących | ||
rejestrów zmiennoprzecinkowych (7 bitów) | ||
RRB.GR (Rotate Register Base fof General Registers) – podstawa rotujących rejestrów | ||
ogólnego przeznaczenia (7 bitów) | ||
SOR (Size Of Rotating portion of stack frame) – długość rotującej części ramki stosu | ||
dodatkowo można obliczyć ilość rotujących rejestrów który wynosi 8*SOR (4 bity) | ||
SOL (Size Of Locals portion of stack frame) – długość lokalnej części ramki stosu | ||
(7 bitów) | ||
SOF (Size Of stack Frame) – całkowita długość ramki stosu (7 bitów) |
Przy wywołaniu rejestr CFM jest kopiowany do pola PFM (Previous Frame Marker) w rejestrze PFS (Previous Function State). Nowe wartości zapisywane do rejestru CFM tworzą nową ramkę stosu. Wszystkie pola RRB są inicjowane wartością 0.
(Performance Monitor Data) Jest to zestaw 64 bitowych rejestrów zawierających dane na temat osiągów komputera. Rejestry te mogą być edytowane tylko przez uprzywilejowane programy, które mają dostęp do niskich poziomów uprzywilejowania. Wartości rejestrów PMD mogą być bezpośrednio odczytywane bez pomocy aplikacji. System operacyjny jest upoważniony do strzeżenia skonfigurowanych przez użytkownika rejestrów. Jeśli rejestry te czytamy z poziomów które nie są wystarczająco uprzywilejowane to rejestry te zwracają zero. Rejestry te są używane do lepszej informacji o osiągach procesora, działają zarówno dla zestawu instrukcji IA-64 jak i IA-32.
Rejestry PMD są podzielone na dwie części. Pierwsza część to tzw. rejestry (PMC) w których znajdują się informacje używane do konfiguracji. Reszta to właściwe rejestry PMD. Znajdują się w nich jedynie dane dotyczące osiągów.
(User Mask) Jest 6 bitów flag które informują o aktualnych ustawieniach procesora. Maska użytkownika jest częścią rejestru stanu procesora (PSR). Są one dostępne przez aplikacje napisane dla IA-64.
Format rejestru Maski Użytkownika:
5 | 4 | 3 | 2 | 1 | 0 |
mfh | mfl | ac | up | be | rv |
1 | 1 | 1 | 1 | 1 | 1 |
rv – (reserved) pole zarezerwowane | ||
be – (big endian enable) pole to kontroluje sposób zapisu oraz odczytu z/do pamięci. | ||
Jeśli bit jest ustawiony w pozycji 1 znaczy to ze dostęp do pamięci jest według metody big-endian, natomiast jeśli bit jest ustawiony w pozycji 0 oznacza to dostęp do pamięci według metody little-endian.
Bit ten jest ignorowany jeśli procesor pracuje w trybie IA-32. W tym trybie dostęp do pamięci jest zawsze ustawiony jako little-endian | ||
up – (user performance monitor enable) pole to kontroluje dostęp do rejestrów PMD | ||
dla użytkownika. Jeśli bit jest ustawiony w pozycji 1 znaczy to, że rejestry PMD są aktywne, natomiast jeśli bit ma wartość 0 znaczy to, że rejestry PMD są zablokowane | ||
ac – (alignment check) pole to kontroluje kiedy będzie generowany błąd ustawienia | ||
danych w pamięci. Wartość 1 tego bitu powoduje generowanie błędu przy każdym nieustawionym dostępie do pamięci, natomiast ustawienie tego bitu w pozycji 0 powoduje, że nieustawiony dostęp do pamięci może powodować błąd, ale nie musi. | ||
mfl – (Mark Floating-point Lower) Ten bit sygnalizuje dostęp do statycznej części | ||
rejestrów zmiennoprzecinkowych. Bit ten jest ustawiany w pozycji wysokiej wtedy gdy jakakolwiek instrukcja która używała statycznej części rejestrów zmiennoprzecinkowych zakończyła swoje działanie. Bit ten nie jest nigdy automatycznie zerowany, aby sprawdzić następne odwołanie do statycznej części rejestrów zmiennoprzecinkowych należy wcześniej wpisać do tej części maski użytkownika zero. | ||
mfh – (Mark Floating-point Higher) Ten bit sygnalizuje dostęp do rotującej części | ||
rejestrów zmiennoprzecinkowych. Bit ten jest ustawiany w pozycji wysokiej wtedy gdy jakakolwiek instrukcja która używała rotującej części rejestrów zmiennoprzecinkowych zakończyła swoje działanie. Bit ten nie jest nigdy automatycznie zerowany, aby sprawdzić następne odwołanie do rotującej części rejestrów zmiennoprzecinkowych należy wcześniej wpisać do tej części maski użytkownika zero. |
(Procesor Identification) Są to rejestry które identyfikują konkretny egzemplarz procesora, każdy rejestr ma po 64 bity. Rejestry te są podzielone na dwie grupy. Pierwsza grupa nazwana stała (fixed region) która zajmuje rejestry od 0 do 4, oraz grupa zwana zmienna (variable region) czyli rejestry od 5 w górę. Zapis do rejestrów identyfikacji procesora jest niemożliwy ponieważ nie ma instrukcji które by umożliwiały taką operację.
Informacja o producencie procesora jest umieszczona w pierwszym oraz drugim rejestrze CPUID. W rejestrze tym wyspecyfikowana jest nazwa producenta zapisana w formacie ASCII. Sumarycznie długość napisu nie może przekraczać 16 bajtów, gdyż każdy rejestr ma długość 64 bitów, co w sumie daje wartość 16 bajtów na nazwę producenta. Bity które są po ostatnim znaku aż do końca drugiego rejestru wynoszą zero.
Numer seryjny procesora jest umieszczony w rejestrze o numerze 2. Jeżeli konkretny model procesora posiada numer seryjny to rejestr ten zwraca 64 bitowy numer seryjny, w przeciwnym wypadku rejestr ten jest zablokowany i odwołanie do niego zwraca zero.
Jeżeli numer seryjny istnieje to jest powiązany z 32-bitową informacją o wersji procesora, która jest zawarta w rejestrze o numerze 3.
format rejestru CPUID.[3]
63 | 40 | 39 | 32 | 31 | 24 | 23 | 16 | 15 | 8 | 7 | 0 |
rv | archerev | family | model | revision | number | ||||||
24 | 8 | 8 | 8 | 8 | 8 |
number – numer ostatniego zaimplementowanych w danym procesorze rejestru | ||
CPUID, wartość ta jest o jeden mniejsza niż wynosi liczba wszystkich rejestrów CPUID | ||
revision – numer poprawki procesora, liczba ta mówi nam do jakiego wydania należy | ||
dany procesor | ||
model – numer ten reprezentuje model procesora, jest to numer unikalny wśród | ||
procesorów danej rodziny | ||
family – numer rodziny procesorów, jest to unikalny numer i nie może się powtarzać | ||
archrev – (architecture revision) jest to numer który mówi nam ile było zmian | ||
architektury do czasu wyprodukowania danego procesora | ||
rv – (reserved) pole zarezerwowane |
Kombinacja 64 bitowego numeru seryjnego wraz z 32 bitową informacją o wersji jest wartością unikalną i nie może się powtarzać wśród procesorów IA-64.
W rejestrze CPUID o numerze 4 mają znajdować się informacje o cechach procesora wykonanego w architekturze IA-64. Jest to zestaw flag które pokazują czy dana cecha jest zaimplementowana w konkretnym procesorze. Kiedy bit wynosi 1 znaczy to, że procesor obsługuje daną czynność, w przeciwnym przypadku wartość wynosi zero. Rejestr ten nie zawiera cech zestawu instrukcji IA-32.
Na dzień dzisiejszy istnieje specyfikacja jedynie jednego bitu z tego rejestru. Bit ten znajduje się w polu o numerze 0 i informuje czy procesor obsługuje instrukcję brl (Long BRanch) czyli tak zwanego długiego skoku.
Copyright © 2008-2010 EPrace oraz autorzy prac.