Skip to content

Commit 06eebaf

Browse files
committed
AstGen: redistribute inline asm limits
1 parent 7a2963e commit 06eebaf

File tree

2 files changed

+16
-16
lines changed

2 files changed

+16
-16
lines changed

lib/std/zig/AstGen.zig

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8854,10 +8854,10 @@ fn asmExpr(
88548854
return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{});
88558855
}
88568856
}
8857-
if (full.outputs.len > 32) {
8858-
return astgen.failNode(full.outputs[32], "too many asm outputs", .{});
8857+
if (full.outputs.len >= 16) {
8858+
return astgen.failNode(full.outputs[16], "too many asm outputs", .{});
88598859
}
8860-
var outputs_buffer: [32]Zir.Inst.Asm.Output = undefined;
8860+
var outputs_buffer: [15]Zir.Inst.Asm.Output = undefined;
88618861
const outputs = outputs_buffer[0..full.outputs.len];
88628862

88638863
var output_type_bits: u32 = 0;
@@ -8893,10 +8893,10 @@ fn asmExpr(
88938893
}
88948894
}
88958895

8896-
if (full.inputs.len > 32) {
8896+
if (full.inputs.len >= 32) {
88978897
return astgen.failNode(full.inputs[32], "too many asm inputs", .{});
88988898
}
8899-
var inputs_buffer: [32]Zir.Inst.Asm.Input = undefined;
8899+
var inputs_buffer: [31]Zir.Inst.Asm.Input = undefined;
89008900
const inputs = inputs_buffer[0..full.inputs.len];
89018901

89028902
for (full.inputs, 0..) |input_node, i| {
@@ -8912,7 +8912,7 @@ fn asmExpr(
89128912
};
89138913
}
89148914

8915-
var clobbers_buffer: [32]u32 = undefined;
8915+
var clobbers_buffer: [63]u32 = undefined;
89168916
var clobber_i: usize = 0;
89178917
if (full.first_clobber) |first_clobber| clobbers: {
89188918
// asm ("foo" ::: "a", "b")
@@ -12932,14 +12932,14 @@ const GenZir = struct {
1293212932
}
1293312933
gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers);
1293412934

12935-
// * 0b00000000_000XXXXX - `outputs_len`.
12936-
// * 0b000000XX_XXX00000 - `inputs_len`.
12937-
// * 0b0XXXXX00_00000000 - `clobbers_len`.
12935+
// * 0b00000000_0000XXXX - `outputs_len`.
12936+
// * 0b0000000X_XXXX0000 - `inputs_len`.
12937+
// * 0b0XXXXXX0_00000000 - `clobbers_len`.
1293812938
// * 0bX0000000_00000000 - is volatile
12939-
const small: u16 = @as(u16, @intCast(args.outputs.len)) |
12940-
@as(u16, @intCast(args.inputs.len << 5)) |
12941-
@as(u16, @intCast(args.clobbers.len << 10)) |
12942-
(@as(u16, @intFromBool(args.is_volatile)) << 15);
12939+
const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 |
12940+
@as(u16, @as(u5, @intCast(args.inputs.len))) << 4 |
12941+
@as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 |
12942+
@as(u16, @intFromBool(args.is_volatile)) << 15;
1294312943

1294412944
const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len);
1294512945
astgen.instructions.appendAssumeCapacity(.{

src/Sema.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16661,9 +16661,9 @@ fn zirAsm(
1666116661
const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand);
1666216662
const src = block.nodeOffset(extra.data.src_node);
1666316663
const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node });
16664-
const outputs_len: u5 = @truncate(extended.small);
16665-
const inputs_len: u5 = @truncate(extended.small >> 5);
16666-
const clobbers_len: u5 = @truncate(extended.small >> 10);
16664+
const outputs_len: u4 = @truncate(extended.small);
16665+
const inputs_len: u5 = @truncate(extended.small >> 4);
16666+
const clobbers_len: u6 = @truncate(extended.small >> 9);
1666716667
const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0;
1666816668
const is_global_assembly = sema.func_index == .none;
1666916669
const zir_tags = sema.code.instructions.items(.tag);

0 commit comments

Comments
 (0)