x86_64: optimize compile time of mnemonic_to_encodings_map

Remove all comptime sorts, making it compile 3x faster.
This commit is contained in:
Jacob Young 2023-11-22 20:09:54 -05:00
parent fcc071c9bd
commit 115ec25f2e

View File

@ -812,36 +812,32 @@ fn estimateInstructionLength(prefix: Prefix, encoding: Encoding, ops: []const Op
} }
const mnemonic_to_encodings_map = init: { const mnemonic_to_encodings_map = init: {
@setEvalBranchQuota(60_000); @setEvalBranchQuota(4_000);
const mnemonic_count = @typeInfo(Mnemonic).Enum.fields.len;
var mnemonic_map: [mnemonic_count][]Data = .{&.{}} ** mnemonic_count;
const encodings = @import("encodings.zig"); const encodings = @import("encodings.zig");
var entries = encodings.table; for (encodings.table) |entry| mnemonic_map[@intFromEnum(entry[0])].len += 1;
std.mem.sort(encodings.Entry, &entries, {}, struct { var data_storage: [encodings.table.len]Data = undefined;
fn lessThan(_: void, lhs: encodings.Entry, rhs: encodings.Entry) bool { var storage_i: usize = 0;
return @intFromEnum(lhs[0]) < @intFromEnum(rhs[0]); for (&mnemonic_map) |*value| {
} value.ptr = data_storage[storage_i..].ptr;
}.lessThan); storage_i += value.len;
var data_storage: [entries.len]Data = undefined; }
var mnemonic_map: [@typeInfo(Mnemonic).Enum.fields.len][]const Data = undefined; var mnemonic_i: [mnemonic_count]usize = .{0} ** mnemonic_count;
var mnemonic_int = 0; const ops_len = @typeInfo(std.meta.FieldType(Data, .ops)).Array.len;
var mnemonic_start = 0; const opc_len = @typeInfo(std.meta.FieldType(Data, .opc)).Array.len;
for (&data_storage, entries, 0..) |*data, entry, data_index| { for (encodings.table) |entry| {
data.* = .{ const i = &mnemonic_i[@intFromEnum(entry[0])];
mnemonic_map[@intFromEnum(entry[0])][i.*] = .{
.op_en = entry[1], .op_en = entry[1],
.ops = (entry[2] ++ .{.none} ** (data.ops.len - entry[2].len)).*, .ops = (entry[2] ++ .{.none} ** (ops_len - entry[2].len)).*,
.opc_len = entry[3].len, .opc_len = entry[3].len,
.opc = (entry[3] ++ .{undefined} ** (data.opc.len - entry[3].len)).*, .opc = (entry[3] ++ .{undefined} ** (opc_len - entry[3].len)).*,
.modrm_ext = entry[4], .modrm_ext = entry[4],
.mode = entry[5], .mode = entry[5],
.feature = entry[6], .feature = entry[6],
}; };
while (mnemonic_int < @intFromEnum(entry[0])) : (mnemonic_int += 1) { i.* += 1;
mnemonic_map[mnemonic_int] = data_storage[mnemonic_start..data_index];
mnemonic_start = data_index;
}
}
while (mnemonic_int < mnemonic_map.len) : (mnemonic_int += 1) {
mnemonic_map[mnemonic_int] = data_storage[mnemonic_start..];
mnemonic_start = data_storage.len;
} }
break :init mnemonic_map; break :init mnemonic_map;
}; };