about summary refs log tree commit diff
path: root/Variables.zig
diff options
context:
space:
mode:
Diffstat (limited to 'Variables.zig')
-rw-r--r--Variables.zig39
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) {