Ortogonální instrukční sada

Ortogonální instrukční sada (anglicky orthogonal instruction set) je instrukční sada, v níž všechny typy instrukcí mohou používat všechny adresovací režimy. „Ortogonalitou“ je myšlena nezávislost typu instrukce a adresovacího režimu. Ortogonální instrukční sada nevynucuje, aby určitá instrukce musela používat konkrétní registr.[1]

Ortogonalita v praxi

Procesory s kompletní instrukční sadou (CISC) mohou ve většině instrukcí pracovat jak s registry tak s pamětí, obvykle několika různými způsoby. Díky tomu není potřeba si pamatovat tisíce jednotlivých operačních kódů instrukcí, což usnadňuje programování CISC strojů. Ortogonální instrukční sada umožňuje, aby si programátor pamatoval obvykle 30 až 100 operačních kódů (jako „sčítaní – ADD“, „odčítání – SUB“, „násobení – MUL“, „dělení – DIV“, atd.) a od tří do deseti adresovacích režimů („z registru 0“, „z registru 1“, „z paměti“, atd.).

Příkladem procesorů s téměř ortogonální instrukční sadou je procesor PDP-11 firmy DEC a mikroprocesor Motorola 68000. ARM11 a VAX jsou pak uváděny jako procesory s plně ortogonální instrukční sadou.

PDP-11

