Skip to documentation
SLOP

tiny.choir.backends.gpu.spirv.emitter.catalog

Reference tiny.choir backends gpu spirv emitter catalog

Defined in backends.gpu.spirv.emitter.

API (3)

Actions

Public operations.

Values and defaults

Public values and defaults.

No direct callersNo direct callsbackends.gpu.spirv.emittercatalog
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Called byCallsNo direct callsprivate sourcelib.choir.src.backends.gpu.spirv.emitter.code...emitOperationbackends.gpu.spirv.emitter.catalogemit
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsNo direct callstest sourcelib.choir.src.backends.gpu.spirv.emitter.catalogtest: spirv catalog resolves every op...test sourcelib.choir.src.backends.gpu.spirv.emitter.vali...test: spirv kernel catalog excludes m...private sourcelib.choir.src.backends.gpu.spirv.emitter.vali...validateOperationTreebackends.gpu.spirv.emitter.catalogsupports
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/choir/src/backends/gpu/spirv/emitter/catalog.zig

zig
const std = @import("std");const choir = @import("../../../../root.zig");const ir = choir.ir;const dialects = choir.dialects;const spirv_target = @import("../root.zig");const gpu_target = @import("../../../../dialects/gpu/root.zig");const dialect_writer = @import("dialect.zig");const gpu = @import("gpu.zig");const memory = @import("memory.zig");const scalar = @import("scalar.zig");const stage = @import("stage.zig");const SpirvOp = @import("ops.zig").SpirvOp;const GpuDialect = gpu_target.GpuDialect;const ArithDialect = dialects.arith.ArithDialect;const MemrefDialect = dialects.memref.MemrefDialect;const FuncDialect = dialects.func.FuncDialect;const ScfDialect = dialects.scf.ScfDialect;const SpirvDialect = spirv_target.SpirvDialect;const BuiltinKind = gpu.BuiltinKind;const builtinLoad = stage.emitBuiltinLoad;fn direct(comptime function: anytype) type {    return struct {        fn emit(            comptime ErrorSet: type,            comptime _: anytype,            self: anytype,            op: *ir.Operation,        ) ErrorSet!void {            return function(self, op);        }    };}fn withArg(comptime function: anytype, comptime argument: anytype) type {    return struct {        fn emit(            comptime ErrorSet: type,            comptime _: anytype,            self: anytype,            op: *ir.Operation,        ) ErrorSet!void {            return function(self, op, argument);        }    };}fn withTwoArgs(    comptime function: anytype,    comptime first: anytype,    comptime second: anytype,) type {    return struct {        fn emit(            comptime ErrorSet: type,            comptime _: anytype,            self: anytype,            op: *ir.Operation,        ) ErrorSet!void {            return function(self, op, first, second);        }    };}fn spirvBinary(    comptime opcode: u32,    comptime expectation: dialect_writer.SpirvBinaryExpectation,) type {    return withTwoArgs(dialect_writer.emitBinary, opcode, expectation);}fn arithBinary(comptime kind: scalar.BinaryKind) type {    return withArg(scalar.emitBinaryArith, kind);}fn arithMinMax(comptime kind: scalar.MinMaxKind) type {    return withArg(scalar.emitMinMaxArith, kind);}fn glslUnary(comptime opcode: u32) type {    return withTwoArgs(scalar.emitGlslExtUnary, opcode, scalar.FloatExtConstraint.float16_or_32);}fn arithBitwise(comptime kind: scalar.BitwiseBinaryKind) type {    return withArg(scalar.emitBitwiseBinary, kind);}fn arithShift(comptime kind: scalar.ShiftKind) type {    return withArg(scalar.emitShiftArith, kind);}fn gpuIndex(comptime builtin: gpu.BuiltinKind) type {    return withArg(gpu.emitIndex, builtin);}fn gpuSubgroupIndex(comptime builtin: gpu.BuiltinKind) type {    return withArg(gpu.emitSubgroupIndex, builtin);}fn method(comptime name: []const u8) type {    return struct {        fn emit(            comptime ErrorSet: type,            comptime Control: anytype,            self: anytype,            op: *ir.Operation,        ) ErrorSet!void {            return @call(.auto, @field(Control, name), .{ self, op });        }    };}fn unsupportedControlFlow() type {    return struct {        fn emit(            comptime ErrorSet: type,            comptime _: anytype,            _: anytype,            _: *ir.Operation,        ) ErrorSet!void {            return error.UnsupportedControlFlow;        }    };}fn operation(comptime Operation: type, comptime Emitter: type) type {    if (!@hasDecl(Operation, "operation_name")) @compileError("SPIR-V catalog name is missing");    if (!@hasDecl(Emitter, "emit")) @compileError("SPIR-V catalog emitter is missing");    return struct {        pub const name = Operation.operation_name;        fn emit(            comptime ErrorSet: type,            comptime Control: anytype,            self: anytype,            op: *ir.Operation,        ) ErrorSet!void {            return Emitter.emit(ErrorSet, Control, self, op);        }    };}pub const entries = .{    operation(SpirvDialect.ConstantOp, direct(dialect_writer.emitConstant)),    operation(SpirvDialect.IAddOp, spirvBinary(SpirvOp.IAdd, .int_any)),    operation(SpirvDialect.FAddOp, spirvBinary(SpirvOp.FAdd, .float)),    operation(SpirvDialect.ISubOp, spirvBinary(SpirvOp.ISub, .int_any)),    operation(SpirvDialect.FSubOp, spirvBinary(SpirvOp.FSub, .float)),    operation(SpirvDialect.IMulOp, spirvBinary(SpirvOp.IMul, .int_any)),    operation(SpirvDialect.FMulOp, spirvBinary(SpirvOp.FMul, .float)),    operation(SpirvDialect.UDivOp, spirvBinary(SpirvOp.UDiv, .int_unsigned)),    operation(SpirvDialect.SDivOp, spirvBinary(SpirvOp.SDiv, .int_signed)),    operation(SpirvDialect.FDivOp, spirvBinary(SpirvOp.FDiv, .float)),    operation(ArithDialect.ConstantOp, direct(scalar.emitConstant)),    operation(ArithDialect.AddOp, arithBinary(.add)),    operation(ArithDialect.SubOp, arithBinary(.sub)),    operation(ArithDialect.MulOp, arithBinary(.mul)),    operation(ArithDialect.DivOp, arithBinary(.div)),    operation(ArithDialect.MaxOp, arithMinMax(.max)),    operation(ArithDialect.MinOp, arithMinMax(.min)),    operation(ArithDialect.NegOp, direct(scalar.emitNegArith)),    operation(ArithDialect.ExpOp, glslUnary(scalar.GLSLstd450.Exp)),    operation(ArithDialect.LogOp, glslUnary(scalar.GLSLstd450.Log)),    operation(ArithDialect.TanhOp, glslUnary(scalar.GLSLstd450.Tanh)),    operation(ArithDialect.SqrtOp, direct(scalar.emitSqrtArith)),    operation(ArithDialect.AbsOp, direct(scalar.emitAbsArith)),    operation(ArithDialect.SinOp, glslUnary(scalar.GLSLstd450.Sin)),    operation(ArithDialect.CosOp, glslUnary(scalar.GLSLstd450.Cos)),    operation(ArithDialect.TanOp, glslUnary(scalar.GLSLstd450.Tan)),    operation(ArithDialect.FloorOp, glslUnary(scalar.GLSLstd450.Floor)),    operation(ArithDialect.RoundOp, direct(scalar.emitRoundArith)),    operation(ArithDialect.TruncOp, glslUnary(scalar.GLSLstd450.Trunc)),    operation(ArithDialect.PowOp, direct(scalar.emitPowArith)),    operation(ArithDialect.Atan2Op, direct(scalar.emitAtan2Arith)),    operation(ArithDialect.FmaOp, direct(scalar.emitFmaArith)),    operation(ArithDialect.AndOp, arithBitwise(.band)),    operation(ArithDialect.OrOp, arithBitwise(.bor)),    operation(ArithDialect.XorOp, arithBitwise(.bxor)),    operation(ArithDialect.NotOp, direct(scalar.emitNotArith)),    operation(ArithDialect.ShlOp, arithShift(.shl)),    operation(ArithDialect.ShrOp, arithShift(.shr)),    operation(ArithDialect.UshrOp, arithShift(.ushr)),    operation(ArithDialect.UmulhiOp, direct(scalar.emitUmulhi)),    operation(ArithDialect.CastOp, direct(scalar.emitCast)),    operation(ArithDialect.BitcastOp, direct(scalar.emitBitcast)),    operation(ArithDialect.CmpOp, direct(scalar.emitCmp)),    operation(ArithDialect.SelectOp, direct(scalar.emitSelect)),    operation(MemrefDialect.LoadOp, direct(memory.emitLoad)),    operation(MemrefDialect.StoreOp, direct(memory.emitStore)),    operation(MemrefDialect.AtomicRmwOp, direct(memory.emitAtomicRmw)),    operation(MemrefDialect.AtomicCasOp, direct(memory.emitAtomicCas)),    operation(MemrefDialect.AllocOp, direct(memory.emitAlloc)),    operation(MemrefDialect.AllocaOp, direct(memory.emitDeclaredAlloca)),    operation(FuncDialect.CallOp, method("emitCall")),    operation(SpirvDialect.LocalInvocationIdOp, gpuIndex(.local_invocation_id)),    operation(SpirvDialect.WorkgroupIdOp, gpuIndex(.workgroup_id)),    operation(SpirvDialect.WorkgroupSizeOp, gpuIndex(.workgroup_size)),    operation(SpirvDialect.NumWorkgroupsOp, gpuIndex(.num_workgroups)),    operation(SpirvDialect.GlobalInvocationIdOp, gpuIndex(.global_invocation_id)),    operation(SpirvDialect.BarrierOp, direct(gpu.emitBarrier)),    operation(SpirvDialect.SyncWarpOp, direct(gpu.emitSyncWarp)),    operation(SpirvDialect.ActiveMaskOp, direct(gpu.emitActiveMask)),    operation(SpirvDialect.AllSyncOp, withArg(gpu.emitAllAny, gpu.AllAnyKind.all)),    operation(SpirvDialect.AnySyncOp, withArg(gpu.emitAllAny, gpu.AllAnyKind.any)),    operation(SpirvDialect.BallotSyncOp, direct(gpu.emitBallot)),    operation(SpirvDialect.ShflSyncOp, direct(gpu.emitShuffle)),    operation(SpirvDialect.WarpReduceOp, direct(gpu.emitWarpReduce)),    operation(SpirvDialect.WarpScanOp, direct(gpu.emitWarpScan)),    operation(GpuDialect.ThreadIdxOp, gpuIndex(.local_invocation_id)),    operation(GpuDialect.BlockIdxOp, gpuIndex(.workgroup_id)),    operation(GpuDialect.BlockDimOp, gpuIndex(.workgroup_size)),    operation(GpuDialect.GridDimOp, gpuIndex(.num_workgroups)),    operation(GpuDialect.GlobalIdxOp, gpuIndex(.global_invocation_id)),    operation(GpuDialect.LaneIdOp, gpuSubgroupIndex(.subgroup_local_invocation_id)),    operation(GpuDialect.WarpIdOp, gpuSubgroupIndex(.subgroup_id)),    operation(GpuDialect.BarrierOp, direct(gpu.emitBarrier)),    operation(GpuDialect.SyncWarpOp, direct(gpu.emitSyncWarp)),    operation(GpuDialect.ActiveMaskOp, direct(gpu.emitActiveMask)),    operation(GpuDialect.AllSyncOp, withArg(gpu.emitAllAny, gpu.AllAnyKind.all)),    operation(GpuDialect.AnySyncOp, withArg(gpu.emitAllAny, gpu.AllAnyKind.any)),    operation(GpuDialect.BallotSyncOp, direct(gpu.emitBallot)),    operation(GpuDialect.ShflSyncOp, direct(gpu.emitShuffle)),    operation(GpuDialect.WarpReduceOp, direct(gpu.emitWarpReduce)),    operation(GpuDialect.WarpScanOp, direct(gpu.emitWarpScan)),    operation(GpuDialect.StageInputOp, direct(stage.emitStageInput)),    operation(GpuDialect.StageOutputOp, direct(stage.emitStageOutput)),    operation(GpuDialect.PositionOp, direct(stage.emitPosition)),    operation(GpuDialect.FragCoordOp, withArg(builtinLoad, BuiltinKind.frag_coord)),    operation(GpuDialect.VertexIndexOp, withArg(builtinLoad, BuiltinKind.vertex_index)),    operation(GpuDialect.InstanceIndexOp, withArg(builtinLoad, BuiltinKind.instance_index)),    operation(GpuDialect.FrontFacingOp, withArg(builtinLoad, BuiltinKind.front_facing)),    operation(GpuDialect.SampledTextureOp, direct(stage.emitSampledTexture)),    operation(GpuDialect.SampleOp, withArg(stage.emitSample, stage.Lod.implicit)),    operation(GpuDialect.SampleLodOp, withArg(stage.emitSample, stage.Lod.explicit)),    operation(GpuDialect.DpdxOp, withArg(stage.emitDerivative, SpirvOp.DPdxFine)),    operation(GpuDialect.DpdyOp, withArg(stage.emitDerivative, SpirvOp.DPdyFine)),    operation(GpuDialect.FwidthOp, withArg(stage.emitDerivative, SpirvOp.FwidthFine)),    operation(GpuDialect.PushConstantOp, direct(stage.emitPushConstant)),    operation(GpuDialect.UniformOp, direct(stage.emitUniform)),    operation(ScfDialect.IfOp, method("emitScfIf")),    operation(ScfDialect.ForOp, method("emitScfFor")),    operation(ScfDialect.WhileOp, method("emitScfWhile")),    operation(ScfDialect.YieldOp, unsupportedControlFlow()),    operation(ScfDialect.ConditionOp, unsupportedControlFlow()),    operation(FuncDialect.ReturnOp, method("emitReturn")),};pub fn supports(name: []const u8) bool {    inline for (entries) |Entry| {        if (std.mem.eql(u8, name, Entry.name)) return true;    }    return false;}pub fn emit(    comptime ErrorSet: type,    comptime Control: anytype,    self: anytype,    op: *ir.Operation,) ErrorSet!void {    inline for (entries) |Entry| {        if (std.mem.eql(u8, op.name.name, Entry.name)) {            return Entry.emit(ErrorSet, Control, self, op);        }    }    return error.UnsupportedOperation;}comptime {    @setEvalBranchQuota(100_000);    for (entries, 0..) |Candidate, index| {        if (!@hasDecl(Candidate, "emit")) @compileError("SPIR-V catalog emitter is missing");        for (entries, 0..) |Prior, prior_index| {            if (prior_index >= index) continue;            if (std.mem.eql(u8, Candidate.name, Prior.name)) {                @compileError("SPIR-V catalog operation name is not unique");            }        }    }}test "spirv catalog resolves every operation to one emitter" {    try std.testing.expectEqual(@as(usize, 102), entries.len);    inline for (entries) |Entry| try std.testing.expect(supports(Entry.name));    try std.testing.expect(!supports("test.unsupported"));}

Source: lib/choir/src/backends/gpu/spirv/emitter/root.zig:2

zig
pub const catalog = @import("catalog.zig");

Audit

Definitions4
Public names4
Members0
Version26.7.0
Revisiondaab053ee433