| ... | @@ -4195,7 +4195,7 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue { | ... | @@ -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 | var stack = std.heap.stackFallback(256, f.object.dg.gpa); | 4200 | var stack = std.heap.stackFallback(256, f.object.dg.gpa); |
| 4201 | const allocator = stack.get(); | 4201 | const allocator = stack.get(); |
| ... | @@ -4204,29 +4204,43 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue { | ... | @@ -4204,29 +4204,43 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4204 | | 4204 | |
| 4205 | var src_i: usize = 0; | 4205 | var src_i: usize = 0; |
| 4206 | var dst_i: usize = 0; | 4206 | var dst_i: usize = 0; |
| 4207 | while (src_i < asm_source.len) : (src_i += 1) { | 4207 | while (true) { |
| 4208 | fixed_asm_source[dst_i] = asm_source[src_i]; | 4208 | const literal = mem.sliceTo(asm_source[src_i..], '%'); |
| 4209 | dst_i += 1; | 4209 | src_i += literal.len; |
| 4210 | if (asm_source[src_i] != '%' or src_i + 1 >= asm_source.len) continue; | 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 | src_i += 1; | 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 | if (asm_source[src_i] != '[') { | 4223 | if (asm_source[src_i] != '[') { |
| 4213 | // This handles %% | 4224 | // This also handles %% |
| 4214 | fixed_asm_source[dst_i] = asm_source[src_i]; | 4225 | fixed_asm_source[dst_i] = asm_source[src_i]; |
| | 4226 | src_i += 1; |
| 4215 | dst_i += 1; | 4227 | dst_i += 1; |
| 4216 | continue; | 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]; | 4231 | const desc = mem.sliceTo(asm_source[src_i..], ']'); |
| 4226 | std.mem.copy(u8, fixed_asm_source[dst_i..], name); | 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 | dst_i += name.len; | 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 | |