authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-02 01:10:04+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-01-04 01:21:23+01:00
log978de7038161dffbd805e33f27ade177ec873bcc
treeee6d5f8ee7a89d5e2a53e284fa6a3b4477783a98
parent7a8a630bb22a0f632f13f3cb36715002df9985cc

stage2: add helper for encoding imm32 based on target size


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

src/arch/x86_64/Isel.zig+13-42
......@@ -1308,6 +1308,15 @@ const Memory = struct {
13081308 }
13091309};
13101310
1311fn encodeImm(encoder: Encoder, imm: i32, size: u64) void {
1312 switch (size) {
1313 8 => encoder.imm8(@intCast(i8, imm)),
1314 16 => encoder.imm16(@intCast(i16, imm)),
1315 32, 64 => encoder.imm32(imm),
1316 else => unreachable,
1317 }
1318}
1319
13111320const RegisterOrMemory = union(enum) {
13121321 register: Register,
13131322 memory: Memory,
......@@ -1365,13 +1374,7 @@ fn lowerToIEnc(tag: Tag, imm: i32, code: *std.ArrayList(u8)) LoweringError!void
13651374 encoder.prefix16BitMode();
13661375 }
13671376 opc.encode(encoder);
1368 if (immOpSize(imm) == 8) {
1369 encoder.imm8(@intCast(i8, imm));
1370 } else if (immOpSize(imm) == 16) {
1371 encoder.imm16(@intCast(i16, imm));
1372 } else {
1373 encoder.imm32(imm);
1374 }
1377 encodeImm(encoder, imm, immOpSize(imm));
13751378}
13761379
13771380fn lowerToOEnc(tag: Tag, reg: Register, code: *std.ArrayList(u8)) LoweringError!void {
......@@ -1549,18 +1552,7 @@ fn lowerToMiEnc(tag: Tag, reg_or_mem: RegisterOrMemory, imm: i32, code: *std.Arr
15491552 });
15501553 opc.encode(encoder);
15511554 encoder.modRm_direct(modrm_ext, dst_reg.lowId());
1552 switch (dst_reg.size()) {
1553 8 => {
1554 const imm8 = try math.cast(i8, imm);
1555 encoder.imm8(imm8);
1556 },
1557 16 => {
1558 const imm16 = try math.cast(i16, imm);
1559 encoder.imm16(imm16);
1560 },
1561 32, 64 => encoder.imm32(imm),
1562 else => unreachable,
1563 }
1555 encodeImm(encoder, imm, dst_reg.size());
15641556 },
15651557 .memory => |dst_mem| {
15661558 const opc = getOpCode(tag, .mi, dst_mem.ptr_size == .byte_ptr).?;
......@@ -1582,19 +1574,7 @@ fn lowerToMiEnc(tag: Tag, reg_or_mem: RegisterOrMemory, imm: i32, code: *std.Arr
15821574 opc.encode(encoder);
15831575 Memory.encodeDsOrRip(encoder, modrm_ext, dst_mem.disp, dst_mem.rip);
15841576 }
1585 switch (dst_mem.ptr_size) {
1586 .byte_ptr => {
1587 const imm8 = try math.cast(i8, imm);
1588 encoder.imm8(imm8);
1589 },
1590 .word_ptr => {
1591 const imm16 = try math.cast(i16, imm);
1592 encoder.imm16(imm16);
1593 },
1594 .dword_ptr, .qword_ptr => {
1595 encoder.imm32(imm);
1596 },
1597 }
1577 encodeImm(encoder, imm, dst_mem.ptr_size.size());
15981578 },
15991579 }
16001580}
......@@ -1760,16 +1740,7 @@ fn lowerToRmiEnc(
17601740 }
17611741 },
17621742 }
1763 switch (reg.size()) {
1764 // TODO 8bit immediate
1765 8 => unreachable,
1766 16 => {
1767 const imm16 = try math.cast(i16, imm);
1768 encoder.imm16(imm16);
1769 },
1770 32, 64 => encoder.imm32(imm),
1771 else => unreachable,
1772 }
1743 encodeImm(encoder, imm, reg.size());
17731744}
17741745
17751746fn expectEqualHexStrings(expected: []const u8, given: []const u8, assembly: []const u8) !void {