Processorregister

Ett processorregister är en snabbt tillgänglig plats som är tillgänglig för en dators processor . Register består vanligtvis av en liten mängd snabb lagring , även om vissa register har specifika hårdvarufunktioner och kan vara skrivskyddade eller skrivbara. I datorarkitektur adresseras register vanligtvis av andra mekanismer än huvudminnet , men kan i vissa fall tilldelas en minnesadress t.ex. DEC PDP-10 , ICT 1900 .

Nästan alla datorer, oavsett om de laddar/lagrar arkitektur eller inte, laddar data från ett större minne till register där det används för aritmetiska operationer och manipuleras eller testas av maskininstruktioner . Manipulerad data lagras sedan ofta tillbaka till huvudminnet, antingen genom samma instruktion eller av en efterföljande. Moderna processorer använder antingen statiskt eller dynamiskt RAM som huvudminne, där det senare vanligtvis nås via en eller flera cachenivåer .

Processorregister är normalt högst upp i minneshierarkin och ger det snabbaste sättet att komma åt data. Termen avser normalt endast den grupp av register som är direkt kodade som en del av en instruktion, enligt definitionen av instruktionsuppsättningen . Moderna högpresterande processorer har dock ofta dubbletter av dessa "arkitektoniska register" för att förbättra prestandan via registerbyte , vilket möjliggör parallell och spekulativ exekvering . Modern x86 -design förvärvade dessa tekniker runt 1995 med utgivningarna av Pentium Pro , Cyrix 6x86 , Nx586 och AMD K5 .

När ett datorprogram får åtkomst till samma data upprepade gånger kallas detta referensplats . Att hålla ofta använda värden i register kan vara avgörande för ett programs prestanda. Registerallokering utförs antingen av en kompilator i kodgenereringsfasen eller manuellt av en assemblerspråksprogrammerare .

Storlek

Register mäts normalt av antalet bitar de kan innehålla, till exempel ett " 8-bitars register", " 32-bitars register", " 64-bitars register" eller ännu mer. I vissa instruktionsuppsättningar kan registren fungera i olika lägen och dela upp deras lagringsminne i mindre delar (t.ex. 32-bitars till fyra 8-bitars) till vilka flera data (vektor- eller endimensionell datamatris ) kan laddas och manövreras samtidigt. Vanligtvis implementeras det genom att lägga till extra register som mappar deras minne till ett större register. Processorer som har förmågan att utföra enstaka instruktioner på flera data kallas vektorprocessorer .

Typer

En processor innehåller ofta flera typer av register, som kan klassificeras enligt de typer av värden de kan lagra eller instruktionerna som fungerar på dem:

  • Användartillgängliga register kan läsas eller skrivas med maskininstruktioner. Den vanligaste uppdelningen av användartillgängliga register är i dataregister och adressregister.
    • Dataregister tecken kan innehålla numeriska datavärden såsom heltal och, i vissa arkitekturer, flyttalsvärden, såväl som , småbitarrayer och annan data . I vissa äldre arkitekturer, såsom IBM 704 , IBM 709 och efterföljare, PDP-1 , PDP-4 / PDP-7 / PDP-9 / PDP-15 , PDP -5 / PDP-8 och HP 2100 , ett speciellt dataregister känt som ackumulatorn används implicit för många operationer.
    • Adressregistrets håller adresser och används av instruktioner som indirekt kommer åt primärminnet .
      • Vissa processorer innehåller register som endast kan användas för att hålla en adress eller endast för att hålla numeriska värden (i vissa fall används som ett indexregister vars värde läggs till som en offset från någon adress); andra tillåter register att innehålla endera sortens kvantitet. ett stort antal möjliga adresseringslägen som används för att specificera den effektiva adressen för en operand.
      • Stackpekaren används för att hantera runtime- stacken . Sällan adresseras andra datastackar av dedikerade adressregister (se stackmaskin ) .
    • Allmänna register ( GPR ) kan lagra både data och adresser, dvs. de är kombinerade data/adressregister; i vissa arkitekturer är registerfilen enhetlig så att GPR:erna också kan lagra flyttalsnummer .
    • Statusregister innehåller sanningsvärden som ofta används för att avgöra om någon instruktion ska utföras eller inte.
    • Flyttalsregister ( FPR ) lagrar flyttalsnummer i många arkitekturer .
    • Konstanta register innehåller skrivskyddade värden som noll, ett eller pi .
    • Vektorregister innehåller data för vektorbehandling gjord av SIMD- instruktioner (Single Instruction, Multiple Data).
    • Specialregister ( SPR ) innehåller vissa delar av programtillståndet ; de inkluderar vanligtvis programräknaren , även kallad instruktionspekaren, och statusregistret ; programräknaren och statusregistret kan kombineras i ett programstatusord (PSW) register. Den tidigare nämnda stackpekaren ingår ibland också i denna grupp. Inbäddade mikroprocessorer kan också ha register som motsvarar specialiserade hårdvaruelement.
    • I vissa arkitekturer lagrar modellspecifika register (även kallade maskinspecifika register ) data och inställningar relaterade till själva processorn. Eftersom deras betydelse är knuten till designen av en specifik processor, kan de inte förväntas förbli standard mellan processorgenerationerna.
    • Register för minnestyp ( MTRR )
  • Interna register är inte åtkomliga med instruktioner och används internt för processoroperationer.
    • Instruktionsregistret innehåller den instruktion som för närvarande exekveras.
    • Register relaterade till att hämta information från RAM , en samling lagringsregister som finns på separata chips från CPU:n:
  • Arkitektoniska register är de register som är synliga för programvara och definieras av en arkitektur. De kanske inte motsvarar den fysiska hårdvaran om registerbyte utförs av den underliggande hårdvaran.

