diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index ccc870e363..74fbd03adb 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -8854,10 +8854,10 @@ fn asmExpr( return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{}); } } - if (full.outputs.len > 32) { - return astgen.failNode(full.outputs[32], "too many asm outputs", .{}); + if (full.outputs.len >= 16) { + return astgen.failNode(full.outputs[16], "too many asm outputs", .{}); } - var outputs_buffer: [32]Zir.Inst.Asm.Output = undefined; + var outputs_buffer: [15]Zir.Inst.Asm.Output = undefined; const outputs = outputs_buffer[0..full.outputs.len]; var output_type_bits: u32 = 0; @@ -8893,10 +8893,10 @@ fn asmExpr( } } - if (full.inputs.len > 32) { + if (full.inputs.len >= 32) { return astgen.failNode(full.inputs[32], "too many asm inputs", .{}); } - var inputs_buffer: [32]Zir.Inst.Asm.Input = undefined; + var inputs_buffer: [31]Zir.Inst.Asm.Input = undefined; const inputs = inputs_buffer[0..full.inputs.len]; for (full.inputs, 0..) |input_node, i| { @@ -8912,7 +8912,7 @@ fn asmExpr( }; } - var clobbers_buffer: [32]u32 = undefined; + var clobbers_buffer: [63]u32 = undefined; var clobber_i: usize = 0; if (full.first_clobber) |first_clobber| clobbers: { // asm ("foo" ::: "a", "b") @@ -12932,14 +12932,14 @@ const GenZir = struct { } gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers); - // * 0b00000000_000XXXXX - `outputs_len`. - // * 0b000000XX_XXX00000 - `inputs_len`. - // * 0b0XXXXX00_00000000 - `clobbers_len`. + // * 0b00000000_0000XXXX - `outputs_len`. + // * 0b0000000X_XXXX0000 - `inputs_len`. + // * 0b0XXXXXX0_00000000 - `clobbers_len`. // * 0bX0000000_00000000 - is volatile - const small: u16 = @as(u16, @intCast(args.outputs.len)) | - @as(u16, @intCast(args.inputs.len << 5)) | - @as(u16, @intCast(args.clobbers.len << 10)) | - (@as(u16, @intFromBool(args.is_volatile)) << 15); + const small: u16 = @as(u16, @as(u4, @intCast(args.outputs.len))) << 0 | + @as(u16, @as(u5, @intCast(args.inputs.len))) << 4 | + @as(u16, @as(u6, @intCast(args.clobbers.len))) << 9 | + @as(u16, @intFromBool(args.is_volatile)) << 15; const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len); astgen.instructions.appendAssumeCapacity(.{ diff --git a/src/Sema.zig b/src/Sema.zig index ad800c29a6..5dbf26f375 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -16661,9 +16661,9 @@ fn zirAsm( const extra = sema.code.extraData(Zir.Inst.Asm, extended.operand); const src = block.nodeOffset(extra.data.src_node); const ret_ty_src = block.src(.{ .node_offset_asm_ret_ty = extra.data.src_node }); - const outputs_len: u5 = @truncate(extended.small); - const inputs_len: u5 = @truncate(extended.small >> 5); - const clobbers_len: u5 = @truncate(extended.small >> 10); + const outputs_len: u4 = @truncate(extended.small); + const inputs_len: u5 = @truncate(extended.small >> 4); + const clobbers_len: u6 = @truncate(extended.small >> 9); const is_volatile = @as(u1, @truncate(extended.small >> 15)) != 0; const is_global_assembly = sema.func_index == .none; const zir_tags = sema.code.instructions.items(.tag);