Až na instrukce s pohyblivou řádovou čárkou je instrukční sada PDP-11 téměř ortogonální. Každá celočíselná instrukce může pracovat s jednobytovými nebo dvoubytovými celými čísly a její operandy mohou být uloženy v registrech, uvedeny přímo v instrukci, uloženy v paměti, nebo uloženy v paměti a referencovány adresou v registru. Adresovací režimy jsou navrženy tak, aby při použití programového čítače (PC) a ukazatele zásobníku (SP) byl výsledkem stejný efekt, jaký v ostatních architekturách poskytují speciální instrukce nebo režimy adresování. Například režim „přímého operandu“ (kdy je číselná konstanta přímo součástí instrukce (například ADD #4, R1 – přičti konstantu 4 do registru R1) je implementován jako režim „nepřímého adresování registrem s autoinkrementací“ s použitím programového čítače (R7).

Strojový kód procesoru PDP-11 používá pro jednotlivé operandy tříbitová pole (proto se označuje za osmičkově orientovaný), což umožňuje výběr registru R0-R7 nebo adresovacího režimu 0–7. Osm teoretických adresovacích režimů se díky použití ukazatele zásobníku (Stack Pointer R6) a programového čítače (Program Counter R7) jako registrů pro přístup k paměti považuje za 10 konceptuálních adresovacích režimů.

VAX-11

VAX-11 rozšířil ortogonalitu PDP-11 na všechny datové typy včetně čísel v pohyblivé řádové čárce (ačkoli instrukce jako například 'ADD' jsou rozděleny na varianty podle velikosti dat jako například ADDB, ADDW, ADDL, ADDP, ADDF po řadě pro sčítání bytů, slov, dlouslov, pakovaných BCD a čísel v pohyblivé řádové čárce s jednoduchou přesností. Stejně jako u PDP-11 jsou programový čítač a ukazatel zásobníku dvěma registry v sadě obecných registrů (R14 a R15).

Obecný tvar instrukcí procesoru VAX-11 je:

operační kód [ operand ] [ operand ]  ...

Na rozdíl od osmičkově orientovaného PDP-11 je VAX-11 šestnáctkově orientovaný stroj; každá komponenta je tvořena jedním bytem: hodnota operačního kódu je z intervalu 0–255; každý operand je vyjádřen dvěma půlbyty, z nichž vyšší 4 bity určují adresovací režim a nižší 4 bity určují (obvykle) číslo registru (R0–R15).

Výsledkem je teoreticky 16 adresovacích režimů (0–15). V adresovacích režimech 0–3 se však používají 2 nejméně významné bity z pole adresovacího režimu jako 2 nejvyšší bity pro rozšíření čtyřbitové pole bezprostředních dat, takže je dostupných celkem 13 adresovacích režimů. Díky použití programového čítače a ukazatele zásobníku jako u PDP-11 je k dispozici celkem 15 adresovacích režimů.

MC68000

Návrháři firmy Motorola usilovali o ortogonální jazyk symbolických adres, přestože podkladový strojový jazyk tak ortogonální není. Na rozdíl od PDP-11 používá MC68000 jiné registry pro data a jiné pro adresy.

Na bitové úrovni je vidět, že symbolické instrukce se překládají několika různými operačními kódy. Tento kompromis poskytuje téměř stejné pohodlí jako skutečně ortogonální stroj a také umožnil návrhářům procesoru používat bity v kódu instrukcí efektivněji než při čistě ortogonálním přístupu.

Intel 8080 a následovníci

Architektura 8bitového mikroprocesoru Intel 8080 (stejně jako 8085 a 8051) je rozšíření architektury založené na akumulátoru, a proto instrukční sada není ortogonální. Programátor v jazyce symbolických adres nebo tvůrce překladače si musí být vědom, jaké operace jsou možné s jednotlivými registry: většinu 8bitových operací lze provádět pouze s 8bitovým akumulátorem (registr A), zatímco 16bitové operace lze provádět pouze s 16bitovým ukazatelem/akumulátorem (dvojicí registrů HL), zatímco jednoduché operace, jako například inkrement, lze provádět se všemi sedmi 8bitovými registry. To bylo z větší části kvůli požadavku zachovat všechny operační kódy dlouhé jeden byte a udržovat kompatibilitu na úrovni zdrojového kódu se starším mikroprocesorem Intel 8008 (který je LSI implementací procesoru Datapoint 2200).

Mikroprocesor Z80, který je binárně kompatibilní s Intel 8080, používá prefixy překonávající tento jednobytový limit a poskytuje výkonnější instrukční sadu. Podobná myšlenka byla uplatněna při návrhu procesoru Intel 8086, kde binární kompatibilita s Intel 8080 nebyla cílem, což umožnilo radikálnější rozšíření. Výsledkem je ortogonálnější plně 16bitový mikroprocesor, který umožňuje převod programů v jazyce symbolických adres pro 8008, 8080 a 8085 na programy pro 8086. Určitý stupeň neortogonality je zachován v zájmu dosažení vyšší hustoty kódu (přestože to bylo některými informatiky v té době kritizováno jako „barokní“). 32bitové rozšíření této architektury zavedené procesorem Intel 80386 je o další krok ortogonálnější, přestože zachovává všechny instrukce 8086 a jejich rozšířené protějšky. Použitá kódovací strategie však stále vykazuje pozůstatky z 8008 a 8080 (a Z80); například určité často používané operace jako push a pop registrů a konstant stále používají jednobytové kódy, a některé instrukce jsou kratší, pokud používají primární akumulátor eax; tyto znalosti lze využít pro optimalizaci kódu v překladačích i pro ručně psaný kód.

RISC

Plně ortogonální architektura nemusí být „bitově nejefektivnější“. Výzkum provedený na konci 70. let 20. století firmou IBM i dalšími firmami ukázaly, že většina programů používá jen malou část z „ortogonálních“ adresovacích režimů. To znamená, že některé z bitů použitých pro dosažení plné ortogonality instrukční sady mohly být použity pro více bitů virtuální adresy nebo výběr z více registrů.

Návrháři architektury RISC se proto snažili o lepší rozvržení bitů strojových instrukcí. V důsledku toho se většina procesorů RISC vrátila k architektuře „load/store“, přestože zůstávají vysoce ortogonální v ohledu na to, s jakými typy dat mohou pracovat jednotlivé instrukce. Tyto architektury mají velmi málo instrukcí pracujících s pamětí; obvykle to jsou pouze instrukce, které načítají data z hlavní paměti do registru nebo ukládají data z registru zpátky do paměti. Také počet adresovacích režimů je nižší, a tyto režimy obvykle závisí na tom, zda instrukce pracuje s daty nebo se týká přenosu řízení (skok). U aritmetických a logických instrukcí je třeba nejdříve uložit jejich operandy do registrů. Omezení adresovacích režimů u těchto instrukcí umožňuje používat mnohem rozsáhlejší sadu registrů, rozšíření virtuálních adres i bezprostředních dat (tj. dat uvedených přímo v instrukci).

Odkazy

Reference

V tomto článku byl použit překlad textu z článku Orthogonal instruction set na anglické Wikipedii.

  1. NULL, Linda; LOBUR, Julia. The Essentials of Computer Organization and Architecture. [s.l.]: Jones & Bartlett Publishers, 2010. ISBN 1449600069.