| ... | @@ -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]; |
| 8862 | | 8862 | |
| 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 | } |
| 8895 | | 8895 | |
| 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]; |
| 8901 | | 8901 | |
| 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 | } |
| 8914 | | 8914 | |
| 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); |
| 12934 | | 12934 | |
| 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 volatile | 12938 | // * 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; |
| 12943 | | 12943 | |
| 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(.{ |