| ... | ... | @@ -8854,10 +8854,10 @@ fn asmExpr( |
| 8854 | 8854 | return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{}); |
| 8855 | 8855 | } |
| 8856 | 8856 | } |
| 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", .{}); |
| 8859 | 8859 | } |
| 8860 | | var outputs_buffer: [32]Zir.Inst.Asm.Output = undefined; |
| 8860 | var outputs_buffer: [15]Zir.Inst.Asm.Output = undefined; |
| 8861 | 8861 | const outputs = outputs_buffer[0..full.outputs.len]; |
| 8862 | 8862 | |
| 8863 | 8863 | var output_type_bits: u32 = 0; |
| ... | ... | @@ -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 | 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 | 8900 | const inputs = inputs_buffer[0..full.inputs.len]; |
| 8901 | 8901 | |
| 8902 | 8902 | for (full.inputs, 0..) |input_node, i| { |
| ... | ... | @@ -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 | 8916 | var clobber_i: usize = 0; |
| 8917 | 8917 | if (full.first_clobber) |first_clobber| clobbers: { |
| 8918 | 8918 | // asm ("foo" ::: "a", "b") |
| ... | ... | @@ -12932,14 +12932,14 @@ const GenZir = struct { |
| 12932 | 12932 | } |
| 12933 | 12933 | gz.astgen.extra.appendSliceAssumeCapacity(args.clobbers); |
| 12934 | 12934 | |
| 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`. |
| 12938 | 12938 | // * 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; |
| 12943 | 12943 | |
| 12944 | 12944 | const new_index: Zir.Inst.Index = @enumFromInt(astgen.instructions.len); |
| 12945 | 12945 | astgen.instructions.appendAssumeCapacity(.{ |