Processor register: Difference between revisions

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search
imported>RastaKins
→Examples: Added Z80 registers. Also changed the 8080 register pair separator from + to · to conform to Intel documentation.
 
imported>RastaKins
→Examples: Updated cite
 
Line 17: Line 17:
<!-- written insufficiently about accessibility from the machine code, but it is the most important classification -->
<!-- written insufficiently about accessibility from the machine code, but it is the most important classification -->
<!-- TODO - glossary format?  term/defn templates? -->
<!-- TODO - glossary format?  term/defn templates? -->
 
{| class="infobox" style="font-size:88%;width:35em;"
|-
|+ [[Intel 8086]] registers
|-
|
{| style="font-size:88%;"
|-
| style="width:10px; text-align:center;"| <sup>1</sup><sub>9</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>8</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>7</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>6</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>5</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>4</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>3</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>2</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>1</sub>
| style="width:10px; text-align:center;"| <sup>1</sup><sub>0</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>9</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>8</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>7</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>6</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>5</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>4</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>3</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>2</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>1</sub>
| style="width:10px; text-align:center;"| <sup>0</sup><sub>0</sub>
| style="width:auto; background:white; color:black" | ''(bit position)''
|-
|colspan="21" | '''Main registers''' <br />
|- style="background:silver;color:black"
| style="text-align:center; background:white" colspan="4"| &nbsp;
| style="text-align:center;" colspan="8"| AH
| style="text-align:center;" colspan="8"| AL
| style="background:white; color:black;"| '''[[Accumulator (computing)|AX]]'''
|- style="background:silver;color:black"
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="text-align:center;" colspan="8"| BH
| style="text-align:center;" colspan="8"| BL
| style="background:white; color:black;"| '''BX'''
|- style="background:silver;color:black"
| style="text-align:center; background:white" colspan="4"| &nbsp;
| style="text-align:center;" colspan="8"| CH
| style="text-align:center;" colspan="8"| CL
| style="background:white; color:black;"| '''CX'''
|- style="background:silver;color:black"
| style="text-align:center; background:white" colspan="4"| &nbsp;
| style="text-align:center;" colspan="8"| DH
| style="text-align:center;" colspan="8"| DL
| style="background:white; color:black;"| '''DX'''
|-
|colspan="21" | '''Index registers''' <br />
|- style="background:silver;color:black"
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="text-align:center;" colspan="16"| [[Index register|SI]]
| style="background:white; color:black;"| '''S'''ource '''I'''ndex
|- style="background:silver;color:black"
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="text-align:center;" colspan="16"| DI
| style="background:white; color:black;"| '''D'''estination '''I'''ndex
|- style="background:silver;color:black"
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="text-align:center;" colspan="16"| BP
| style="background:white; color:black;"| '''B'''ase '''P'''ointer
|- style="background:silver;color:black"
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="text-align:center;" colspan="16"| [[Stack register|SP]]
| style="background:white; color:black;"| '''S'''tack '''P'''ointer
|-
|colspan="21" | '''Program counter''' <br />
|- style="background:silver;color:black"
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="text-align:center;" colspan="16"| [[Program counter|IP]]
| style="background:white; color:black;"| '''I'''nstruction '''P'''ointer
|-
|colspan="21" | '''Segment registers''' <br />
|- style="background:silver;color:black"
| style="text-align:center;" colspan="16"| CS
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="background:white; color:black;"| '''C'''ode '''S'''egment
|- style="background:silver;color:black"
| style="text-align:center;" colspan="16"| DS
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="background:white; color:black;"| '''D'''ata '''S'''egment
|- style="background:silver;color:black"
| style="text-align:center;" colspan="16"| ES
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="background:white; color:black;"| '''E'''xtra '''S'''egment
|- style="background:silver;color:black"
| style="text-align:center;" colspan="16"| SS
| style="text-align:center;background:#DDD" colspan="4"| 0&nbsp;0&nbsp;0&nbsp;0
| style="background:white; color:black;"| '''S'''tack '''S'''egment
|-
|colspan="21" | '''Status register'''
|- style="background:silver;color:black"
| style="text-align:center; background:white" colspan="4"| &nbsp;
| style="text-align:center;"| -
| style="text-align:center;"| -
| style="text-align:center;"| -
| style="text-align:center;"| -
| style="text-align:center;"| [[Overflow flag|O]]
| style="text-align:center;"| [[Direction flag|D]]
| style="text-align:center;"| [[IF (x86 flag)|I]]
| style="text-align:center;"| [[Trap flag|T]]
| style="text-align:center;"| [[Sign flag|S]]
| style="text-align:center;"| [[Zero flag|Z]]
| style="text-align:center;"| -
| style="text-align:center;"| [[Adjust flag|A]]
| style="text-align:center;"| -
| style="text-align:center;"| [[Parity flag|P]]
| style="text-align:center;"| -
| style="text-align:center;"| [[Carry flag|C]]
| style="background:white; color:black" | Flags
|}
|}
A processor often contains several kinds of registers, which can be classified according to the types of values they can store or the instructions that operate on them:
A processor often contains several kinds of registers, which can be classified according to the types of values they can store or the instructions that operate on them:


