In der Informatik ist x64 eine 64-Bit-Befehlssatzarchitektur, die auf der x86-Architektur basiert und bei PCs seit 2003 Verbreitung findet. Alternative Bezeichnungen sind x86-64 (auch in der Schreibweise „x86_64“) und AMD64 (auch in Kleinschreibung: „amd64“).
Da x86-Prozessoren rückwärts-kompatibel ausgelegt sind, bieten auch x64-Prozessoren neben dem 64-Bit-Betriebsmodus ebenfalls den bisherigen 32-Bit- sowie die ursprünglichen 16-Bit-Modi. Damit ergänzt x64 die bzw. kurz IA-32 um einen 64-Bit-Betriebsmodus.
Implementierungen x64 wird sowohl durch AMD als auch durch Intel implementiert: AMD64 (seit 2003) – für Prozessoren des Unternehmens Advanced Micro Devices (AMD) Intel 64 (seit 2005) – für Prozessoren des Unternehmens Intel; vormals auch IA-32e und EM64T bezeichnet
Die Implementierungen von AMD und Intel weisen im Detail Unterschiede auf, die jedoch in der Praxis kaum Auswirkungen haben. Nicht nur die Bezeichnung „x64“ (wie z. B. von Windows genutzt), sondern auch „amd64“ (wie z. B. von Linux genutzt, aber teilweise auch von Windows) und „x86-64“ (der Entwicklungsname von AMD64) stehen somit für beide Implementierungen gleichermaßen.
Andere Hersteller sind mit AMD64 und Intel 64 kompatibel, ohne dass deren x86-64-Befehlssatzerweiterung eine eigene Bezeichnung hätte. Dies ist z. B. bei VIA/Centaur der Fall: die 2008 vorgestellten Nano-x86-Prozessoren der von Grund auf neu entwickelten Isaiah-Mikroarchitektur bieten einen kompatiblen 64-Bit-Modus.
Geschichte Die x86-64-Architektur entstand als Gegenentwurf zur Itanium-Architektur „IA-64“ von Intel und Hewlett Packard. Während Intel eine ganz neue 64-Bit-Architektur erschuf, die mit der damals und auch danach in PCs meistverwendeten IA-32-Architektur nur wenig gemeinsam hatte, wählte AMD einen weit weniger radikalen Ansatz: Als Erweiterung des bestehenden Befehlssatzes ist ein 64-Bit-x86-Prozessor ebenfalls ein vollwertiger 32-Bit-x86-Prozessor, nur mit zusätzlichen Befehlen und Modi, die im hinzugekommenen Betriebsmodus verbreiterte Register zur Verfügung stellen. Dadurch bleibt die Befehlssatzarchitektur und die Kompatibität zu bestehender Software erhalten.
Intel stellte die ersten IA-64-Prozessoren (IA-64 entspricht Itanium) am 4. Oktober 1999 vor. Tags darauf kündigte AMD seinen Gegenentwurf an und veröffentlichte die „x86-64“-Spezifikation im August 2000. Intel brachte die erste Generation des Itanium im Juni 2001 heraus und schob noch 2002 die zweite Generation hinterher. Bei AMD dauerte es bis zum April 2003, bis die ersten Opteron mit der nun „AMD64“ getauften 64-Bit-Erweiterung verfügbar wurden. Sie wurden so gut vom Markt angenommen, dass Intel ab Juni 2004 begann, die ersten Xeon-Prozessoren („Nocona“) mit der kompatiblen „EM64T“-64-Bit-Erweiterung auszustatten.
Nun stattete AMD alle Modellreihen mit der AMD64-Erweiterung aus, während Intel bei 64-Bit noch auf die Itanium-Reihe setzte – erst im Juli 2006 wurden die ersten Desktop- und Mobilprozessoren der Core-2-Reihe mit der nun „Intel 64“ getauften Architektur verkauft. Alle Folgegenerationen IA-32-kompatibler Prozessoren von AMD und Intel sind seither als 64-Bit-Architektur ausgelegt, zuletzt die Atom-Prozessoren von Intel ab 2008. Andere Hersteller folgten der Marktentwicklung, der 64-Bit-VIA-Nano etwa wurde ab Januar 2008 verfügbar.
Bezeichnungen Geschichtlich wurde die 64-Bit-Befehlssatzerweiterung für die bestehende x86-Architektur, die von Intel IA-32 genannt wird, ab 1999 von AMD unter dem Namen „x86-64“ entwickelt. Auf einigen Systemen wurde sie auch x86_64 genannt, weil ein Bindestrich in einigen Situationen als Trennzeichen interpretiert wird. Dies ist z. B. beim Linux-Kernel, aber u. a. auch bei XNU (dem Kernel von Darwin und damit u. a. macOS) der Fall, weshalb auch uname die Schreibweise mit Unterstrich ausgibt. Als die ersten Opteron-Prozessoren von AMD 2003 mit der 64-Bit-Erweiterung vorgestellt wurden, änderte AMD den Namen dafür in „AMD64“. Die meisten Linux-Distributionen nutzen daher die offizielle Bezeichnung amd64 zur Kennzeichnung von 64-Bit-x86, wie auch der Kernel von FreeBSD bei uname. Für 32-Bit-x86 unterscheidet indes nicht nur Linux bereits nach den Befehlssatzerweiterungen, die nach dem „i386“ (die erste 32-Bit-Architektur von Intel, ohne Erweiterungen) kamen, etwa „i586“ (i386 mit den Erweiterungen des Pentium) oder „i686“ (die Erweiterungen des Pentium Pro bzw. Pentium II, auch P6-Generation genannt, d. h. mit zumindest MMX und SSE) oder sogar „i686-pae“ (i686, zusätzlich mit der PAE-Erweiterung). Bei „amd64“ ist auf jeden Fall die SSE2-Erweiterung des Prozessors nutzbar.
Architektur16-Bit32-Bit64-Bit x8680x86, x86-16ab 8086/8088 IA-32: i386 – i686, x86-32ab 80386x64x86-64, amd64ab Opteronx86-S oder x86Smögl. zukünftigIA-64 (IA-32-Emulation)ItaniumItanium 2
Die Bezeichnung x64 (für 64-Bit) wurde, angelehnt an „x86“, von Microsoft und Sun eingeführt. Teilweise wurde die 32-Bit-x86-Architektur („IA-32“) daraufhin auch als „x32“ (für 32-Bit) oder x86-32 bezeichnet, da beide technisch gesehen x86-Befehlssätze darstellen. Da Intel die x86-ISA („Instruction Set Architecture“) später IA-32 nannte und mit IA-64 (Itanium) eine neue, aber inkompatible 64-Bit-Architektur einwickelte, entsteht oft Verwirrung zwischen den Begriffen „x64“ und „IA-64“: Als Befehlssatzerweiterung ist x64 Teil der x86-Architektur und eine Erweiterung von IA-32, denn jeder Prozessor mit x64-Befehlssatz ist auch ein vollwertiger 32-Bit- und 16-Bit-x86-Prozessor – IA-64 („Intel Architecture 64-Bit“) hingegen wird auch als die Itanium-Architektur bezeichnet, die nicht x86-kompatibel ist und daher im Grundsatz auch nichts mit x64 oder IA-32 zu tun hat (außer einer IA-32-Emulation bei der ersten Itanium-Generation – da IA-64 von Intel als Nachfolger von IA-32 geplant war, wollte man so die Möglichkeit eines sanften Übergangs schaffen, allerdings war die Emulation sehr langsam und somit überwiegend unbrauchbar).
Betriebssystem-Unterstützung Das erste Betriebssystem, das eine funktionierende Unterstützung für den 64-Bit-Modus der AMD64-Prozessoren bot, war Linux (offizielle Einführung in den Linux-Kernel 1. März 2002). Von Microsoft war seit April 2005 die Windows XP Professional x64 Edition für 64-Bit-x86 verfügbar, die allerdings nur als Zwischenlösung gedacht war, bis Windows Vista im Januar 2007 auf den Markt kam.
Die x64-Edition von Windows XP wurde von Microsoft nur sehr zurückhaltend als OEM- und Systembuilder-Version vermarktet, um den „Support“-Aufwand in Grenzen zu halten und die zukünftigen Vista-Verkäufe nicht zu gefährden. Es gibt keine Home-Variante, keine Schachtel-Version für den Einzelhandel und keine vollständige Lokalisierung für Sprachen außer Englisch. Allerdings ist es möglich, diese Version mit MUI-(Multi User Interface)-Packs zu „übersetzen“.
Mac OS X (seit 2016 „macOS“) unterstützt die x64-Architektur seit Beginn der Umstellung seiner Plattform von PowerPC zu Intel-Prozessoren im Jahr 2006, der Kernel XNU lief jedoch auch auf 64-Bit-Intel-CPUs anfangs im 32-Bit-Kompatibilitätsmodus des . Der erste 64-Bit-Kernel wurde in Snow Leopard Ende 2009 verfügbar gemacht und wurde bei einigen Macs automatisch verwendet, wenn die Voraussetzungen dafür gegeben waren: neben einem 64-Bit-Prozessor ist dies auch eine in 64-Bit implementierte Firmware (EFI war zuanfangs teilweise als 32-Bit-Variante implementiert) und die Verfügbarkeit aller benötigten Treiber auch in 64-Bit (bei einigen Mac-Modellen waren essentielle Treiber stets nur in 32-Bit-Ausführung verfügbar, z. B. für die Grafikkarte). Seit dem Mitte 2012 veröffentlichten Mountain Lion ist nur noch ein 64-Bit-Kernel vorhanden.
Auch die drei wichtigsten BSD-Derivate unterstützen die AMD64-Architektur: FreeBSD, NetBSD sowie OpenBSD (ab Version 3.5).
Architektur Alle Register haben bei AMD64 eine Breite von 64 Bit. Wenn der Prozessor im 32-Bit-Kompatibilitätsmodus läuft, werden die obersten 32 Bit jedes Registers auf 0 gesetzt. Im 64-Bit-Modus bietet der Prozessor außerdem je 8 zusätzliche Integer- und SSE-Register, die im 32-Bit-Modus aus Kompatibilitätsgründen nicht verfügbar sind.
Die AMD64-Architektur besitzt folgende Anwendungsregister, die in normalen Anwendungsprogrammen zur Verfügung stehen:
Allgemeine Register (je 64 Bit) Name (ursprüngliche) Bedeutung RAX Akkumulator RBX Base Register RCX Counter RDX Data Register RBP Base-Pointer RSI Source-Index RDI Destination-Index RSP Stack-Pointer R8…R15 Register 8 bis 15 64-Bit-Media-/80-Bit-Gleitkommaregister Name Bedeutung Hinweis ST(0) … ST(7) FPU-Register 0 … 7 werdengemeinsam genutzt MMX0 … MMX7 MMX-Register 0 … 7 64-Bit-Media-/80-Bit-Gleitkommaregister Name Bedeutung XMM0 … XMM7 SSE-Register 0 … 7 XMM8 … XMM15 SSE-Register 8 … 15 Sonstige Register Name Bedeutung RIP 64-Bit-Instruction-Pointer (Befehlszeiger) RFLAGS 64-Bit-Flagregister (Statusregister) FSW FPU state word FCW FPU control word FTW FPU tag word
Die gelb hinterlegten Register R8–R15 und XMM8–XMM15 stehen ausschließlich im 64-Bit-Modus zur Verfügung. Die Register RAX–RSP sowie RFLAGS und RIP sind im 32-Bit-Modus nur 32 Bit groß und heißen dort EAX–ESP, EFLAGS und EIP, wie schon beim 80386. Der Zugriff auf die 64-Bit-Register erfolgt über neu eingeführte Befehlspräfixe. Hierfür werden Opcodes verwendet, welche im 32-Bit-Modus bereits für andere Befehle stehen. Aus diesem Grund sind die 64-Bit-Register – anders als die 32-Bit-Präfixe, die auch im 16-Bit-Modus zur Verfügung stehen – nur im 64-Bit-Modus verfügbar.
Für Gleitkommaoperationen ist zwar aus Kompatibilitätsgründen eine x87-FPU auf dem Prozessor vorhanden. Der Hersteller empfiehlt jedoch, für Gleitkommaberechnungen generell nur noch die problemärmere SSE-Einheit zu benutzen. Problematisch ist hierbei allerdings, dass die SSE-Einheit bis heute keine transzendenten Funktionen (Sinus, Cosinus, Arcustangens, Logarithmus) beherrscht; diese müssen weiterhin über die x87-FPU berechnet oder per Software emuliert werden. Außerdem beherrscht die SSE-Einheit nur 64-Bit-Gleitkommaarithmetik, während die x87-FPU-Einheit je nach Einstellung des FPU Control Words mit bis zu 80-Bit-Gleitkommaarithmetik arbeitet, obwohl die mit der SSE-Einheit unterstützen einfachen Fließkommabefehle die gleiche Latenz/Ausführungszeit haben, wie die FP-Befehle des 80x87. Außerdem bestehen die Opcodes des 80x87 nur aus 2 Bytes, während die der SSE-Befehle aus mindestens 3 Bytes (doppelte Genauigkeit wird mit Präfix 066h „umgeschaltet“, d. h. sogar 4 Bytes pro Befehl) bestehen, was bis heute den 80x87-Code wesentlich kompakter macht. Komplexere Funktionen, für welche der 80x87 (z. B. fsin, fsincos, fptan, f2xm1, fyl2x …, siehe oben) 2-Byte Rechenbefehle hatten, müssen mit SSE mithilfe der vier Grundrechenarten über Reihenentwicklung simuliert werden, was den Codecache des Prozessors belastet und die Rechengenauigkeit negativ beeinflusst.
Während heutzutage die üblichen Compiler im 64-Bit-Modus nur noch SSE-Befehle zur Fließkommaarithmetik benutzen (auch für skalare Berechnungen), funktionieren auch im 64-Bit-Modus die „alten“ 80x87-Befehle nach wie vor, sie werden aber nicht mehr bei der Übersetzung des Quellcodes benutzt. Dabei wäre sogar eine gemeinsame Verwendung von SSE- und 80x87-Befehlen auch im 64-Bit-Modus möglich. Ein Datenaustausch zwischen den Registerebenen wurde jedoch nicht implementiert und würde nur über temporäre Speicherung im RAM funktionieren. Z. B. der einfache Befehl „kopiere x87-Register ST(3) nach Register XMM0 mit doppelter Genauigkeit an die Position, welche in Register CL benannt wird“, würde aussehen wie „fstd XMM0, ST(3),CL“, in umgekehrter Ladeoperation „fldd ST(3), XMM0, CL“.