diff options
Diffstat (limited to 'Variables.zig')
| -rw-r--r-- | Variables.zig | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/Variables.zig b/Variables.zig index 9732afa..d23f1f4 100644 --- a/Variables.zig +++ b/Variables.zig @@ -140,23 +140,10 @@ pub const Query = union(enum) { register: RegisterEnum, stack: usize, - pub fn all(allocator: Allocator) Allocator.Error![]Query { - const constants = tags(ConstantEnum); - const registers = tags(RegisterEnum); - const n = constants.len + registers.len; - const queries = try allocator.alloc(Query, n); - for (queries[0..constants.len], constants) |*dest, src| - dest.* = .{ .constant = src }; - for (queries[constants.len..][0..registers.len], - registers) |*dest, src| - dest.* = .{ .register = src }; - return queries; - } - pub fn skip(q: Query, r: Query, s: Query) bool { - return eql(q, r) or eql(r, s) or eql(s, q) - or q == .constant and r == .constant and s == .constant - or q != .constant and r != .constant and s != .constant; + return eql(r, s) + or r == .constant and s == .constant + or (r == .constant or s == .constant) and q.constant != .max1; } pub fn format(query: Query, writer: *Writer) Writer.Error!void { @@ -168,6 +155,26 @@ pub const Query = union(enum) { } }; +pub fn constantQueries() []Query { + var queries: [tags(ConstantEnum).len]Query = undefined; + for (&queries, tags(ConstantEnum)) |*dest, src| + dest.* = .{ .constant = src }; + return &queries; +} + +pub fn allQueries(allocator: Allocator) Allocator.Error![]Query { + const constants = tags(ConstantEnum); + const registers = tags(RegisterEnum); + const n = constants.len + registers.len; + const queries = try allocator.alloc(Query, n); + for (queries[0..constants.len], constants) |*dest, src| + dest.* = .{ .constant = src }; + for (queries[constants.len..][0..registers.len], + registers) |*dest, src| + dest.* = .{ .register = src }; + return queries; +} + pub fn get(variables: Variables, query: Query, tmp: []Register) ![]const Register { switch (query) { |