* '''''User-accessible registers''''' can be read or written by machine instructions. The most common division of user-accessible registers is a division into data registers and address registers.
* '''''User-accessible registers''''' can be read or written by machine instructions. The most common division of user-accessible registers is a division into data registers and address registers.
** '''''{{vanchor|Data register}}s''''' can hold [[Data (computer science)|numeric data value]]s such as [[integer (computer science)|integers]] and, in some architectures, [[floating-point numbers]], as well as [[character (computing)|characters]], small [[bit array]]s and other data. In some older architectures, such as the [[IBM 704]], the [[IBM 709]] and successors, the [[PDP-1]], the [[PDP-4]]/[[PDP-7]]/[[PDP-9]]/[[PDP-15]], the [[PDP-5]]/[[PDP-8]], and the [[HP 2100]], a special data register known as the [[accumulator (computing)|accumulator]] is used implicitly for many operations.
** '''''{{vanchor|Data register}}s''''' can hold [[Data (computer science)|numeric data value]]s such as [[integer (computer science)|integers]] and, in some architectures, [[floating-point numbers]], as well as [[character (computing)|characters]], small [[bit array]]s, and other data.
*** On some older computers, a special data register known as the [[accumulator (computing)|accumulator]] is used implicitly for many operations. Examples include [[IBM 704]], the [[IBM 709]] and successors, the [[PDP-1]], the [[PDP-4]]/[[PDP-7]]/[[PDP-9]]/[[PDP-15]], the [[PDP-5]]/[[PDP-8]], [[HP 2100]], and the [[Intel 8080]].
** '''''{{vanchor|Address register}}s''''' hold [[Memory address|addresses]] and are used by instructions that indirectly access [[primary memory]].
** '''''{{vanchor|Address register}}s''''' hold [[Memory address|addresses]] and are used by instructions that indirectly access [[primary memory]].
*** Some processors contain registers that may only be used to hold an ''address'' or only to hold ''numeric values'' (in some cases used as an [[index register]] whose value is added as an offset from some address); others allow registers to hold either kind of quantity. A wide variety of possible [[addressing mode]]s, used to specify the effective address of an operand, exist.
*** Some processors contain registers that may only be used to hold an ''address'' or only to hold ''numeric values'' (in some cases used as an [[index register]] whose value is added as an offset from some address); others allow registers to hold either kind of quantity. A wide variety of possible [[addressing mode]]s, used to specify the effective address of an operand, exist.
Line 46: Line 161:


==Examples==
==Examples==
The following table shows the number of registers in several mainstream CPU architectures. Note that in [[x86]]-compatible processors, the stack pointer (<code>ESP</code>) is counted as an integer register, even though there are a limited number of instructions that may be used to operate on its contents. Similar caveats apply to most architectures.
The following table shows the number of registers in several mainstream CPU architectures. Although all of the below-listed architectures are different, almost all are in a basic arrangement known as the [[von Neumann architecture]], first proposed by the Hungarian-American [[mathematician]] [[John von Neumann]]. It is also noteworthy that the number of registers on [[GPUs]] is much higher than that on CPUs.
 
Although all of the below-listed architectures are different, almost all are in a basic arrangement known as the [[von Neumann architecture]], first proposed by the Hungarian-American [[mathematician]] [[John von Neumann]]. It is also noteworthy that the number of registers on [[GPUs]] is much higher than that on CPUs.


