| ... | @@ -4175,11 +4175,46 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue { | ... | @@ -4175,11 +4175,46 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4175 | extra_i += clobber.len / 4 + 1; | 4175 | extra_i += clobber.len / 4 + 1; |
| 4176 | } | 4176 | } |
| 4177 | } | 4177 | } |
| 4178 | const asm_source = std.mem.sliceAsBytes(f.air.extra[extra_i..])[0..extra.data.source_len]; | 4178 | { |
| | 4179 | const asm_source = std.mem.sliceAsBytes(f.air.extra[extra_i..])[0..extra.data.source_len]; |
| | 4180 | |
| | 4181 | var stack = std.heap.stackFallback(256, f.object.dg.gpa); |
| | 4182 | const allocator = stack.get(); |
| | 4183 | const fixed_asm_source = try allocator.alloc(u8, asm_source.len); |
| | 4184 | defer allocator.free(fixed_asm_source); |
| | 4185 | |
| | 4186 | var src_i: usize = 0; |
| | 4187 | var dst_i: usize = 0; |
| | 4188 | while (src_i < asm_source.len) : (src_i += 1) { |
| | 4189 | fixed_asm_source[dst_i] = asm_source[src_i]; |
| | 4190 | dst_i += 1; |
| | 4191 | if (asm_source[src_i] != '%' or src_i + 1 >= asm_source.len) continue; |
| | 4192 | src_i += 1; |
| | 4193 | if (asm_source[src_i] != '[') { |
| | 4194 | // This handles %% |
| | 4195 | fixed_asm_source[dst_i] = asm_source[src_i]; |
| | 4196 | dst_i += 1; |
| | 4197 | continue; |
| | 4198 | } |
| | 4199 | const len = std.mem.indexOfScalar(u8, asm_source[src_i + 1 ..], ']') orelse |
| | 4200 | return f.fail("CBE: invalid inline asm string '{s}'", .{asm_source}); |
| | 4201 | if (std.mem.indexOfScalar(u8, asm_source[src_i + 1 ..][0..len], ':')) |colon| { |
| | 4202 | const modifier = asm_source[src_i + 1 + colon + 1 .. src_i + 1 + len]; |
| | 4203 | std.mem.copy(u8, fixed_asm_source[dst_i..], modifier); |
| | 4204 | dst_i += modifier.len; |
| | 4205 | |
| | 4206 | const name = asm_source[src_i .. src_i + 1 + colon]; |
| | 4207 | std.mem.copy(u8, fixed_asm_source[dst_i..], name); |
| | 4208 | dst_i += name.len; |
| | 4209 | |
| | 4210 | src_i += len; |
| | 4211 | } |
| | 4212 | } |
| 4179 | | 4213 | |
| 4180 | try writer.writeAll("__asm"); | 4214 | try writer.writeAll("__asm"); |
| 4181 | if (is_volatile) try writer.writeAll(" volatile"); | 4215 | if (is_volatile) try writer.writeAll(" volatile"); |
| 4182 | try writer.print("({s}", .{fmtStringLiteral(asm_source)}); | 4216 | try writer.print("({s}", .{fmtStringLiteral(fixed_asm_source[0..dst_i])}); |
| | 4217 | } |
| 4183 | | 4218 | |
| 4184 | extra_i = constraints_extra_begin; | 4219 | extra_i = constraints_extra_begin; |
| 4185 | var locals_index = locals_begin; | 4220 | var locals_index = locals_begin; |