authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-03-27 12:44:10-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-04-10 06:04:09-04:00
log06eebafadd471ee287bfd4436b0c3ffcae3136c8
tree420252db43bf2b9b0a7ef5248009eb9d867c42f5
parent7a2963efabfed7cf7e356b698a425cd30aa5620a

AstGen: redistribute inline asm limits


2 files changed, 16 insertions(+), 16 deletions(-)

lib/std/zig/AstGen.zig+13-13
...@@ -8854,10 +8854,10 @@ fn asmExpr(...@@ -8854,10 +8854,10 @@ fn asmExpr(
8854 return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{});8854 return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{});
8855 }8855 }
8856 }8856 }
8857 if (full.outputs.len > 32) {8857 if (full.outputs.len >= 16) {
8858 return astgen.failNode(full.outputs[32], "too many asm outputs", .{});8858 return astgen.failNode(full.outputs[16], "too many asm outputs", .{});
8859 }8859 }
8860 var outputs_buffer: [32]Zir.Inst.Asm.Output = undefined;8860 var outputs_buffer: [15]Zir.Inst.Asm.Output = undefined;
8861 const outputs = outputs_buffer[0..full.outputs.len];8861 const outputs = outputs_buffer[0..full.outputs.len];
88628862
8863 var output_type_bits: u32 = 0;8863 var output_type_bits: u32 = 0;
...@@ -8893,10 +8893,10 @@ fn asmExpr(...@@ -8893,10 +8893,10 @@ fn asmExpr(
8893 }8893 }
8894 }8894 }
88958895
8896 if (full.inputs.len > 32) {8896 if (full.inputs.len >= 32) {
8897 return astgen.failNode(full.inputs[32], "too many asm inputs", .{});8897 return astgen.failNode(full.inputs[32], "too many asm inputs", .{});
8898 }8898 }
8899 var inputs_buffer: [32]Zir.Inst.Asm.Input = undefined;8899 var inputs_buffer: [31]Zir.Inst.Asm.Input = undefined;
8900 const inputs = inputs_buffer[0..full.inputs.len];8900 const inputs = inputs_buffer[0..full.inputs.len];
89018901
8902 for (full.inputs, 0..) |input_node, i| {8902 for (full.inputs, 0..) |input_node, i| {
...@@ -8912,7 +8912,7 @@ fn asmExpr(...@@ -8912,7 +8912,7 @@ fn asmExpr(
8912 };8912 };
8913 }8913 }
89148914
8915 var clobbers_buffer: [32]u32 = undefined;8915 var clobbers_buffer: [63]u32 = undefined;
8916 var clobber_i: usize = 0;8916 var clobber_i: usize = 0;
8917 if (full.first_clobber) |first_clobber| clobbers: {8917 if (full.first_clobber) |first_clobber| clobbers: {
8918 // asm ("foo" ::: "a", "b")8918 // asm ("foo" ::: "a", "b")
...@@ -12932,14 +12932,14 @@ const GenZir = struct {...@@ -12932,14 +12932,14 @@ const GenZir = struct {
12932 }12932 }
12933 gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers);12933 gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers);
1293412934
12935 // * 0b00000000_000XXXXX - `outputs_len`.12935 // * 0b00000000_0000XXXX - `outputs_len`.
12936 // * 0b000000XX_XXX00000 - `inputs_len`.12936 // * 0b0000000X_XXXX0000 - `inputs_len`.
12937 // * 0b0XXXXX00_00000000 - `clobbers_len`.12937 // * 0b0XXXXXX0_00000000 - `clobbers_len`.
12938 // * 0bX0000000_00000000 - is volatile12938 // * 0bX0000000_00000000 - is volatile
12939 const small: u16 = @as(u16, @intCast(args.outputs.len)) |12939 const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 |
12940 @as(u16, @intCast(args.inputs.len << 5)) |12940 @as(u16, @as(u5, @intCast(args.inputs.len))) << 4 |
12941 @as(u16, @intCast(args.clobbers.len << 10)) |12941 @as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 |
12942 (@as(u16, @intFromBool(args.is_volatile)) << 15);12942 @as(u16, @intFromBool(args.is_volatile)) << 15;
1294312943
12944 const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);12944 const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);
12945 astgen.instructions.appendAssumeCapacity(.{12945 astgen.instructions.appendAssumeCapacity(.{
src/Sema.zig+3-3
...@@ -16661,9 +16661,9 @@ fn zirAsm(...@@ -16661,9 +16661,9 @@ fn zirAsm(
16661 const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);16661 const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);
16662 const src = block.nodeOffset(extra.data.src_node);16662 const src = block.nodeOffset(extra.data.src_node);
16663 const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });16663 const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });
16664 const outputs_len: u5 = @truncate(extended.small);16664 const outputs_len: u4 = @truncate(extended.small);
16665 const inputs_len: u5 = @truncate(extended.small >> 5);16665 const inputs_len: u5 = @truncate(extended.small >> 4);
16666 const clobbers_len: u5 = @truncate(extended.small >> 10);16666 const clobbers_len: u6 = @truncate(extended.small >> 9);
16667 const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0;16667 const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0;
16668 const is_global_assembly = sema.func_index == .none;16668 const is_global_assembly = sema.func_index == .none;
16669 const zir_tags = sema.code.instructions.items(.tag);16669 const zir_tags = sema.code.instructions.items(.tag);