{{sticky header}}
{{sticky header}}
Line 81: Line 194:
| The [[Intel 80386|80386]] processor requires an [[Intel 80387|80387]] for floating-point operations, later processors had built-in floating-point, with both having an 80-bit wide, 8 deep register stack with some instructions able to use registers relative to the top of the stack as operands. The [[Pentium III]] and later had the [[Streaming SIMD Extensions|SSE]] with additional 128-bit XMM registers.
| The [[Intel 80386|80386]] processor requires an [[Intel 80387|80387]] for floating-point operations, later processors had built-in floating-point, with both having an 80-bit wide, 8 deep register stack with some instructions able to use registers relative to the top of the stack as operands. The [[Pentium III]] and later had the [[Streaming SIMD Extensions|SSE]] with additional 128-bit XMM registers.
|-
|-
| [[x86-64]]<ref name="intel-x86-manuals"/><ref>{{cite web|url=https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24592.pdf|title=AMD64 Architecture Programmer's Manual Volume 1: Application Programming|publisher=[[AMD]]|date=October 2013}}</ref> || style="text-align:center;" | {{0|0}}16 || style="text-align:center;" | 16 or 32
| [[x86-64]]<ref name="intel-x86-manuals"/><ref>{{cite web|url=https://www.amd.com/content/dam/amd/en/documents/processor-tech-docs/programmer-references/24592.pdf|title=AMD64 Architecture Programmer's Manual Volume 1: Application Programming|publisher=[[AMD]]|date=October 2013}}</ref> || style="text-align:center;" | 16 (or 32 if [[X86#APX (Advanced Performance Extensions)|APX]] available) || style="text-align:center;" | 16 or 32
(if AVX-512 available)
(if AVX-512 available)
| FP registers are 128-bit XMM registers, later extended to 256-bit YMM registers with [[Advanced Vector Extensions|AVX/AVX2]] and 512-bit ZMM0–ZMM31 registers with [[AVX-512]].<ref>{{cite web|url=https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf|title=Intel Architecture Instruction Set Extensions and Future Features Programming Reference|publisher=[[Intel]]|date=January 2018}}</ref>
| FP registers are 128-bit XMM registers, later extended to 256-bit YMM registers with [[Advanced Vector Extensions|AVX/AVX2]] and 512-bit ZMM0–ZMM31 registers with [[AVX-512]].<ref>{{cite web|url=https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference.pdf|title=Intel Architecture Instruction Set Extensions and Future Features Programming Reference|publisher=[[Intel]]|date=January 2018}}</ref>
|-
|-
| [[Fairchild F8]]<ref>{{cite book|url=https://datasheets.chipdb.org/Fairchild/F8/F8_prelimUM_Jan75.pdf|title=F8, Preliminary Microprocessor User's Manual|date=January 1975|publisher=Fairchild}}</ref> || style="text-align:center;" | 1 accumulator, 64 scratchpad registers, 1 indirect scratchpad register (ISAR) || {{n/a}} || Instructions can directly reference the first 16 scratchpad registers and can access all scratchpad registers indirectly through the ISAR<ref>{{cite book|url=http://www.bitsavers.org/components/fairchild/f8/F8_Guide_To_Programming_1977.pdf|title=F8 Guide to Programming|publisher=Fairchild MOS Microcomputer Division|year=1977}}</ref>
| [[Fairchild F8]]<ref>{{cite book|url=https://datasheets.chipdb.org/Fairchild/F8/F8_prelimUM_Jan75.pdf|title=F8, Preliminary Microprocessor User's Manual|date=January 1975|publisher=Fairchild}}</ref> || style="text-align:center;" | 1 accumulator, 64 scratchpad registers, 1 indirect scratchpad register (ISAR) || style="text-align:center;" | {{0|00}}0 || Instructions can directly reference the first 16 scratchpad registers and can access all scratchpad registers indirectly through the ISAR<ref>{{cite book|url=http://www.bitsavers.org/components/fairchild/f8/F8_Guide_To_Programming_1977.pdf|title=F8 Guide to Programming|publisher=Fairchild MOS Microcomputer Division|year=1977}}</ref>
|-
| [[COP400]]<ref>{{cite book |title=COP400 Microcontroller Family COPS Family User's Guide |publisher=National semiconductor |url=https://www.datasheetarchive.com/datasheet/COP400/National-Semiconductor |access-date=23 June 2025}}</ref> || style="text-align:center;" | 1 accumulator, 1 pointer || style="text-align:center;" | {{0|00}}0 || Some later versions include a 2-bit stack pointer
|-
|-
| [[Geode GX]] || style="text-align:center;" | 1 data, 1 address || style="text-align:center;" | {{0|00}}8 || Geode GX/[[Media GX]]/[[4x86]]/[[cx5x86|5x86]] is the emulation of 486/Pentium compatible processor made by [[Cyrix]]/[[National Semiconductor]]. Like [[Transmeta]], the processor had a translation layer that translated x86 code to native code and executed it.{{citation needed|date=February 2016}} It does not support 128-bit SSE registers, just the 80387 stack of eight 80-bit floating-point registers, and partially supports [[3DNow!]] from AMD. The native processor only contains 1 data and 1 address register for all purposes and it is translated into 4 paths of 32-bit naming registers r1 (base), r2 (data), r3 (back pointer), and r4 (stack pointer) within scratchpad SRAM for integer operations.{{cn|date=May 2023}}
| [[Geode GX]] || style="text-align:center;" | 1 data, 1 address || style="text-align:center;" | {{0|00}}8 || Geode GX/[[Media GX]]/[[4x86]]/[[cx5x86|5x86]] is the emulation of 486/Pentium compatible processor made by [[Cyrix]]/[[National Semiconductor]]. Like [[Transmeta]], the processor had a translation layer that translated x86 code to native code and executed it.{{citation needed|date=February 2016}} It does not support 128-bit SSE registers, just the 80387 stack of eight 80-bit floating-point registers, and partially supports [[3DNow!]] from AMD. The native processor only contains 1 data and 1 address register for all purposes and it is translated into 4 paths of 32-bit naming registers r1 (base), r2 (data), r3 (back pointer), and r4 (stack pointer) within scratchpad SRAM for integer operations.{{cn|date=May 2023}}
Line 100: Line 215:
(if FP present)
(if FP present)
| Address register 8 (a7) is the stack pointer. 68000, 68010, 68012, 68020, and 68030 require an FPU for floating-point; 68040 had FPU built in. FP registers are 80-bit.
| Address register 8 (a7) is the stack pointer. 68000, 68010, 68012, 68020, and 68030 require an FPU for floating-point; 68040 had FPU built in. FP registers are 80-bit.
|-
| [[TI MSP430|MSP430]]<ref>{{cite web |title=MSP430F552x, MSP430F551x Mixed-Signal Microcontrollers |url=https://www.ti.com/lit/ds/symlink/msp430f5529.pdf |publisher=Texas Instruments |access-date=10 November 2025}}</ref> || style="text-align:center;" | {{0|00}}13 || style="text-align:center;" | {{0|00}}0 || 13 general purpose registers including stack pointer. Others: program counter, status register, and constant generator.
|-
|-
| [[SuperH]] || style="text-align:center;" | {{0|00}}16 || style="text-align:center;" | {{0|00}}6 || 16-bit instruction version (pre-SH-5)
| [[SuperH]] || style="text-align:center;" | {{0|00}}16 || style="text-align:center;" | {{0|00}}6 || 16-bit instruction version (pre-SH-5)

Latest revision as of 03:32, 10 November 2025

Template:Short description

File:Register.svg
A register-transfer level (RTL) description of an 8-bit register with detailed implementation, showing how 8 bits of data can be stored by using flip-flops.

A processor register is a quickly accessible location available to a computer's processor.[1] Registers usually consist of a small amount of fast storage, although some registers have specific hardware functions, and may be read-only or write-only. In computer architecture, registers are typically addressed by mechanisms other than main memory, but may in some cases be assigned a memory address e.g. DEC PDP-10, ICT 1900.[2]

Almost all computers, whether load/store architecture or not, load items of data from a larger memory into registers where they are used for arithmetic operations, bitwise operations, and other operations, and are manipulated or tested by machine instructions. Manipulated items are then often stored back to main memory, either by the same instruction or by a subsequent one. Modern processors use either static or dynamic random-access memory (RAM) as main memory, with the latter usually accessed via one or more cache levels.

Processor registers are normally at the top of the memory hierarchy, and provide the fastest way to access data. The term normally refers only to the group of registers that are directly encoded as part of an instruction, as defined by the instruction set. However, modern high-performance CPUs often have duplicates of these "architectural registers" in order to improve performance via register renaming, allowing parallel and speculative execution. Modern x86 design acquired these techniques around 1995 with the releases of Pentium Pro, Cyrix 6x86, Nx586, and AMD K5.

When a computer program accesses the same data repeatedly, this is called locality of reference. Holding frequently used values in registers can be critical to a program's performance. Register allocation is performed either by a compiler in the code generation phase, or manually by an assembly language programmer.

Script error: No such module "anchor".Size

Registers are normally measured by the number of bits they can hold, for example, an 8-bit register, 32-bit register, 64-bit register, 128-bit register, or more. In some instruction sets, the registers can operate in various modes, breaking down their storage memory into smaller parts (32-bit into four 8-bit ones, for instance) to which multiple data (vector, or one-dimensional array of data) can be loaded and operated upon at the same time. Typically it is implemented by adding extra registers that map their memory into a larger register. Processors that have the ability to execute single instructions on multiple data are called vector processors.

Types

Intel 8086 registers
19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 (bit position)
Main registers
  AH AL AX
0 0 0 0 BH BL BX
  CH CL CX
  DH DL DX
Index registers
0 0 0 0 SI Source Index
0 0 0 0 DI Destination Index
0 0 0 0 BP Base Pointer
0 0 0 0 SP Stack Pointer
Program counter
0 0 0 0 IP Instruction Pointer
Segment registers
CS 0 0 0 0 Code Segment
DS 0 0 0 0 Data Segment
ES 0 0 0 0 Extra Segment
SS 0 0 0 0 Stack Segment
Status register
  - - - - O D I T S Z - A - P - C Flags

A processor often contains several kinds of registers, which can be classified according to the types of values they can store or the instructions that operate on them:

  • User-accessible registers can be read or written by machine instructions. The most common division of user-accessible registers is a division into data registers and address registers.
  • Template:Vanchors are not accessible by instructions and are used internally for processor operations.
  • Architectural registersScript error: No such module "anchor". are the registers visible to software and are defined by an architecture. They may not correspond to the physical hardware if register renaming is being performed by the underlying hardware.

Hardware registers are similar, but occur outside CPUs.

In some architectures (such as SPARC and MIPS), the first or last register in the integer register file is a pseudo-register in that it is hardwired to always return zero when read (mostly to simplify indexing modes), and it cannot be overwritten. In Alpha, this is also done for the floating-point register file. As a result of this, register files are commonly quoted as having one register more than how many of them are actually usable; for example, 32 registers are quoted when only 31 of them fit within the above definition of a register.

Examples

The following table shows the number of registers in several mainstream CPU architectures. Although all of the below-listed architectures are different, almost all are in a basic arrangement known as the von Neumann architecture, first proposed by the Hungarian-American mathematician John von Neumann. It is also noteworthy that the number of registers on GPUs is much higher than that on CPUs.

Template:Sticky header

Usage

The number of registers available on a processor and the operations that can be performed using those registers has a significant impact on the efficiency of code generated by optimizing compilers. The Strahler number of an expression tree gives the minimum number of registers required to evaluate that expression tree.

See also

References

<templatestyles src="Reflist/styles.css" />

  1. ↑ Script error: No such module "citation/CS1".
  2. ↑ Script error: No such module "citation/CS1".
  3. ↑ Script error: No such module "citation/CS1".
  4. ↑ Script error: No such module "citation/CS1".
  5. ↑ Script error: No such module "citation/CS1".
  6. ↑ Script error: No such module "citation/CS1".
  7. ↑ Script error: No such module "citation/CS1".
  8. ↑ Script error: No such module "citation/CS1".
  9. ↑ a b Script error: No such module "citation/CS1".
  10. ↑ Script error: No such module "citation/CS1".
  11. ↑ Script error: No such module "citation/CS1".
  12. ↑ Script error: No such module "citation/CS1".
  13. ↑ Script error: No such module "citation/CS1".
  14. ↑ Script error: No such module "citation/CS1".
  15. ↑ Script error: No such module "citation/CS1".
  16. ↑ Script error: No such module "citation/CS1".
  17. ↑ Script error: No such module "citation/CS1".
  18. ↑ Script error: No such module "citation/CS1".
  19. ↑ Script error: No such module "citation/CS1".
  20. ↑ Script error: No such module "citation/CS1".
  21. ↑ Script error: No such module "citation/CS1".
  22. ↑ Script error: No such module "citation/CS1".
  23. ↑ Script error: No such module "citation/CS1".
  24. ↑ Script error: No such module "citation/CS1".
  25. ↑ Script error: No such module "citation/CS1".
  26. ↑ Script error: No such module "citation/CS1".
  27. ↑ Script error: No such module "citation/CS1".
  28. ↑ Script error: No such module "citation/CS1".
  29. ↑ Script error: No such module "citation/CS1".
  30. ↑ Script error: No such module "citation/CS1".
  31. ↑ Script error: No such module "citation/CS1".
  32. ↑ Script error: No such module "citation/CS1".
  33. ↑ Script error: No such module "citation/CS1".
  34. ↑ Script error: No such module "citation/CS1".
  35. ↑ Script error: No such module "citation/CS1".
  36. ↑ Script error: No such module "citation/CS1".
  37. ↑ Script error: No such module "citation/CS1".
  38. ↑ Script error: No such module "citation/CS1".
  39. ↑ Script error: No such module "citation/CS1".
  40. ↑ Script error: No such module "citation/CS1".
  41. ↑ Script error: No such module "citation/CS1".
  42. ↑ Script error: No such module "citation/CS1".
  43. ↑ Script error: No such module "citation/CS1".

Script error: No such module "Check for unknown parameters".

Template:CPU technologies Script error: No such module "Navbox".

Script error: No such module "Authority control".