diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/c.zig | 2 | ||||
| -rw-r--r-- | src/codegen/llvm.zig | 16 |
2 files changed, 11 insertions, 7 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 1ae9527f04..a11cd92827 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -4770,9 +4770,11 @@ fn airSwitchBr(f: *Function, inst: Air.Inst.Index) !CValue { } fn asmInputNeedsLocal(f: *Function, constraint: []const u8, value: CValue) bool { + const target = f.object.dg.module.getTarget(); return switch (constraint[0]) { '{' => true, 'i', 'r' => false, + 'I' => !target.cpu.arch.isArmOrThumb(), else => switch (value) { .constant => |val| switch (f.object.dg.module.intern_pool.indexToKey(val)) { .ptr => |ptr| switch (ptr.addr) { diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 06c2f714d0..687d1dfb80 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -417,7 +417,7 @@ const DataLayoutBuilder = struct { if (idx != size) try writer.print(":{d}", .{idx}); } } - if (self.target.cpu.arch.isARM() or self.target.cpu.arch.isThumb()) + if (self.target.cpu.arch.isArmOrThumb()) try writer.writeAll("-Fi8"); // for thumb interwork if (self.target.cpu.arch != .hexagon) { if (self.target.cpu.arch == .s390x) try self.typeAlignment(.integer, 1, 8, 8, false, writer); @@ -620,7 +620,7 @@ const DataLayoutBuilder = struct { else => {}, } }, - .vector => if (self.target.cpu.arch.isARM() or self.target.cpu.arch.isThumb()) { + .vector => if (self.target.cpu.arch.isArmOrThumb()) { switch (size) { 128 => abi = 64, else => {}, @@ -670,7 +670,7 @@ const DataLayoutBuilder = struct { else => {}, }, .aggregate => if (self.target.os.tag == .uefi or self.target.os.tag == .windows or - self.target.cpu.arch.isARM() or self.target.cpu.arch.isThumb()) + self.target.cpu.arch.isArmOrThumb()) { pref = @min(pref, self.target.ptrBitWidth()); } else if (self.target.cpu.arch == .hexagon) { @@ -6809,8 +6809,6 @@ pub const FuncGen = struct { } llvm_constraints.appendAssumeCapacity('='); - // Pass any non-return outputs indirectly, if the constraint accepts a memory location - is_indirect.* = (output != .none) and constraintAllowsMemory(constraint); if (output != .none) { const output_inst = try self.resolveInst(output); const output_ty = self.typeOf(output); @@ -6825,6 +6823,8 @@ pub const FuncGen = struct { }), } + // Pass any non-return outputs indirectly, if the constraint accepts a memory location + is_indirect.* = constraintAllowsMemory(constraint); if (is_indirect.*) { // Pass the result by reference as an indirect output (e.g. "=*m") llvm_constraints.appendAssumeCapacity('*'); @@ -6841,11 +6841,13 @@ pub const FuncGen = struct { } else { switch (constraint[0]) { '=' => {}, - else => return self.todo("unsupported output constraint on result type '{c}'", .{ - constraint[0], + else => return self.todo("unsupported output constraint on result type '{s}'", .{ + constraint, }), } + is_indirect.* = false; + const ret_ty = self.typeOfIndex(inst); llvm_ret_types[llvm_ret_i] = try o.lowerType(ret_ty); llvm_ret_i += 1; |
