mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 22:33:08 +00:00
75 lines
2.9 KiB
Zig
75 lines
2.9 KiB
Zig
const std = @import("../std.zig");
|
|
|
|
fn writeUnknownReg(writer: anytype, reg_number: u8) !void {
|
|
try writer.print("reg{}", .{reg_number});
|
|
}
|
|
|
|
pub fn writeRegisterName(writer: anytype, arch: ?std.Target.Cpu.Arch, reg_number: u8) !void {
|
|
if (arch) |a| {
|
|
switch (a) {
|
|
.x86_64 => {
|
|
switch (reg_number) {
|
|
0 => try writer.writeAll("RAX"),
|
|
1 => try writer.writeAll("RDX"),
|
|
2 => try writer.writeAll("RCX"),
|
|
3 => try writer.writeAll("RBX"),
|
|
4 => try writer.writeAll("RSI"),
|
|
5 => try writer.writeAll("RDI"),
|
|
6 => try writer.writeAll("RBP"),
|
|
7 => try writer.writeAll("RSP"),
|
|
8...15 => try writer.print("R{}", .{reg_number}),
|
|
16 => try writer.writeAll("RIP"),
|
|
17...32 => try writer.print("XMM{}", .{reg_number - 17}),
|
|
33...40 => try writer.print("ST{}", .{reg_number - 33}),
|
|
41...48 => try writer.print("MM{}", .{reg_number - 41}),
|
|
49 => try writer.writeAll("RFLAGS"),
|
|
50 => try writer.writeAll("ES"),
|
|
51 => try writer.writeAll("CS"),
|
|
52 => try writer.writeAll("SS"),
|
|
53 => try writer.writeAll("DS"),
|
|
54 => try writer.writeAll("FS"),
|
|
55 => try writer.writeAll("GS"),
|
|
// 56-57 Reserved
|
|
58 => try writer.writeAll("FS.BASE"),
|
|
59 => try writer.writeAll("GS.BASE"),
|
|
// 60-61 Reserved
|
|
62 => try writer.writeAll("TR"),
|
|
63 => try writer.writeAll("LDTR"),
|
|
64 => try writer.writeAll("MXCSR"),
|
|
65 => try writer.writeAll("FCW"),
|
|
66 => try writer.writeAll("FSW"),
|
|
67...82 => try writer.print("XMM{}", .{reg_number - 51}),
|
|
// 83-117 Reserved
|
|
118...125 => try writer.print("K{}", .{reg_number - 118}),
|
|
// 126-129 Reserved
|
|
else => try writeUnknownReg(writer, reg_number),
|
|
}
|
|
},
|
|
|
|
// TODO: Add x86, aarch64
|
|
|
|
else => try writeUnknownReg(writer, reg_number),
|
|
}
|
|
} else try writeUnknownReg(writer, reg_number);
|
|
}
|
|
|
|
const FormatRegisterData = struct {
|
|
reg_number: u8,
|
|
arch: ?std.Target.Cpu.Arch,
|
|
};
|
|
|
|
pub fn formatRegister(
|
|
data: FormatRegisterData,
|
|
comptime fmt: []const u8,
|
|
options: std.fmt.FormatOptions,
|
|
writer: anytype,
|
|
) !void {
|
|
_ = fmt;
|
|
_ = options;
|
|
try writeRegisterName(writer, data.arch, data.reg_number);
|
|
}
|
|
|
|
pub fn fmtRegister(reg_number: u8, arch: ?std.Target.Cpu.Arch) std.fmt.Formatter(formatRegister) {
|
|
return .{ .data = .{ .reg_number = reg_number, .arch = arch } };
|
|
}
|