Skip to content
Just-In-Time Compiler
- Ausführung direkt auf Hardware (Intel 64) statt auf .NET Runtime
- nur kritische Teile, die oft ausgeführt werden
- Profiling: Analyse zur Laufzeit, wie viel Codeausschnitte ausgeführt werde, um "Hot Spots" zu finden
- Auf ebene Branches analysieren / zählen
Intel 64 Architektur
- Benutzt Register (statt Stack)
8[RCX]: Lies von Adresse RCX + 8 (Von Memory in Register laden)
- Signed und Unsigned Integer Addition / Subtraktion sind die gleichen (wegen 2er Komplement)
- Division und Modulo mit
IDIV
- Bei jeder Division wird von
RAX als Dividend gelesen
RDX muss 0 sein
- Das Argument ist der Divisor
RAX = RAX / Argument
RDX = RAX & Argument
Code Generation
- Template-based: Codemuster aus IL erkennen (z.B. für jede Instruktion) und daraus Intel64-Code generieren
Register Allocation
- In den "Templates" muss man wissen, in welchen Register was liegt und in welche was geschrieben werden soll
- Dazu ein Register-Stack führen, der wie Evaluation-Stack verläuft
- Statt beim Eval-Stack die Werte selbst, wird im Register-Stack geschrieben, in welchen Registern die Werte liegen
- Bei Division braucht es das
RDX-Register, und im RAX muss der Dividend stehen
RAX und RDX temporär in freie Register kopieren
Branches
- Bei conditional jumps immer zuerst
CMP, dann JE, JNE usw.