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 }