authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-11 16:32:30+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-03-11 20:05:50+01:00
logfb38e3d6b29f71834c7ea4ef21e4d3f607c03777
tree468c8ba37e6fb648c0f138569fe8ea88c40342f3
parent0a8b5c20aa2402361a4e5698100902e47bd2c7c6

x86_64: simplify immediate handling at MIR level


3 files changed, 128 insertions(+), 146 deletions(-)

src/arch/x86_64/CodeGen.zig+34-43
...@@ -460,15 +460,13 @@ fn asmRegister(self: *Self, tag: Mir.Inst.Tag, reg: Register) !void {...@@ -460,15 +460,13 @@ fn asmRegister(self: *Self, tag: Mir.Inst.Tag, reg: Register) !void {
460460
461fn asmImmediate(self: *Self, tag: Mir.Inst.Tag, imm: Immediate) !void {461fn asmImmediate(self: *Self, tag: Mir.Inst.Tag, imm: Immediate) !void {
462 const ops: Mir.Inst.Ops = if (imm == .signed) .imm_s else .imm_u;462 const ops: Mir.Inst.Ops = if (imm == .signed) .imm_s else .imm_u;
463 const data: Mir.Inst.Data = switch (ops) {
464 .imm_s => .{ .imm_s = imm.signed },
465 .imm_u => .{ .imm_u = @intCast(u32, imm.unsigned) },
466 else => unreachable,
467 };
468 _ = try self.addInst(.{463 _ = try self.addInst(.{
469 .tag = tag,464 .tag = tag,
470 .ops = ops,465 .ops = ops,
471 .data = data,466 .data = .{ .imm = switch (imm) {
467 .signed => |x| @bitCast(u32, x),
468 .unsigned => |x| @intCast(u32, x),
469 } },
472 });470 });
473}471}
474472
...@@ -489,11 +487,11 @@ fn asmRegisterImmediate(self: *Self, tag: Mir.Inst.Tag, reg: Register, imm: Imme...@@ -489,11 +487,11 @@ fn asmRegisterImmediate(self: *Self, tag: Mir.Inst.Tag, reg: Register, imm: Imme
489 .unsigned => |x| if (x <= math.maxInt(u32)) .ri_u else .ri64,487 .unsigned => |x| if (x <= math.maxInt(u32)) .ri_u else .ri64,
490 };488 };
491 const data: Mir.Inst.Data = switch (ops) {489 const data: Mir.Inst.Data = switch (ops) {
492 .ri_s => .{ .ri_s = .{490 .ri_s => .{ .ri = .{
493 .r1 = reg,491 .r1 = reg,
494 .imm = imm.signed,492 .imm = @bitCast(u32, imm.signed),
495 } },493 } },
496 .ri_u => .{ .ri_u = .{494 .ri_u => .{ .ri = .{
497 .r1 = reg,495 .r1 = reg,
498 .imm = @intCast(u32, imm.unsigned),496 .imm = @intCast(u32, imm.unsigned),
499 } },497 } },
...@@ -522,12 +520,12 @@ fn asmRegisterRegisterImmediate(...@@ -522,12 +520,12 @@ fn asmRegisterRegisterImmediate(
522 .unsigned => .rri_u,520 .unsigned => .rri_u,
523 };521 };
524 const data: Mir.Inst.Data = switch (ops) {522 const data: Mir.Inst.Data = switch (ops) {
525 .rri_s => .{ .rri_s = .{523 .rri_s => .{ .rri = .{
526 .r1 = reg1,524 .r1 = reg1,
527 .r2 = reg2,525 .r2 = reg2,
528 .imm = imm.signed,526 .imm = @bitCast(u32, imm.signed),
529 } },527 } },
530 .rri_u => .{ .rri_u = .{528 .rri_u => .{ .rri = .{
531 .r1 = reg1,529 .r1 = reg1,
532 .r2 = reg2,530 .r2 = reg2,
533 .imm = @intCast(u32, imm.unsigned),531 .imm = @intCast(u32, imm.unsigned),
...@@ -547,11 +545,11 @@ fn asmMemory(self: *Self, tag: Mir.Inst.Tag, m: Memory) !void {...@@ -547,11 +545,11 @@ fn asmMemory(self: *Self, tag: Mir.Inst.Tag, m: Memory) !void {
547 .rip => .m_rip,545 .rip => .m_rip,
548 else => unreachable,546 else => unreachable,
549 };547 };
550 const data: Mir.Inst.Data = switch (ops) {548 const data: Mir.Inst.Data = .{ .payload = switch (ops) {
551 .m_sib => .{ .payload = try self.addExtra(Mir.MemorySib.encode(m)) },549 .m_sib => try self.addExtra(Mir.MemorySib.encode(m)),
552 .m_rip => .{ .payload = try self.addExtra(Mir.MemoryRip.encode(m)) },550 .m_rip => try self.addExtra(Mir.MemoryRip.encode(m)),
553 else => unreachable,551 else => unreachable,
554 };552 } };
555 _ = try self.addInst(.{553 _ = try self.addInst(.{
556 .tag = tag,554 .tag = tag,
557 .ops = ops,555 .ops = ops,
...@@ -570,10 +568,11 @@ fn asmMemoryImmediate(self: *Self, tag: Mir.Inst.Tag, m: Memory, imm: Immediate)...@@ -570,10 +568,11 @@ fn asmMemoryImmediate(self: *Self, tag: Mir.Inst.Tag, m: Memory, imm: Immediate)
570 .mi_s_rip, .mi_u_rip => try self.addExtra(Mir.MemoryRip.encode(m)),568 .mi_s_rip, .mi_u_rip => try self.addExtra(Mir.MemoryRip.encode(m)),
571 else => unreachable,569 else => unreachable,
572 };570 };
573 const data: Mir.Inst.Data = switch (ops) {571 const data: Mir.Inst.Data = .{
574 .mi_s_sib, .mi_s_rip => .{ .xi_s = .{ .imm = imm.signed, .payload = payload } },572 .xi = .{ .payload = payload, .imm = switch (imm) {
575 .mi_u_sib, .mi_u_rip => .{ .xi_u = .{ .imm = @intCast(u32, imm.unsigned), .payload = payload } },573 .signed => |x| @bitCast(u32, x),
576 else => unreachable,574 .unsigned => |x| @intCast(u32, x),
575 } },
577 };576 };
578 _ = try self.addInst(.{577 _ = try self.addInst(.{
579 .tag = tag,578 .tag = tag,
...@@ -588,16 +587,12 @@ fn asmRegisterMemory(self: *Self, tag: Mir.Inst.Tag, reg: Register, m: Memory) !...@@ -588,16 +587,12 @@ fn asmRegisterMemory(self: *Self, tag: Mir.Inst.Tag, reg: Register, m: Memory) !
588 .rip => .rm_rip,587 .rip => .rm_rip,
589 else => unreachable,588 else => unreachable,
590 };589 };
591 const data: Mir.Inst.Data = switch (ops) {590 const data: Mir.Inst.Data = .{
592 .rm_sib => .{ .rx = .{591 .rx = .{ .r1 = reg, .payload = switch (ops) {
593 .r1 = reg,592 .rm_sib => try self.addExtra(Mir.MemorySib.encode(m)),
594 .payload = try self.addExtra(Mir.MemorySib.encode(m)),593 .rm_rip => try self.addExtra(Mir.MemoryRip.encode(m)),
595 } },594 else => unreachable,
596 .rm_rip => .{ .rx = .{
597 .r1 = reg,
598 .payload = try self.addExtra(Mir.MemoryRip.encode(m)),
599 } },595 } },
600 else => unreachable,
601 };596 };
602 _ = try self.addInst(.{597 _ = try self.addInst(.{
603 .tag = tag,598 .tag = tag,
...@@ -612,16 +607,12 @@ fn asmMemoryRegister(self: *Self, tag: Mir.Inst.Tag, m: Memory, reg: Register) !...@@ -612,16 +607,12 @@ fn asmMemoryRegister(self: *Self, tag: Mir.Inst.Tag, m: Memory, reg: Register) !
612 .rip => .mr_rip,607 .rip => .mr_rip,
613 else => unreachable,608 else => unreachable,
614 };609 };
615 const data: Mir.Inst.Data = switch (ops) {610 const data: Mir.Inst.Data = .{
616 .mr_sib => .{ .rx = .{611 .rx = .{ .r1 = reg, .payload = switch (ops) {
617 .r1 = reg,612 .mr_sib => try self.addExtra(Mir.MemorySib.encode(m)),
618 .payload = try self.addExtra(Mir.MemorySib.encode(m)),613 .mr_rip => try self.addExtra(Mir.MemoryRip.encode(m)),
619 } },614 else => unreachable,
620 .mr_rip => .{ .rx = .{
621 .r1 = reg,
622 .payload = try self.addExtra(Mir.MemoryRip.encode(m)),
623 } },615 } },
624 else => unreachable,
625 };616 };
626 _ = try self.addInst(.{617 _ = try self.addInst(.{
627 .tag = tag,618 .tag = tag,
...@@ -733,7 +724,7 @@ fn gen(self: *Self) InnerError!void {...@@ -733,7 +724,7 @@ fn gen(self: *Self) InnerError!void {
733 self.mir_instructions.set(backpatch_stack_sub, .{724 self.mir_instructions.set(backpatch_stack_sub, .{
734 .tag = .sub,725 .tag = .sub,
735 .ops = .ri_u,726 .ops = .ri_u,
736 .data = .{ .ri_u = .{727 .data = .{ .ri = .{
737 .r1 = .rsp,728 .r1 = .rsp,
738 .imm = aligned_stack_end,729 .imm = aligned_stack_end,
739 } },730 } },
...@@ -741,7 +732,7 @@ fn gen(self: *Self) InnerError!void {...@@ -741,7 +732,7 @@ fn gen(self: *Self) InnerError!void {
741 self.mir_instructions.set(backpatch_stack_add, .{732 self.mir_instructions.set(backpatch_stack_add, .{
742 .tag = .add,733 .tag = .add,
743 .ops = .ri_u,734 .ops = .ri_u,
744 .data = .{ .ri_u = .{735 .data = .{ .ri = .{
745 .r1 = .rsp,736 .r1 = .rsp,
746 .imm = aligned_stack_end,737 .imm = aligned_stack_end,
747 } },738 } },
...@@ -5602,7 +5593,7 @@ fn genInlineMemcpy(...@@ -5602,7 +5593,7 @@ fn genInlineMemcpy(
5602 const loop_start = try self.addInst(.{5593 const loop_start = try self.addInst(.{
5603 .tag = .cmp,5594 .tag = .cmp,
5604 .ops = .ri_u,5595 .ops = .ri_u,
5605 .data = .{ .ri_u = .{5596 .data = .{ .ri = .{
5606 .r1 = count_reg,5597 .r1 = count_reg,
5607 .imm = 0,5598 .imm = 0,
5608 } },5599 } },
...@@ -5681,9 +5672,9 @@ fn genInlineMemset(...@@ -5681,9 +5672,9 @@ fn genInlineMemset(
5681 const loop_start = try self.addInst(.{5672 const loop_start = try self.addInst(.{
5682 .tag = .cmp,5673 .tag = .cmp,
5683 .ops = .ri_s,5674 .ops = .ri_s,
5684 .data = .{ .ri_s = .{5675 .data = .{ .ri = .{
5685 .r1 = index_reg,5676 .r1 = index_reg,
5686 .imm = -1,5677 .imm = @bitCast(u32, @as(i32, -1)),
5687 } },5678 } },
5688 });5679 });
5689 const loop_reloc = try self.asmJccReloc(undefined, .e);5680 const loop_reloc = try self.asmJccReloc(undefined, .e);
src/arch/x86_64/Emit.zig+76-66
...@@ -194,105 +194,115 @@ fn mirEncodeGeneric(emit: *Emit, tag: Mir.Inst.Tag, inst: Mir.Inst.Index) InnerE...@@ -194,105 +194,115 @@ fn mirEncodeGeneric(emit: *Emit, tag: Mir.Inst.Tag, inst: Mir.Inst.Index) InnerE
194 const ops = emit.mir.instructions.items(.ops)[inst];194 const ops = emit.mir.instructions.items(.ops)[inst];
195 const data = emit.mir.instructions.items(.data)[inst];195 const data = emit.mir.instructions.items(.data)[inst];
196196
197 var operands = [4]Instruction.Operand{ .none, .none, .none, .none };197 var op1: Instruction.Operand = .none;
198 var op2: Instruction.Operand = .none;
199 var op3: Instruction.Operand = .none;
200 var op4: Instruction.Operand = .none;
201
198 switch (ops) {202 switch (ops) {
199 .none => {},203 .none => {},
200 .imm_s => operands[0] = .{ .imm = Immediate.s(data.imm_s) },204 .imm_s => op1 = .{ .imm = Immediate.s(@bitCast(i32, data.imm)) },
201 .imm_u => operands[0] = .{ .imm = Immediate.u(data.imm_u) },205 .imm_u => op1 = .{ .imm = Immediate.u(data.imm) },
202 .r => operands[0] = .{ .reg = data.r },206 .r => op1 = .{ .reg = data.r },
203 .rr => operands[0..2].* = .{207 .rr => {
204 .{ .reg = data.rr.r1 },208 op1 = .{ .reg = data.rr.r1 };
205 .{ .reg = data.rr.r2 },209 op2 = .{ .reg = data.rr.r2 };
206 },
207 .ri_s => operands[0..2].* = .{
208 .{ .reg = data.ri_s.r1 },
209 .{ .imm = Immediate.s(data.ri_s.imm) },
210 },210 },
211 .ri_u => operands[0..2].* = .{211 .ri_s, .ri_u => {
212 .{ .reg = data.ri_u.r1 },212 const imm = switch (ops) {
213 .{ .imm = Immediate.u(data.ri_u.imm) },213 .ri_s => Immediate.s(@bitCast(i32, data.ri.imm)),
214 .ri_u => Immediate.u(data.ri.imm),
215 else => unreachable,
216 };
217 op1 = .{ .reg = data.ri.r1 };
218 op2 = .{ .imm = imm };
214 },219 },
215 .ri64 => {220 .ri64 => {
216 const imm64 = emit.mir.extraData(Mir.Imm64, data.rx.payload).data;221 const imm64 = emit.mir.extraData(Mir.Imm64, data.rx.payload).data;
217 operands[0..2].* = .{222 op1 = .{ .reg = data.rx.r1 };
218 .{ .reg = data.rx.r1 },223 op2 = .{ .imm = Immediate.u(Mir.Imm64.decode(imm64)) };
219 .{ .imm = Immediate.u(Mir.Imm64.decode(imm64)) },
220 };
221 },
222 .rri_s => operands[0..3].* = .{
223 .{ .reg = data.rri_s.r1 },
224 .{ .reg = data.rri_s.r2 },
225 .{ .imm = Immediate.s(data.rri_s.imm) },
226 },224 },
227 .rri_u => operands[0..3].* = .{225 .rri_s, .rri_u => {
228 .{ .reg = data.rri_u.r1 },226 const imm = switch (ops) {
229 .{ .reg = data.rri_u.r2 },227 .rri_s => Immediate.s(@bitCast(i32, data.rri.imm)),
230 .{ .imm = Immediate.u(data.rri_u.imm) },228 .rri_u => Immediate.u(data.rri.imm),
229 else => unreachable,
230 };
231 op1 = .{ .reg = data.rri.r1 };
232 op2 = .{ .reg = data.rri.r2 };
233 op3 = .{ .imm = imm };
231 },234 },
232 .m_sib => {235 .m_sib => {
233 const msib = emit.mir.extraData(Mir.MemorySib, data.payload).data;236 const msib = emit.mir.extraData(Mir.MemorySib, data.payload).data;
234 operands[0] = .{ .mem = Mir.MemorySib.decode(msib) };237 op1 = .{ .mem = Mir.MemorySib.decode(msib) };
235 },238 },
236 .m_rip => {239 .m_rip => {
237 const mrip = emit.mir.extraData(Mir.MemoryRip, data.payload).data;240 const mrip = emit.mir.extraData(Mir.MemoryRip, data.payload).data;
238 operands[0] = .{ .mem = Mir.MemoryRip.decode(mrip) };241 op1 = .{ .mem = Mir.MemoryRip.decode(mrip) };
239 },
240 .mi_u_sib => {
241 const msib = emit.mir.extraData(Mir.MemorySib, data.xi_u.payload).data;
242 operands[0..2].* = .{
243 .{ .mem = Mir.MemorySib.decode(msib) },
244 .{ .imm = Immediate.u(data.xi_u.imm) },
245 };
246 },
247 .mi_s_sib => {
248 const msib = emit.mir.extraData(Mir.MemorySib, data.xi_s.payload).data;
249 operands[0..2].* = .{
250 .{ .mem = Mir.MemorySib.decode(msib) },
251 .{ .imm = Immediate.s(data.xi_s.imm) },
252 };
253 },242 },
254 .mi_u_rip => {243 .mi_s_sib, .mi_u_sib => {
255 const mrip = emit.mir.extraData(Mir.MemoryRip, data.xi_u.payload).data;244 const msib = emit.mir.extraData(Mir.MemorySib, data.xi.payload).data;
256 operands[0..2].* = .{245 const imm = switch (ops) {
257 .{ .mem = Mir.MemoryRip.decode(mrip) },246 .mi_s_sib => Immediate.s(@bitCast(i32, data.xi.imm)),
258 .{ .imm = Immediate.u(data.xi_u.imm) },247 .mi_u_sib => Immediate.u(data.xi.imm),
248 else => unreachable,
259 };249 };
250 op1 = .{ .mem = Mir.MemorySib.decode(msib) };
251 op2 = .{ .imm = imm };
260 },252 },
261 .mi_s_rip => {253 .mi_u_rip, .mi_s_rip => {
262 const mrip = emit.mir.extraData(Mir.MemoryRip, data.xi_s.payload).data;254 const mrip = emit.mir.extraData(Mir.MemoryRip, data.xi.payload).data;
263 operands[0..2].* = .{255 const imm = switch (ops) {
264 .{ .mem = Mir.MemoryRip.decode(mrip) },256 .mi_s_rip => Immediate.s(@bitCast(i32, data.xi.imm)),
265 .{ .imm = Immediate.s(data.xi_s.imm) },257 .mi_u_rip => Immediate.u(data.xi.imm),
258 else => unreachable,
266 };259 };
260 op1 = .{ .mem = Mir.MemoryRip.decode(mrip) };
261 op2 = .{ .imm = imm };
267 },262 },
268 .rm_sib, .mr_sib => {263 .rm_sib, .mr_sib => {
269 const msib = emit.mir.extraData(Mir.MemorySib, data.rx.payload).data;264 const msib = emit.mir.extraData(Mir.MemorySib, data.rx.payload).data;
270 const op1 = .{ .reg = data.rx.r1 };265 const op_r = .{ .reg = data.rx.r1 };
271 const op2 = .{ .mem = Mir.MemorySib.decode(msib) };266 const op_m = .{ .mem = Mir.MemorySib.decode(msib) };
272 switch (ops) {267 switch (ops) {
273 .rm_sib => operands[0..2].* = .{ op1, op2 },268 .rm_sib => {
274 .mr_sib => operands[0..2].* = .{ op2, op1 },269 op1 = op_r;
270 op2 = op_m;
271 },
272 .mr_sib => {
273 op1 = op_m;
274 op2 = op_r;
275 },
275 else => unreachable,276 else => unreachable,
276 }277 }
277 },278 },
278 .rm_rip, .mr_rip => {279 .rm_rip, .mr_rip => {
279 const mrip = emit.mir.extraData(Mir.MemoryRip, data.rx.payload).data;280 const mrip = emit.mir.extraData(Mir.MemoryRip, data.rx.payload).data;
280 const op1 = .{ .reg = data.rx.r1 };281 const op_r = .{ .reg = data.rx.r1 };
281 const op2 = .{ .mem = Mir.MemoryRip.decode(mrip) };282 const op_m = .{ .mem = Mir.MemoryRip.decode(mrip) };
282 switch (ops) {283 switch (ops) {
283 .rm_rip => operands[0..2].* = .{ op1, op2 },284 .rm_sib => {
284 .mr_rip => operands[0..2].* = .{ op2, op1 },285 op1 = op_r;
286 op2 = op_m;
287 },
288 .mr_sib => {
289 op1 = op_m;
290 op2 = op_r;
291 },
285 else => unreachable,292 else => unreachable,
286 }293 }
287 },294 },
288 else => unreachable, // TODO295 else => return emit.fail("TODO handle generic encoding: {s}, {s}", .{
296 @tagName(mnemonic),
297 @tagName(ops),
298 }),
289 }299 }
290300
291 return emit.encode(mnemonic, .{301 return emit.encode(mnemonic, .{
292 .op1 = operands[0],302 .op1 = op1,
293 .op2 = operands[1],303 .op2 = op2,
294 .op3 = operands[2],304 .op3 = op3,
295 .op4 = operands[3],305 .op4 = op4,
296 });306 });
297}307}
298308
src/arch/x86_64/Mir.zig+18-37
...@@ -182,10 +182,10 @@ pub const Inst = struct {...@@ -182,10 +182,10 @@ pub const Inst = struct {
182 /// Uses `rrr` payload.182 /// Uses `rrr` payload.
183 rrr,183 rrr,
184 /// Register, register, immediate (sign-extended) operands.184 /// Register, register, immediate (sign-extended) operands.
185 /// Uses `rri_s` payload.185 /// Uses `rri` payload.
186 rri_s,186 rri_s,
187 /// Register, register, immediate (unsigned) operands.187 /// Register, register, immediate (unsigned) operands.
188 /// Uses `rri_u` payload.188 /// Uses `rri` payload.
189 rri_u,189 rri_u,
190 /// Register with condition code (CC).190 /// Register with condition code (CC).
191 /// Uses `r_c` payload.191 /// Uses `r_c` payload.
...@@ -194,22 +194,22 @@ pub const Inst = struct {...@@ -194,22 +194,22 @@ pub const Inst = struct {
194 /// Uses `rr_c` payload.194 /// Uses `rr_c` payload.
195 rr_c,195 rr_c,
196 /// Register, immediate (sign-extended) operands.196 /// Register, immediate (sign-extended) operands.
197 /// Uses `ri_s` payload.197 /// Uses `ri` payload.
198 ri_s,198 ri_s,
199 /// Register, immediate (unsigned) operands.199 /// Register, immediate (unsigned) operands.
200 /// Uses `ri_u` payload.200 /// Uses `ri` payload.
201 ri_u,201 ri_u,
202 /// Register, 64-bit unsigned immediate operands.202 /// Register, 64-bit unsigned immediate operands.
203 /// Uses `rx` payload with payload type `Imm64`.203 /// Uses `rx` payload with payload type `Imm64`.
204 ri64,204 ri64,
205 /// Immediate (sign-extended) operand.205 /// Immediate (sign-extended) operand.
206 /// Uses `imm_s` payload.206 /// Uses `imm` payload.
207 imm_s,207 imm_s,
208 /// Immediate (unsigned) operand.208 /// Immediate (unsigned) operand.
209 /// Uses `imm_u` payload.209 /// Uses `imm` payload.
210 imm_u,210 imm_u,
211 /// Relative displacement operand.211 /// Relative displacement operand.
212 /// Uses `rel` payload.212 /// Uses `imm` payload.
213 rel,213 rel,
214 /// Register, memory (SIB) operands.214 /// Register, memory (SIB) operands.
215 /// Uses `rx` payload.215 /// Uses `rx` payload.
...@@ -224,16 +224,16 @@ pub const Inst = struct {...@@ -224,16 +224,16 @@ pub const Inst = struct {
224 /// Uses `payload` with extra data of type `MemoryRip`.224 /// Uses `payload` with extra data of type `MemoryRip`.
225 m_rip,225 m_rip,
226 /// Memory (SIB), immediate (unsigned) operands.226 /// Memory (SIB), immediate (unsigned) operands.
227 /// Uses `xi_u` payload with extra data of type `MemorySib`.227 /// Uses `xi` payload with extra data of type `MemorySib`.
228 mi_u_sib,228 mi_u_sib,
229 /// Memory (RIP), immediate (unsigned) operands.229 /// Memory (RIP), immediate (unsigned) operands.
230 /// Uses `xi_u` payload with extra data of type `MemoryRip`.230 /// Uses `xi` payload with extra data of type `MemoryRip`.
231 mi_u_rip,231 mi_u_rip,
232 /// Memory (SIB), immediate (sign-extend) operands.232 /// Memory (SIB), immediate (sign-extend) operands.
233 /// Uses `xi_s` payload with extra data of type `MemorySib`.233 /// Uses `xi` payload with extra data of type `MemorySib`.
234 mi_s_sib,234 mi_s_sib,
235 /// Memory (RIP), immediate (sign-extend) operands.235 /// Memory (RIP), immediate (sign-extend) operands.
236 /// Uses `xi_s` payload with extra data of type `MemoryRip`.236 /// Uses `xi` payload with extra data of type `MemoryRip`.
237 mi_s_rip,237 mi_s_rip,
238 /// Memory (SIB), register operands.238 /// Memory (SIB), register operands.
239 /// Uses `rx` payload with extra data of type `MemorySib`.239 /// Uses `rx` payload with extra data of type `MemorySib`.
...@@ -281,12 +281,8 @@ pub const Inst = struct {...@@ -281,12 +281,8 @@ pub const Inst = struct {
281 /// A condition code for use with EFLAGS register.281 /// A condition code for use with EFLAGS register.
282 cc: bits.Condition,282 cc: bits.Condition,
283 },283 },
284 /// A 32-bit signed immediate value.284 /// A 32-bit immediate value.
285 imm_s: i32,285 imm: u32,
286 /// A 32-bit unsigned immediate value.
287 imm_u: u32,
288 /// A 32-bit signed relative offset value.
289 rel: i32,
290 r: Register,286 r: Register,
291 rr: struct {287 rr: struct {
292 r1: Register,288 r1: Register,
...@@ -297,12 +293,7 @@ pub const Inst = struct {...@@ -297,12 +293,7 @@ pub const Inst = struct {
297 r2: Register,293 r2: Register,
298 r3: Register,294 r3: Register,
299 },295 },
300 rri_s: struct {296 rri: struct {
301 r1: Register,
302 r2: Register,
303 imm: i32,
304 },
305 rri_u: struct {
306 r1: Register,297 r1: Register,
307 r2: Register,298 r2: Register,
308 imm: u32,299 imm: u32,
...@@ -318,13 +309,8 @@ pub const Inst = struct {...@@ -318,13 +309,8 @@ pub const Inst = struct {
318 r2: Register,309 r2: Register,
319 cc: bits.Condition,310 cc: bits.Condition,
320 },311 },
321 /// Register, signed immediate.312 /// Register, immediate.
322 ri_s: struct {313 ri: struct {
323 r1: Register,
324 imm: i32,
325 },
326 /// Register, unsigned immediate.
327 ri_u: struct {
328 r1: Register,314 r1: Register,
329 imm: u32,315 imm: u32,
330 },316 },
...@@ -333,16 +319,11 @@ pub const Inst = struct {...@@ -333,16 +319,11 @@ pub const Inst = struct {
333 r1: Register,319 r1: Register,
334 payload: u32,320 payload: u32,
335 },321 },
336 /// Custom payload followed by an unsigned immediate.322 /// Custom payload followed by an immediate.
337 xi_u: struct {323 xi: struct {
338 payload: u32,324 payload: u32,
339 imm: u32,325 imm: u32,
340 },326 },
341 /// Custom payload followed by a signed immediate.
342 xi_s: struct {
343 payload: u32,
344 imm: i32,
345 },
346 /// Relocation for the linker where:327 /// Relocation for the linker where:
347 /// * `atom_index` is the index of the source328 /// * `atom_index` is the index of the source
348 /// * `sym_index` is the index of the target329 /// * `sym_index` is the index of the target