authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-25 19:35:38+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-25 22:22:16-04:00
logc1098e90367c8965fbf0c65e4967d938986af8b0
tree09e84d44a63c6912ee7c858c0daff33fec29b272
parent600c7fe1dacc1d6fd35275c7abe459b5b56bfa63

stage2 x86_64: remove MCValue.embedded_in_code


1 files changed, 6 insertions(+), 60 deletions(-)

src/arch/x86_64/CodeGen.zig+6-60
......@@ -117,11 +117,6 @@ pub const MCValue = union(enum) {
117117 /// A pointer-sized integer that fits in a register.
118118 /// If the type is a pointer, this is the pointer address in virtual address space.
119119 immediate: u64,
120 /// The constant was emitted into the code, at this offset.
121 /// If the type is a pointer, it means the pointer address is embedded in the code.
122 embedded_in_code: usize,
123 /// The value is a pointer to a constant which was emitted into the code, at this offset.
124 ptr_embedded_in_code: usize,
125120 /// The value is in a target-specific register.
126121 register: Register,
127122 /// The value is in memory at a hard-coded address.
......@@ -149,7 +144,7 @@ pub const MCValue = union(enum) {
149144
150145 fn isMemory(mcv: MCValue) bool {
151146 return switch (mcv) {
152 .embedded_in_code, .memory, .stack_offset => true,
147 .memory, .stack_offset => true,
153148 else => false,
154149 };
155150 }
......@@ -168,12 +163,10 @@ pub const MCValue = union(enum) {
168163 .dead => unreachable,
169164
170165 .immediate,
171 .embedded_in_code,
172166 .memory,
173167 .compare_flags_unsigned,
174168 .compare_flags_signed,
175169 .ptr_stack_offset,
176 .ptr_embedded_in_code,
177170 .undef,
178171 => false,
179172
......@@ -2437,12 +2430,6 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
24372430 .ptr_stack_offset => |off| {
24382431 try self.setRegOrMem(elem_ty, dst_mcv, .{ .stack_offset = off });
24392432 },
2440 .ptr_embedded_in_code => |off| {
2441 try self.setRegOrMem(elem_ty, dst_mcv, .{ .embedded_in_code = off });
2442 },
2443 .embedded_in_code => {
2444 return self.fail("TODO implement loading from MCValue.embedded_in_code", .{});
2445 },
24462433 .register => |reg| {
24472434 self.register_manager.freezeRegs(&.{reg});
24482435 defer self.register_manager.unfreezeRegs(&.{reg});
......@@ -2452,7 +2439,6 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo
24522439 .undef => unreachable,
24532440 .compare_flags_unsigned => unreachable,
24542441 .compare_flags_signed => unreachable,
2455 .embedded_in_code => unreachable,
24562442 .register => |dst_reg| {
24572443 // mov dst_reg, [reg]
24582444 _ = try self.addInst(.{
......@@ -2567,12 +2553,6 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
25672553 .ptr_stack_offset => |off| {
25682554 try self.genSetStack(value_ty, off, value, .{});
25692555 },
2570 .ptr_embedded_in_code => |off| {
2571 try self.setRegOrMem(value_ty, .{ .embedded_in_code = off }, value);
2572 },
2573 .embedded_in_code => {
2574 return self.fail("TODO implement storing to MCValue.embedded_in_code", .{});
2575 },
25762556 .register => |reg| {
25772557 self.register_manager.freezeRegs(&.{reg});
25782558 defer self.register_manager.unfreezeRegs(&.{reg});
......@@ -3025,7 +3005,6 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
30253005 .compare_flags_unsigned => unreachable,
30263006 .compare_flags_signed => unreachable,
30273007 .ptr_stack_offset => unreachable,
3028 .ptr_embedded_in_code => unreachable,
30293008 .register => |dst_reg| {
30303009 switch (src_mcv) {
30313010 .none => unreachable,
......@@ -3037,7 +3016,6 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
30373016 const reg = try self.copyToTmpRegister(dst_ty, src_mcv);
30383017 return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .register = reg });
30393018 },
3040 .ptr_embedded_in_code => unreachable,
30413019 .register => |src_reg| {
30423020 _ = try self.addInst(.{
30433021 .tag = mir_tag,
......@@ -3057,7 +3035,6 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
30573035 .data = .{ .imm = @truncate(u32, imm) },
30583036 });
30593037 },
3060 .embedded_in_code,
30613038 .memory,
30623039 .got_load,
30633040 .direct_load,
......@@ -3099,7 +3076,6 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
30993076 .undef => return self.genSetStack(dst_ty, off, .undef, .{}),
31003077 .dead, .unreach => unreachable,
31013078 .ptr_stack_offset => unreachable,
3102 .ptr_embedded_in_code => unreachable,
31033079 .register => |src_reg| {
31043080 _ = try self.addInst(.{
31053081 .tag = mir_tag,
......@@ -3141,7 +3117,7 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
31413117 .data = .{ .payload = payload },
31423118 });
31433119 },
3144 .embedded_in_code, .memory, .stack_offset => {
3120 .memory, .stack_offset => {
31453121 return self.fail("TODO implement x86 ADD/SUB/CMP source memory", .{});
31463122 },
31473123 .got_load, .direct_load => {
......@@ -3155,7 +3131,7 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
31553131 },
31563132 }
31573133 },
3158 .embedded_in_code, .memory => {
3134 .memory => {
31593135 return self.fail("TODO implement x86 ADD/SUB/CMP destination memory", .{});
31603136 },
31613137 .got_load, .direct_load => {
......@@ -3173,14 +3149,12 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
31733149 .compare_flags_unsigned => unreachable,
31743150 .compare_flags_signed => unreachable,
31753151 .ptr_stack_offset => unreachable,
3176 .ptr_embedded_in_code => unreachable,
31773152 .register => |dst_reg| {
31783153 switch (src_mcv) {
31793154 .none => unreachable,
31803155 .undef => try self.genSetReg(dst_ty, dst_reg, .undef),
31813156 .dead, .unreach => unreachable,
31823157 .ptr_stack_offset => unreachable,
3183 .ptr_embedded_in_code => unreachable,
31843158 .register => |src_reg| {
31853159 // register, register
31863160 _ = try self.addInst(.{
......@@ -3222,7 +3196,7 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
32223196 .data = .{ .imm = @bitCast(u32, -off) },
32233197 });
32243198 },
3225 .embedded_in_code, .memory => {
3199 .memory => {
32263200 return self.fail("TODO implement x86 multiply source memory", .{});
32273201 },
32283202 .got_load, .direct_load => {
......@@ -3242,7 +3216,6 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
32423216 .undef => return self.genSetStack(dst_ty, off, .undef, .{}),
32433217 .dead, .unreach => unreachable,
32443218 .ptr_stack_offset => unreachable,
3245 .ptr_embedded_in_code => unreachable,
32463219 .register => |src_reg| {
32473220 // copy dst to a register
32483221 const dst_reg = try self.copyToTmpRegister(dst_ty, dst_mcv);
......@@ -3263,7 +3236,7 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
32633236 _ = imm;
32643237 return self.fail("TODO implement x86 multiply source immediate", .{});
32653238 },
3266 .embedded_in_code, .memory, .stack_offset => {
3239 .memory, .stack_offset => {
32673240 return self.fail("TODO implement x86 multiply source memory", .{});
32683241 },
32693242 .got_load, .direct_load => {
......@@ -3277,7 +3250,7 @@ fn genIMulOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !
32773250 },
32783251 }
32793252 },
3280 .embedded_in_code, .memory => {
3253 .memory => {
32813254 return self.fail("TODO implement x86 multiply destination memory", .{});
32823255 },
32833256 .got_load, .direct_load => {
......@@ -3396,14 +3369,10 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallOptions.
33963369 .ptr_stack_offset => {
33973370 return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{});
33983371 },
3399 .ptr_embedded_in_code => {
3400 return self.fail("TODO implement calling with MCValue.ptr_embedded_in_code arg", .{});
3401 },
34023372 .undef => unreachable,
34033373 .immediate => unreachable,
34043374 .unreach => unreachable,
34053375 .dead => unreachable,
3406 .embedded_in_code => unreachable,
34073376 .memory => unreachable,
34083377 .got_load => unreachable,
34093378 .direct_load => unreachable,
......@@ -4626,7 +4595,6 @@ fn genSetStackArg(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue) InnerE
46264595 const abi_size = ty.abiSize(self.target.*);
46274596 switch (mcv) {
46284597 .dead => unreachable,
4629 .ptr_embedded_in_code => unreachable,
46304598 .unreach, .none => return,
46314599 .undef => {
46324600 if (abi_size <= 8) {
......@@ -4677,13 +4645,6 @@ fn genSetStackArg(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue) InnerE
46774645 else => return self.fail("TODO implement inputs on stack for {} with abi size > 8", .{mcv}),
46784646 }
46794647 },
4680 .embedded_in_code => {
4681 if (abi_size <= 8) {
4682 const reg = try self.copyToTmpRegister(ty, mcv);
4683 return self.genSetStackArg(ty, stack_offset, MCValue{ .register = reg });
4684 }
4685 return self.fail("TODO implement inputs on stack for {} with abi size > 8", .{mcv});
4686 },
46874648 .memory,
46884649 .direct_load,
46894650 .got_load,
......@@ -4731,7 +4692,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue, opts: Inl
47314692 const abi_size = ty.abiSize(self.target.*);
47324693 switch (mcv) {
47334694 .dead => unreachable,
4734 .ptr_embedded_in_code => unreachable,
47354695 .unreach, .none => return, // Nothing to do.
47364696 .undef => {
47374697 if (!self.wantSafety())
......@@ -4870,7 +4830,6 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: i32, mcv: MCValue, opts: Inl
48704830 }
48714831 },
48724832 .memory,
4873 .embedded_in_code,
48744833 .got_load,
48754834 .direct_load,
48764835 => {
......@@ -5222,7 +5181,6 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
52225181 .data = .{ .imm = @bitCast(u32, -off) },
52235182 });
52245183 },
5225 .ptr_embedded_in_code => unreachable,
52265184 .unreach, .none => return, // Nothing to do.
52275185 .undef => {
52285186 if (!self.wantSafety())
......@@ -5304,18 +5262,6 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
53045262 .data = .{ .payload = payload },
53055263 });
53065264 },
5307 .embedded_in_code => |code_offset| {
5308 // We need the offset from RIP in a signed i32 twos complement.
5309 const payload = try self.addExtra(Mir.Imm64.encode(code_offset));
5310 _ = try self.addInst(.{
5311 .tag = .lea,
5312 .ops = (Mir.Ops{
5313 .reg1 = reg,
5314 .flags = 0b01,
5315 }).encode(),
5316 .data = .{ .payload = payload },
5317 });
5318 },
53195265 .register => |src_reg| {
53205266 // If the registers are the same, nothing to do.
53215267 if (src_reg.id() == reg.id())