Commit a52d1476b7

Noam Preil <pleasantatk@gmail.com>
2020-05-22 21:24:24
[Stage2/Codegen] Document x64 register enum layout
1 parent 64955de
Changed files (1)
src-self-hosted
codegen
src-self-hosted/codegen/x86_64.zig
@@ -1,4 +1,20 @@
 // zig fmt: off
+
+/// Definitions of all of the x64 registers. The order is very, very important.
+/// The registers are defined such that IDs go in descending order of 64-bit,
+/// 32-bit, 16-bit, and then 8-bit, and each set contains exactly sixteen
+/// registers. This results in some very, very useful properties:
+///
+/// Any 64-bit register can be turned into its 32-bit form by adding 16, and
+/// vice verse. This also works between 32-bit and 16-bit. With 8-bit, it works
+/// for all except for sp, bp, si, and di, which don't *have* an eight-bit
+/// form.
+///
+/// If (register & 8) is set, the register is extended.
+///
+/// The ID can be easily determined by figuring out what range the register is
+/// in, and then subtracting the base.
+/// 
 pub const Register = enum(u8) {
     // 0 through 15, 64-bit registers. 8-15 are extended.
     // id is just the int value.