[Flint] adding foundations for Flint's IR
Mirror Gitea refs to GitHub / mirror (push) Successful in 14s
Test / build_and_test (push) Successful in 6m20s
Build / build (push) Successful in 7m14s

This commit is contained in:
2026-07-27 00:20:52 +02:00
parent 6d66daef29
commit 045497b264
10 changed files with 1537 additions and 0 deletions
+147
View File
@@ -0,0 +1,147 @@
const std = @import("std");
const device = @import("device.zig");
const ids = @import("id.zig");
const operand = @import("operand.zig");
pub const Builtin = enum {
position,
vertex_index,
instance_index,
};
pub const InterfaceSemantic = union(enum) {
location: struct {
location: u32,
component: u8 = 0,
},
builtin: struct {
builtin: Builtin,
component: u8 = 0,
},
};
pub const LoadInput = struct {
destination: operand.Destination,
semantic: InterfaceSemantic,
};
pub const StoreOutput = struct {
semantic: InterfaceSemantic,
source: operand.Source,
};
pub const Move = struct {
destination: operand.Destination,
source: operand.Source,
};
pub const BinaryOpcode = enum {
add,
multiply,
bitwise_and,
bitwise_or,
bitwise_xor,
shift_left,
shift_right,
};
pub const Binary = struct {
opcode: BinaryOpcode,
destination: operand.Destination,
lhs: operand.Source,
rhs: operand.Source,
};
pub const CompareOpcode = enum {
equal,
not_equal,
less_than,
less_or_equal,
greater_than,
greater_or_equal,
};
pub const Compare = struct {
opcode: CompareOpcode,
destination: operand.FlagRef,
lhs: operand.Source,
rhs: operand.Source,
};
pub const ChannelMask = packed struct(u4) {
x: bool = true,
y: bool = true,
z: bool = true,
w: bool = true,
};
pub const UrbWrite = struct {
offset: u16,
channels: ChannelMask = .{},
end_of_thread: bool = false,
};
pub const Message = union(enum) {
urb_write: UrbWrite,
};
pub const Send = struct {
message: Message,
payload: operand.RegisterSpan,
response: ?operand.RegisterSpan = null,
};
pub const Call = struct {
function: ids.FunctionId,
destination: ?operand.Destination = null,
arguments: []const operand.Source,
};
pub const Operation = union(enum) {
load_input: LoadInput,
store_output: StoreOutput,
move: Move,
binary: Binary,
compare: Compare,
call: Call,
send: Send,
};
pub const Instruction = struct {
parent_block: ids.BlockId,
execution_size: device.ExecutionSize,
predicate: ?operand.Predicate = null,
operation: Operation,
};
pub const Terminator = union(enum) {
jump: ids.BlockId,
conditional_branch: struct {
predicate: operand.Predicate,
true_block: ids.BlockId,
false_block: ids.BlockId,
},
return_void,
return_value: operand.Source,
end_thread,
@"unreachable",
};
pub const StructuredControl = union(enum) {
none,
selection: struct {
merge_block: ids.BlockId,
},
loop: struct {
merge_block: ids.BlockId,
continue_block: ids.BlockId,
},
};
pub const Block = struct {
parent_function: ids.FunctionId,
instructions: std.ArrayList(ids.InstructionId) = .empty,
terminator: ?Terminator = null,
structured_control: StructuredControl = .none,
name: ?[]const u8 = null,
};