lib/choir/src/backends/aarch64/admission.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 const dialects = @import("../../dialects/root.zig");
 3 
 4 pub const Status = enum { admitted, deferred };
 5 pub const Unit = enum { scalar, floating, vectors, memory, atomics, calls, syscalls, control, conversions };
 6 pub const Entry = struct { name: []const u8, status: Status, unit: Unit };
 7 
 8 /// Control legality: scalar integer/index/bool results and carried values;
 9 /// bool conditions; index for bounds/induction; one block per region and
10 /// type/arity-matched terminal yields or while-before condition. If without
11 /// else requires zero results. While input/before/after/result types agree.
12 /// Limits and shape validation are owned by control.zig.
13 /// Dispatch inventory from the parity review, qualified by scalar type legality.
14 pub const operations = [_]Entry{
15     .{ .name = dialects.ArithDialect.AbsOp.operation_name, .status = .admitted, .unit = .scalar },
16     .{ .name = dialects.ArithDialect.AddOp.operation_name, .status = .admitted, .unit = .scalar },
17     .{ .name = dialects.ArithDialect.AddoOp.operation_name, .status = .deferred, .unit = .scalar },
18     .{ .name = dialects.ArithDialect.AndOp.operation_name, .status = .admitted, .unit = .scalar },
19     .{ .name = dialects.ArithDialect.BitcastOp.operation_name, .status = .deferred, .unit = .conversions },
20     .{ .name = dialects.ArithDialect.CastOp.operation_name, .status = .admitted, .unit = .scalar },
21     .{ .name = dialects.ArithDialect.CmpOp.operation_name, .status = .admitted, .unit = .scalar },
22     .{ .name = dialects.ArithDialect.ConstantOp.operation_name, .status = .admitted, .unit = .scalar },
23     .{ .name = dialects.ArithDialect.CosOp.operation_name, .status = .deferred, .unit = .floating },
24     .{ .name = dialects.ArithDialect.DivOp.operation_name, .status = .admitted, .unit = .scalar },
25     .{ .name = dialects.ArithDialect.ExpOp.operation_name, .status = .deferred, .unit = .floating },
26     .{ .name = dialects.ArithDialect.ExtractOp.operation_name, .status = .deferred, .unit = .vectors },
27     .{ .name = dialects.ArithDialect.FloorOp.operation_name, .status = .deferred, .unit = .floating },
28     .{ .name = dialects.ArithDialect.FmaOp.operation_name, .status = .deferred, .unit = .floating },
29     .{ .name = dialects.ArithDialect.InsertOp.operation_name, .status = .deferred, .unit = .vectors },
30     .{ .name = dialects.ArithDialect.LogOp.operation_name, .status = .deferred, .unit = .floating },
31     .{ .name = dialects.ArithDialect.MaxOp.operation_name, .status = .admitted, .unit = .scalar },
32     .{ .name = dialects.ArithDialect.MinOp.operation_name, .status = .admitted, .unit = .scalar },
33     .{ .name = dialects.ArithDialect.MulOp.operation_name, .status = .admitted, .unit = .scalar },
34     .{ .name = dialects.ArithDialect.MuloOp.operation_name, .status = .deferred, .unit = .scalar },
35     .{ .name = dialects.ArithDialect.NegOp.operation_name, .status = .admitted, .unit = .scalar },
36     .{ .name = dialects.ArithDialect.NotOp.operation_name, .status = .admitted, .unit = .scalar },
37     .{ .name = dialects.ArithDialect.OrOp.operation_name, .status = .admitted, .unit = .scalar },
38     .{ .name = dialects.ArithDialect.PopCountOp.operation_name, .status = .admitted, .unit = .scalar },
39     .{ .name = dialects.ArithDialect.PowOp.operation_name, .status = .deferred, .unit = .floating },
40     .{ .name = dialects.ArithDialect.RemOp.operation_name, .status = .admitted, .unit = .scalar },
41     .{ .name = dialects.ArithDialect.SelectOp.operation_name, .status = .admitted, .unit = .scalar },
42     .{ .name = dialects.ArithDialect.ShlOp.operation_name, .status = .admitted, .unit = .scalar },
43     .{ .name = dialects.ArithDialect.ShrOp.operation_name, .status = .admitted, .unit = .scalar },
44     .{ .name = dialects.ArithDialect.SinOp.operation_name, .status = .deferred, .unit = .floating },
45     .{ .name = dialects.ArithDialect.SplatOp.operation_name, .status = .deferred, .unit = .vectors },
46     .{ .name = dialects.ArithDialect.SqrtOp.operation_name, .status = .deferred, .unit = .floating },
47     .{ .name = dialects.ArithDialect.SubOp.operation_name, .status = .admitted, .unit = .scalar },
48     .{ .name = dialects.ArithDialect.SuboOp.operation_name, .status = .deferred, .unit = .scalar },
49     .{ .name = dialects.ArithDialect.TanOp.operation_name, .status = .deferred, .unit = .floating },
50     .{ .name = dialects.ArithDialect.TanhOp.operation_name, .status = .deferred, .unit = .floating },
51     .{ .name = dialects.ArithDialect.UmulhiOp.operation_name, .status = .admitted, .unit = .scalar },
52     .{ .name = dialects.ArithDialect.UshrOp.operation_name, .status = .admitted, .unit = .scalar },
53     .{ .name = dialects.ArithDialect.VecCmpOp.operation_name, .status = .deferred, .unit = .vectors },
54     .{ .name = dialects.ArithDialect.VecConstantOp.operation_name, .status = .deferred, .unit = .vectors },
55     .{ .name = dialects.ArithDialect.VecShuffleOp.operation_name, .status = .deferred, .unit = .vectors },
56     .{ .name = dialects.ArithDialect.XorOp.operation_name, .status = .admitted, .unit = .scalar },
57     .{ .name = dialects.FuncDialect.CallOp.operation_name, .status = .deferred, .unit = .calls },
58     .{ .name = dialects.FuncDialect.ReturnOp.operation_name, .status = .admitted, .unit = .scalar },
59     .{ .name = dialects.FuncDialect.SyscallOp.operation_name, .status = .deferred, .unit = .syscalls },
60     .{ .name = dialects.MemrefDialect.AllocOp.operation_name, .status = .deferred, .unit = .memory },
61     .{ .name = dialects.MemrefDialect.AllocaOp.operation_name, .status = .deferred, .unit = .memory },
62     .{ .name = dialects.MemrefDialect.AtomicCasOp.operation_name, .status = .deferred, .unit = .atomics },
63     .{ .name = dialects.MemrefDialect.AtomicLoadOp.operation_name, .status = .deferred, .unit = .atomics },
64     .{ .name = dialects.MemrefDialect.AtomicStoreOp.operation_name, .status = .deferred, .unit = .atomics },
65     .{ .name = dialects.MemrefDialect.DeallocOp.operation_name, .status = .deferred, .unit = .memory },
66     .{ .name = dialects.MemrefDialect.FenceOp.operation_name, .status = .deferred, .unit = .atomics },
67     .{ .name = dialects.MemrefDialect.GetGlobalOp.operation_name, .status = .deferred, .unit = .memory },
68     .{ .name = dialects.MemrefDialect.LoadOp.operation_name, .status = .deferred, .unit = .memory },
69     .{ .name = dialects.MemrefDialect.StoreOp.operation_name, .status = .deferred, .unit = .memory },
70     .{ .name = dialects.MemrefDialect.ViewOp.operation_name, .status = .deferred, .unit = .memory },
71     .{ .name = dialects.ScfDialect.ConditionOp.operation_name, .status = .admitted, .unit = .control },
72     .{ .name = dialects.ScfDialect.ForOp.operation_name, .status = .admitted, .unit = .control },
73     .{ .name = dialects.ScfDialect.IfOp.operation_name, .status = .admitted, .unit = .control },
74     .{ .name = dialects.ScfDialect.WhileOp.operation_name, .status = .admitted, .unit = .control },
75     .{ .name = dialects.ScfDialect.YieldOp.operation_name, .status = .admitted, .unit = .control },
76 };
77 
78 pub fn lookup(name: []const u8) ?Entry {
79     for (operations) |entry| {
80         if (std.mem.eql(u8, name, entry.name)) return entry;
81     }
82     return null;
83 }
84 
85 test "aarch64 admission inventory has 61 unique dispatch names" {
86     try std.testing.expectEqual(@as(usize, 61), operations.len);
87     for (operations, 0..) |entry, index| {
88         for (operations[0..index]) |previous| {
89             try std.testing.expect(!std.mem.eql(u8, entry.name, previous.name));
90         }
91     }
92 }