authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-05-19 20:24:06+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-05-19 20:24:06+02:00
logf766b25f82a6c94d6b77f6a4172bfc4feb1d9271
tree0fd11cb9bff83950cc4975ba2a2a72c8e7c2c9e9
parent5cbfd5819e423cdc6b092d1eb687189fb204b075

x64: load float from memory to register on PIE targets


1 files changed, 42 insertions(+), 10 deletions(-)

src/arch/x86_64/CodeGen.zig+42-10
......@@ -6085,16 +6085,48 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
60856085 .direct_load,
60866086 .got_load,
60876087 => {
6088 try self.loadMemPtrIntoRegister(reg, Type.usize, mcv);
6089 _ = try self.addInst(.{
6090 .tag = .mov,
6091 .ops = Mir.Inst.Ops.encode(.{
6092 .reg1 = registerAlias(reg, abi_size),
6093 .reg2 = reg.to64(),
6094 .flags = 0b01,
6095 }),
6096 .data = .{ .imm = 0 },
6097 });
6088 switch (ty.zigTypeTag()) {
6089 .Float => {
6090 const base_reg = try self.register_manager.allocReg(null, .{ .selector_mask = gp });
6091 try self.loadMemPtrIntoRegister(base_reg, Type.usize, mcv);
6092
6093 if (self.intrinsicsAllowed(ty)) {
6094 const tag: Mir.Inst.Tag = switch (ty.tag()) {
6095 .f32 => .mov_f32_avx,
6096 .f64 => .mov_f64_avx,
6097 else => return self.fail("TODO genSetReg from memory for {}", .{ty.fmtDebug()}),
6098 };
6099
6100 _ = try self.addInst(.{
6101 .tag = tag,
6102 .ops = Mir.Inst.Ops.encode(.{
6103 .reg1 = reg.to128(),
6104 .reg2 = switch (ty.tag()) {
6105 .f32 => base_reg.to32(),
6106 .f64 => base_reg.to64(),
6107 else => unreachable,
6108 },
6109 }),
6110 .data = .{ .imm = 0 },
6111 });
6112 return;
6113 }
6114
6115 return self.fail("TODO genSetReg from memory for float with no intrinsics", .{});
6116 },
6117 else => {
6118 try self.loadMemPtrIntoRegister(reg, Type.usize, mcv);
6119 _ = try self.addInst(.{
6120 .tag = .mov,
6121 .ops = Mir.Inst.Ops.encode(.{
6122 .reg1 = registerAlias(reg, abi_size),
6123 .reg2 = reg.to64(),
6124 .flags = 0b01,
6125 }),
6126 .data = .{ .imm = 0 },
6127 });
6128 },
6129 }
60986130 },
60996131 .memory => |x| switch (ty.zigTypeTag()) {
61006132 .Float => {