| ... | ... | @@ -4195,7 +4195,7 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4195 | 4195 | } |
| 4196 | 4196 | } |
| 4197 | 4197 | { |
| 4198 | | const asm_source = std.mem.sliceAsBytes(f.air.extra[extra_i..])[0..extra.data.source_len]; |
| 4198 | const asm_source = mem.sliceAsBytes(f.air.extra[extra_i..])[0..extra.data.source_len]; |
| 4199 | 4199 | |
| 4200 | 4200 | var stack = std.heap.stackFallback(256, f.object.dg.gpa); |
| 4201 | 4201 | const allocator = stack.get(); |
| ... | ... | @@ -4204,29 +4204,43 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4204 | 4204 | |
| 4205 | 4205 | var src_i: usize = 0; |
| 4206 | 4206 | var dst_i: usize = 0; |
| 4207 | | while (src_i < asm_source.len) : (src_i += 1) { |
| 4208 | | fixed_asm_source[dst_i] = asm_source[src_i]; |
| 4209 | | dst_i += 1; |
| 4210 | | if (asm_source[src_i] != '%' or src_i + 1 >= asm_source.len) continue; |
| 4207 | while (true) { |
| 4208 | const literal = mem.sliceTo(asm_source[src_i..], '%'); |
| 4209 | src_i += literal.len; |
| 4210 | |
| 4211 | mem.copy(u8, fixed_asm_source[dst_i..], literal); |
| 4212 | dst_i += literal.len; |
| 4213 | |
| 4214 | if (src_i >= asm_source.len) break; |
| 4215 | |
| 4211 | 4216 | src_i += 1; |
| 4217 | if (src_i >= asm_source.len) |
| 4218 | return f.fail("CBE: invalid inline asm string '{s}'", .{asm_source}); |
| 4219 | |
| 4220 | fixed_asm_source[dst_i] = '%'; |
| 4221 | dst_i += 1; |
| 4222 | |
| 4212 | 4223 | if (asm_source[src_i] != '[') { |
| 4213 | | // This handles %% |
| 4224 | // This also handles %% |
| 4214 | 4225 | fixed_asm_source[dst_i] = asm_source[src_i]; |
| 4226 | src_i += 1; |
| 4215 | 4227 | dst_i += 1; |
| 4216 | 4228 | continue; |
| 4217 | 4229 | } |
| 4218 | | const len = std.mem.indexOfScalar(u8, asm_source[src_i + 1 ..], ']') orelse |
| 4219 | | return f.fail("CBE: invalid inline asm string '{s}'", .{asm_source}); |
| 4220 | | if (std.mem.indexOfScalar(u8, asm_source[src_i + 1 ..][0..len], ':')) |colon| { |
| 4221 | | const modifier = asm_source[src_i + 1 + colon + 1 .. src_i + 1 + len]; |
| 4222 | | std.mem.copy(u8, fixed_asm_source[dst_i..], modifier); |
| 4223 | | dst_i += modifier.len; |
| 4224 | 4230 | |
| 4225 | | const name = asm_source[src_i .. src_i + 1 + colon]; |
| 4226 | | std.mem.copy(u8, fixed_asm_source[dst_i..], name); |
| 4231 | const desc = mem.sliceTo(asm_source[src_i..], ']'); |
| 4232 | if (mem.indexOfScalar(u8, desc, ':')) |colon| { |
| 4233 | const name = desc[0..colon]; |
| 4234 | const modifier = desc[colon + 1 ..]; |
| 4235 | |
| 4236 | mem.copy(u8, fixed_asm_source[dst_i..], modifier); |
| 4237 | dst_i += modifier.len; |
| 4238 | mem.copy(u8, fixed_asm_source[dst_i..], name); |
| 4227 | 4239 | dst_i += name.len; |
| 4228 | 4240 | |
| 4229 | | src_i += len; |
| 4241 | src_i += desc.len; |
| 4242 | if (src_i >= asm_source.len) |
| 4243 | return f.fail("CBE: invalid inline asm string '{s}'", .{asm_source}); |
| 4230 | 4244 | } |
| 4231 | 4245 | } |
| 4232 | 4246 | |