authorgravatar for noam@pixelhero.devNoam Preil <noam@pixelhero.dev> 2020-05-22 15:24:24-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-22 15:32:33-04:00
loga52d1476b7b1964833b22150fe7fa1229168ece1
treed24a27a7d4941251d6ad5dcc7e532ffeecfcc56c
parent64955deb72bf0aeaa551056cf3adf8442f82eccc

[Stage2/Codegen] Document x64 register enum layout


1 files changed, 16 insertions(+), 0 deletions(-)

src-self-hosted/codegen/x86_64.zig+16
...@@ -1,4 +1,20 @@...@@ -1,4 +1,20 @@
1// zig fmt: off1// zig fmt: off
2
3/// Definitions of all of the x64 registers. The order is very, very important.
4/// The registers are defined such that IDs go in descending order of 64-bit,
5/// 32-bit, 16-bit, and then 8-bit, and each set contains exactly sixteen
6/// registers. This results in some very, very useful properties:
7///
8/// Any 64-bit register can be turned into its 32-bit form by adding 16, and
9/// vice verse. This also works between 32-bit and 16-bit. With 8-bit, it works
10/// for all except for sp, bp, si, and di, which don't *have* an eight-bit
11/// form.
12///
13/// If (register & 8) is set, the register is extended.
14///
15/// The ID can be easily determined by figuring out what range the register is
16/// in, and then subtracting the base.
17///
2pub const Register = enum(u8) {18pub const Register = enum(u8) {
3 // 0 through 15, 64-bit registers. 8-15 are extended.19 // 0 through 15, 64-bit registers. 8-15 are extended.
4 // id is just the int value.20 // id is just the int value.