Hårdvaruregister liknar varandra, men förekommer utanför CPU:er.

I vissa arkitekturer (som SPARC och MIPS ), är det första eller sista registret i heltalsregisterfilen ett pseudoregister genom att det är anslutet till att alltid returnera noll vid läsning (mest för att förenkla indexeringslägen), och det kan inte skrivas över . I Alpha görs detta även för flyttalsregisterfilen. Som ett resultat av detta citeras registerfiler vanligtvis som att de har ett register mer än hur många av dem som faktiskt är användbara; till exempel citeras 32 register när endast 31 av dem passar inom ovanstående definition av ett register.

Exempel

Följande tabell visar antalet register i flera vanliga CPU-arkitekturer. Observera att i x86 -kompatibla processorer räknas stackpekaren ( ESP ) som ett heltalsregister, även om det finns ett begränsat antal instruktioner som kan användas för att arbeta med dess innehåll. Liknande varningar gäller för de flesta arkitekturer.

Även om alla de ovan listade arkitekturerna är olika, är nästan alla i ett grundläggande arrangemang som kallas von Neumann-arkitekturen , först föreslog av den ungersk-amerikanske matematikern John von Neumann . Det är också anmärkningsvärt att antalet register på GPU:er är mycket högre än på processorer.

Arkitektur GPR/data+adressregister FP registrerar Anteckningar
AT&T Hobbit 000 stack om 7 Alla datamanipuleringsinstruktioner fungerar enbart inom register, och data måste flyttas till ett register innan behandling.
Cray-1 8 skalära data, 8 adresser 8 skalär, 8 vektor

(64 element)

Skalära dataregister kan vara heltal eller flyttal; även 64 skalära T-register och 64 B-register för adress
4004 1 ackumulator, 16 andra 000 Register A är generellt, medan r0–r15-registren är för adressen och segmentet.
8008 1 ackumulator, 6 andra 000 A-registret är en ackumulator till vilken all aritmetik görs; H- och L-registren kan användas i kombination som ett adressregister; alla register kan användas som operander i ladda/lagra/flytta/öka/minska instruktioner och som den andra operanden i aritmetiska instruktioner. Det finns ingen flyttalsenhet (FPU) tillgänglig.
8080 1 ackumulator, 6 andra 000 Plus en stackpekare. A-registret är en ackumulator till vilken all aritmetik görs; registerparen B+C, D+E och H+L kan användas som adressregister i vissa instruktioner; alla register kan användas som operander i ladda/lagra/flytta/öka/minska instruktioner och som den andra operanden i aritmetiska instruktioner. Vissa instruktioner använder endast H+L; en annan instruktion byter ut H+L och D+E. Flyttalsprocessorer avsedda för 8080 var Intel 8231, AMD Am9511 och Intel 8232. De var också lätta att använda med Z80 och liknande processorer.
iAPX432 000 stack om 6 Stackmaskin
16-bitars x86 00 6 stack om 8

(om FP finns)

