From f766b25f82a6c94d6b77f6a4172bfc4feb1d9271 Mon Sep 17 00:00:00 2001 From: Jakub Konka Date: Thu, 19 May 2022 20:24:06 +0200 Subject: [PATCH] x64: load float from memory to register on PIE targets --- src/arch/x86_64/CodeGen.zig | 52 ++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 2e4a396c9f..bd17b2a9ae 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -6085,16 +6085,48 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void .direct_load, .got_load, => { - try self.loadMemPtrIntoRegister(reg, Type.usize, mcv); - _ = try self.addInst(.{ - .tag = .mov, - .ops = Mir.Inst.Ops.encode(.{ - .reg1 = registerAlias(reg, abi_size), - .reg2 = reg.to64(), - .flags = 0b01, - }), - .data = .{ .imm = 0 }, - }); + switch (ty.zigTypeTag()) { + .Float => { + const base_reg = try self.register_manager.allocReg(null, .{ .selector_mask = gp }); + try self.loadMemPtrIntoRegister(base_reg, Type.usize, mcv); + + if (self.intrinsicsAllowed(ty)) { + const tag: Mir.Inst.Tag = switch (ty.tag()) { + .f32 => .mov_f32_avx, + .f64 => .mov_f64_avx, + else => return self.fail("TODO genSetReg from memory for {}", .{ty.fmtDebug()}), + }; + + _ = try self.addInst(.{ + .tag = tag, + .ops = Mir.Inst.Ops.encode(.{ + .reg1 = reg.to128(), + .reg2 = switch (ty.tag()) { + .f32 => base_reg.to32(), + .f64 => base_reg.to64(), + else => unreachable, + }, + }), + .data = .{ .imm = 0 }, + }); + return; + } + + return self.fail("TODO genSetReg from memory for float with no intrinsics", .{}); + }, + else => { + try self.loadMemPtrIntoRegister(reg, Type.usize, mcv); + _ = try self.addInst(.{ + .tag = .mov, + .ops = Mir.Inst.Ops.encode(.{ + .reg1 = registerAlias(reg, abi_size), + .reg2 = reg.to64(), + .flags = 0b01, + }), + .data = .{ .imm = 0 }, + }); + }, + } }, .memory => |x| switch (ty.zigTypeTag()) { .Float => {