|
1 | 1 | const std = @import("std.zig");
|
| 2 | +const builtin = @import("builtin"); |
2 | 3 |
|
3 | 4 | pub const position_in = @extern(*addrspace(.input) @Vector(4, f32), .{ .name = "position" });
|
4 | 5 | pub const position_out = @extern(*addrspace(.output) @Vector(4, f32), .{ .name = "position" });
|
@@ -126,3 +127,35 @@ pub fn executionMode(comptime entry_point: anytype, comptime mode: ExecutionMode
|
126 | 127 | },
|
127 | 128 | }
|
128 | 129 | }
|
| 130 | + |
| 131 | +/// Writes formatted output to an implementation-defined stream. |
| 132 | +/// Returns 0 on success, –1 on failure. |
| 133 | +pub fn printf(comptime fmt: [*:0]const u8, args: anytype) u32 { |
| 134 | + if (builtin.zig_backend == .stage2_spirv and builtin.target.os.tag == .opencl) { |
| 135 | + comptime var expr: []const u8 = |
| 136 | + \\%std = OpExtInstImport "OpenCL.std" |
| 137 | + \\%u32 = OpTypeInt 32 0 |
| 138 | + \\%ret = OpExtInst %u32 %std 184 %fmt |
| 139 | + ; |
| 140 | + inline for (0..args.len) |i| { |
| 141 | + expr = expr ++ std.fmt.comptimePrint(" %arg{d}", .{i}); |
| 142 | + } |
| 143 | + const result = switch (args.len) { |
| 144 | + // zig fmt: off |
| 145 | + 0 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt)), |
| 146 | + 1 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0])), |
| 147 | + 2 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1])), |
| 148 | + 3 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2])), |
| 149 | + 4 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3])), |
| 150 | + 5 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4])), |
| 151 | + 6 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5])), |
| 152 | + 7 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5]), [arg6] "" (args[6])), |
| 153 | + 8 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5]), [arg6] "" (args[6]), [arg7] "" (args[7])), |
| 154 | + 9 => asm volatile (expr : [ret] "" (-> u32), : [fmt] "c" (fmt), [arg0] "" (args[0]), [arg1] "" (args[1]), [arg2] "" (args[2]), [arg3] "" (args[3]), [arg4] "" (args[4]), [arg5] "" (args[5]), [arg6] "" (args[6]), [arg7] "" (args[7]), [arg8] "" (args[8])), |
| 155 | + // zig fmt: on |
| 156 | + else => @compileError("too many arguments"), |
| 157 | + }; |
| 158 | + return result; |
| 159 | + } |
| 160 | + @compileError("unsupported Zig backend or target OS"); |
| 161 | +} |
0 commit comments