authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-11 09:37:54+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-11 20:05:50+01:00
log0a8b5c20aa2402361a4e5698100902e47bd2c7c6
tree36144cdbf10c2bce41851b1316efb8fd67f61864
parentc9a153c7978b363a252f83878f75bd875fe6ae5e

x86_64: add wrapper for .jcc with relocation


1 files changed, 17 insertions(+), 47 deletions(-)

src/arch/x86_64/CodeGen.zig+17-47
......@@ -431,6 +431,17 @@ fn asmJmpReloc(self: *Self, target: Mir.Inst.Index) !Mir.Inst.Index {
431431 });
432432}
433433
434fn asmJccReloc(self: *Self, target: Mir.Inst.Index, cc: bits.Condition) !Mir.Inst.Index {
435 return self.addInst(.{
436 .tag = .jcc,
437 .ops = .inst_cc,
438 .data = .{ .inst_cc = .{
439 .inst = target,
440 .cc = cc,
441 } },
442 });
443}
444
434445fn asmNone(self: *Self, tag: Mir.Inst.Tag) !void {
435446 _ = try self.addInst(.{
436447 .tag = tag,
......@@ -4360,29 +4371,13 @@ fn genCondBrMir(self: *Self, ty: Type, mcv: MCValue) !u32 {
43604371 const abi_size = ty.abiSize(self.target.*);
43614372 switch (mcv) {
43624373 .eflags => |cc| {
4363 return self.addInst(.{
4364 .tag = .jcc,
4365 .ops = .inst_cc,
4366 .data = .{
4367 .inst_cc = .{
4368 .inst = undefined,
4369 // Here we map the opposites since the jump is to the false branch.
4370 .cc = cc.negate(),
4371 },
4372 },
4373 });
4374 // Here we map the opposites since the jump is to the false branch.
4375 return self.asmJccReloc(undefined, cc.negate());
43744376 },
43754377 .register => |reg| {
43764378 try self.spillEflagsIfOccupied();
43774379 try self.asmRegisterImmediate(.@"test", reg, Immediate.u(1));
4378 return self.addInst(.{
4379 .tag = .jcc,
4380 .ops = .inst_cc,
4381 .data = .{ .inst_cc = .{
4382 .inst = undefined,
4383 .cc = .e,
4384 } },
4385 });
4380 return self.asmJccReloc(undefined, .e);
43864381 },
43874382 .immediate,
43884383 .stack_offset,
......@@ -4792,15 +4787,7 @@ fn genCondSwitchMir(self: *Self, ty: Type, condition: MCValue, case: MCValue) !u
47924787
47934788 const aliased_reg = registerAlias(cond_reg, abi_size);
47944789 try self.asmRegisterRegister(.@"test", aliased_reg, aliased_reg);
4795
4796 return self.addInst(.{
4797 .tag = .jcc,
4798 .ops = .inst_cc,
4799 .data = .{ .inst_cc = .{
4800 .inst = undefined,
4801 .cc = .ne,
4802 } },
4803 });
4790 return self.asmJccReloc(undefined, .ne);
48044791 },
48054792 .stack_offset => {
48064793 try self.spillEflagsIfOccupied();
......@@ -5612,7 +5599,6 @@ fn genInlineMemcpy(
56125599
56135600 try self.genSetReg(Type.usize, count_reg, len);
56145601 try self.asmRegisterImmediate(.mov, index_reg, Immediate.u(0));
5615
56165602 const loop_start = try self.addInst(.{
56175603 .tag = .cmp,
56185604 .ops = .ri_u,
......@@ -5621,15 +5607,7 @@ fn genInlineMemcpy(
56215607 .imm = 0,
56225608 } },
56235609 });
5624 const loop_reloc = try self.addInst(.{
5625 .tag = .jcc,
5626 .ops = .inst_cc,
5627 .data = .{ .inst_cc = .{
5628 .inst = undefined,
5629 .cc = .e,
5630 } },
5631 });
5632
5610 const loop_reloc = try self.asmJccReloc(undefined, .e);
56335611 try self.asmRegisterMemory(.mov, tmp_reg.to8(), Memory.sib(.byte, .{
56345612 .base = src_addr_reg,
56355613 .scale_index = .{
......@@ -5708,15 +5686,7 @@ fn genInlineMemset(
57085686 .imm = -1,
57095687 } },
57105688 });
5711
5712 const loop_reloc = try self.addInst(.{
5713 .tag = .jcc,
5714 .ops = .inst_cc,
5715 .data = .{ .inst_cc = .{
5716 .inst = undefined,
5717 .cc = .e,
5718 } },
5719 });
5689 const loop_reloc = try self.asmJccReloc(undefined, .e);
57205690
57215691 switch (value) {
57225692 .immediate => |x| {