8086 / 8088 , 80186 / 80188 , 80286 , med 8087 , 80187 eller 80287 för flyttal, med en 80-bitars bred, 8 djup registerstack med några instruktioner som kan använda register i förhållande till toppen av stacken; utan 8087/80187/80287, inga flyttalsregister
IA-32 00 8 stack om 8 (om FP finns),

8 (om SSE/MMX finns)

80386 krävde 80387 för flyttal, senare processorer hade inbyggd flyttal, där båda hade en 80-bitars bred, 8 djup registerstack med några instruktioner som kan använda register i förhållande till toppen av stacken som operander. Pentium III och senare hade SSE med ytterligare 128-bitars XMM-register.
x86-64 016 16 eller 32

(om AVX-512 finns tillgänglig)

FP-register är 128-bitars XMM-register, senare utökade till 256-bitars YMM-register med AVX/AVX2 och 512-bitars ZMM0–ZMM31-register med AVX-512 .
Fairchild F8 en ackumulator, 64 scratchpad-register, ett indirekt scratchpad-register (ISAR) Instruktioner kan direkt referera till de första 16 scratchpad-registren och kan komma åt alla scratchpad-register indirekt via ISAR
Geode GX 1 data, 1 adress 00 8 Geode GX/ Media GX /4x86/ 5x86 är emuleringen av 486/Pentium-kompatibel processor gjord av Cyrix / National Semiconductor . Precis som Transmeta hade processorn ett översättningslager som översatte x86-kod till inbyggd kod och exekverade den. [ citat behövs ] Den stöder inte 128-bitars SSE-register, bara 80387-stacken med åtta 80-bitars flyttalsregister, och stöder delvis 3DNow! från AMD. Den ursprungliga processorn innehåller endast 1 data- och 1 adressregister för alla ändamål och det översätts till 4 vägar av 32-bitars namnregister r1 (bas), r2 (data), r3 (bakåtpekare) och r4 (stackpekare) inom scratchpad SRAM för heltalsdrift och den använder L1-cachen för x86-kodemulering (den är inte kompatibel med vissa 286/386/486-instruktioner i verkligt läge). [ Citat behövs ] Senare övergavs designen efter att AMD förvärvat IP:n från National Semiconductor och märkt den med Athlon-kärna på den inbäddade marknaden.
SunPlus SPG 000 6 stack + 4 SIMD En 16-bitars bred, 32-bitars adressrymdstackmaskinprocessor från det taiwanesiska företaget Sunplus Technology, den kan hittas på Vtechs V.Smile-linje för utbildningsändamål och videospelskonsoler som Wireless 60, Mattel HyperScan och XaviXPORT. Det saknar något generellt register eller internt register för namn/döpning, men dess flyttalsenhet har en 80-bitars 6-stegs stack och fyra 128-bitars VLIW SIMD-register på en vertex shader co-processor.
VM Labs Nuon 000 00 1 En 32-bitars stackmaskinprocessor utvecklad av VM Labs och specialiserad för multimedia. Den finns på företagets egen Nuon DVD-spelare konsollinje och Game Wave Family Entertainment System från ZaPit-spel. Designen var starkt påverkad av Intels MMX-teknik; den innehöll en 128-byte unified stack cache för både vektor- och skalära instruktioner. Den förenade cachen kan delas upp som åtta 128-bitars vektorregister eller trettiotvå 32-bitars SIMD-skalärregister genom bankdöpning; det finns inget heltalsregister i den här arkitekturen.
Nios II 031 00 8 Nios II är baserad på MIPS IV-instruktionsuppsättningen [ citat behövs ] och har 31 32-bitars GPR:er, med register 0 fastanslutet till noll, och åtta 64-bitars flyttalsregister [ hänvisning behövs ]
Motorola 6800 2 data, 1 index 000 Plus en stackpekare
Motorola 68k 8 data (d0–d7), 8 adresser (a0–a7) 00 8

(om FP finns)

Adressregistret 8 (a7) är stackpekaren. 68000, 68010, 68012, 68020 och 68030 kräver en FPU för flyttal; 68040 hade FPU inbyggd. FP-register är 80-bitars.
SH 16-bitars 00 1 00 6
Känslomotor 3(VU0)+ 32(VU1) 32 SIMD (integrerad i UV1)

+ 2 × 32 Vector (dedikerad vektor co-processor placerad nära dess GPU)

Emotion Engines huvudkärna (VU0) är en kraftigt modifierad DSP-generell kärna avsedd för allmänna bakgrundsuppgifter och den innehåller en 64-bitars ackumulator, två allmänna dataregister och en 32-bitars programräknare. En modifierad MIPS III körbar kärna (VU1) är avsedd för speldata och protokollkontroll, och den innehåller trettiotvå 32-bitars allmänna register för heltalsberäkning och trettiotvå 128-bitars SIMD-register för lagring av SIMD-instruktioner, strömmande datavärde och något heltalsberäkningsvärde, och ett ackumulatorregister för att koppla generell flyttalsberäkning till vektorregisterfilen på samprocessorn. Koprocessorn är byggd via en 32-posters 128-bitars vektorregisterfil (kan bara lagra vektorvärden som passerar från ackumulatorn i CPU) och inga heltalsregister är inbyggda. Både vektorsamprocessorn (VPU 0/1) och Emotion Engines hela huvudprocessormodul (VU0 + VU1 + VPU0 + VPU1) är byggda baserat på en modifierad MIPS-instruktionsuppsättning. Ackumulatorn i detta fall är inte allmänt ändamål utan kontrollstatus.
CUDA konfigurerbar, upp till 255 per tråd Tidigare generationer tillät upp till 127/63 register per tråd ( Tesla / Fermi ). Ju fler register som konfigureras per tråd, desto färre trådar kan köras samtidigt. Register är 32 bitar breda; Flyttal med dubbel precision och 64-bitars pekare kräver därför två register. Den har dessutom upp till 8 predikatregister per tråd.
CDC 6000-serien 016 00 8 8 A-register, A0–A7, innehåller 18-bitars adresser; 8 'B'-register, B0–B7, innehåller 18-bitars heltalsvärden (med B0 permanent inställd på noll); 8 'X'-register, X0–X7, innehåller 60 bitar av heltals- eller flyttalsdata. Sju av de åtta 18-bitars A-registren kopplades till deras motsvarande X-register: inställning av något av A1–A5-registren till ett värde orsakade en minnesbelastning av innehållet i den adressen till motsvarande X-register. På samma sätt orsakade inställning av en adress i registren A6 eller A7 en minneslagring till den platsen i minnet från X6 eller X7. (Registren A0 och X0 var inte kopplade så här).
System/360 , System/370 , System/390 , z/Arkitektur 016 4 (om FP finns);

16 i G5 och senare S/390-modeller och z/Architecture

FP var valfritt i System/360 och alltid närvarande i S/370 och senare. I processorer med Vector Facility finns det 16 vektorregister som innehåller ett maskinberoende antal 32-bitars element. Vissa register tilldelas ett fast syfte genom att anropa konventioner ; till exempel används register 14 för subrutinreturadresser och för ELF ABI:er används register 15 som en stackpekare. S/390 G5-processorn ökade antalet flyttalsregister till 16.
MMIX 256 256 En instruktionsuppsättning designad av Donald Knuth i slutet av 1990-talet i pedagogiska syften.
NS320xx 00 8 00 8

(om FP finns)

Xelererad X10 00 1 032 En 32/40-bitars stackmaskinbaserad nätverksprocessor med en modifierad MIPS-instruktionsuppsättning och en 128-bitars flyttalsenhet. [ citat behövs ]
Parallaxpropeller 000 00 2 En åttakärnig 8/16-bitars skivad stackmaskinkontroller med en enkel logisk krets inuti, den har 8 kuggräknare (kärnor), var och en innehåller tre 8/16 bitars specialkontrollregister med 32 bitars x 512 stack RAM. Det innehåller dock inget allmänt register för heltalsändamål. Till skillnad från de flesta skuggregisterfiler i moderna processorer och flerkärniga system, kan allt stack-RAM i kugghjul nås på instruktionsnivå, vilket gör att alla dessa kuggar kan fungera som en enda allmän kärna om det behövs. Flyttalsenhet är extern och den innehåller två 80-bitars vektorregister.
Itanium 128 128 Och 64 1-bitars predikatregister och 8 grenregister. FP-registren är 82-bitars.
SPARC 031 032 Globalt register 0 är kopplat till 0. Använder registerfönster .
IBM POWER 032 032 Och 1 länk och 1 count register.
Power ISA 032 032 Och 1 länk och 1 count register. Processorer som stöder Vector-funktionen har också 32 128-bitars vektorregister.
Blackfen 8 data, 2 ackumulatorer, 6 adresser 000 Och stackpekare och rampekare. Ytterligare register används för att implementera noll-overhead-loopar och cirkulära buffert-DAGs (dataadressgeneratorer).
IBM Cell SPE 128 128 GPR, som kan innehålla heltals-, adress- eller flyttalsvärden
PDP-10 016 Alla register kan användas generellt (heltal, flytande, stackpekare, hopp, indexering, etc.). Varje 36-bitars minne (eller register) ord kan också manipuleras som ett halvord, vilket kan betraktas som en (18-bitars) adress. Andra ordtolkningar används av vissa instruktioner. I de ursprungliga PDP-10-processorerna motsvarade dessa 16 GPR också huvudminnesplatserna 0–15 ; ett hårdvarualternativ som kallas "snabbt minne" implementerade registren som separata IC:er, och referenser till minnesplatser 0–15 hänvisade till IC-registren. Senare modeller implementerade registren som "snabbt minne" och fortsatte att få minnesplatserna 0–15 att referera till dem. Rörelseinstruktioner tar (register, minne) operander: MOVE 1,2 är register-register och MOVE 1,1000 är minne-till-register.
PDP-11 00 7 00 6

(om FPP finns)

R7 är programräknaren. Alla register kan vara en stackpekare men R6 används för hårdvaruavbrott och fällor.
VAX 016 GPR:erna används också för flyttalsvärden. Tre av registren har speciella användningsområden: R12 (Argument Pointer), R13 (Frame Pointer) och R14 (Stack Pointer), medan R15 refererar till Program Counter.
Alfa 031 031 Register R31 (heltal) och F31 (flyttal) är fastkopplade till noll.
6502 1 data, 2 index 000 6502:s innehåll A (ackumulator) register för huvudändamålsdatalager och minnesadress (8-bitars data/16-bitars adress), X och Y är indirekta och direkta indexregister (respektive) och SP-registren är endast specifika index.
W65C816S 00 1 000 65c816 är 16-bitars efterföljaren till 6502. X, Y och D (Direct Page register) är villkorsregister och SP-registret är endast specifika index. Huvudackumulatorn utökas till 16-bitars (C) samtidigt som 8-bitars (A) behålls för kompatibilitet och huvudregister kan nu adressera upp till 24-bitars (16-bitars bred datainstruktion/24-bitars minnesadress).
Jag p 00 4 00 8 Media-inbäddad processor var en 32-bitars processor utvecklad av Toshiba med en moddad 8080-instruktionsuppsättning. Endast A-, B-, C- och D-registren är tillgängliga i alla lägen (8/16/32-bitars). Det är inkompatibelt med x86; den innehåller dock en 80-bitars flyttalsenhet som är x87-kompatibel.
PIC mikrokontroller 00 1 000
AVR mikrokontroller 032 000
ARM 32-bitars (ARM/A32, Thumb-2/T32) 014 Varierar

(upp till 32)

r15 är programräknaren och kan inte användas som en GPR; r13 är stackpekaren; r8–r13 kan kopplas ut för andra (bankas) på en processorlägesomkopplare. Äldre versioner hade 26-bitars adressering och använde övre bitar av programräknaren (r15) för statusflaggor, vilket gjorde att registret blev 32-bitars.
ARM 32-bitars (tumme) 00 8 016 Version 1 av Thumb, som endast stödde åtkomst till register r0 till r7
ARM 64-bitars (A64) 031 032 Register r31 är stackpekaren eller ansluten till 0, beroende på sammanhanget.
MIPS 031 032 Heltalsregister 0 är fastkopplat till 0.
RISC-V 031 032 Heltalsregister 0 fastkopplat till 0. Varianten RV32E, avsedd för system med mycket begränsade resurser, har 15 heltalsregister.
uppenbarelse 64 (per kärna) Varje instruktion styr om register tolkas som heltal eller flytande punkt med precision. Arkitektur är skalbar till 4096 kärnor med 16 och 64 kärnimplementeringar tillgängliga för närvarande.

Användande

Antalet register som är tillgängliga på en processor och de operationer som kan utföras med dessa register har en betydande inverkan på effektiviteten hos kod som genereras genom att optimera kompilatorer . Strahler -numret för ett uttrycksträd ger det minsta antalet register som krävs för att utvärdera det uttrycksträdet.

Se även