diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-01-02 01:10:04 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-01-04 01:21:23 +0100 |
| commit | 978de7038161dffbd805e33f27ade177ec873bcc (patch) | |
| tree | ee6d5f8ee7a89d5e2a53e284fa6a3b4477783a98 | |
| parent | 7a8a630bb22a0f632f13f3cb36715002df9985cc (diff) | |
| download | zig-978de7038161dffbd805e33f27ade177ec873bcc.tar.gz zig-978de7038161dffbd805e33f27ade177ec873bcc.zip | |
stage2: add helper for encoding imm32 based on target size
| -rw-r--r-- | src/arch/x86_64/Isel.zig | 55 |
1 files changed, 13 insertions, 42 deletions
diff --git a/src/arch/x86_64/Isel.zig b/src/arch/x86_64/Isel.zig index a467e0317e..8bab7c6882 100644 --- a/src/arch/x86_64/Isel.zig +++ b/src/arch/x86_64/Isel.zig @@ -1308,6 +1308,15 @@ const Memory = struct { } }; +fn encodeImm(encoder: Encoder, imm: i32, size: u64) void { + switch (size) { + 8 => encoder.imm8(@intCast(i8, imm)), + 16 => encoder.imm16(@intCast(i16, imm)), + 32, 64 => encoder.imm32(imm), + else => unreachable, + } +} + const RegisterOrMemory = union(enum) { register: Register, memory: Memory, @@ -1365,13 +1374,7 @@ fn lowerToIEnc(tag: Tag, imm: i32, code: *std.ArrayList(u8)) LoweringError!void encoder.prefix16BitMode(); } opc.encode(encoder); - if (immOpSize(imm) == 8) { - encoder.imm8(@intCast(i8, imm)); - } else if (immOpSize(imm) == 16) { - encoder.imm16(@intCast(i16, imm)); - } else { - encoder.imm32(imm); - } + encodeImm(encoder, imm, immOpSize(imm)); } fn 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 }); opc.encode(encoder); encoder.modRm_direct(modrm_ext, dst_reg.lowId()); - switch (dst_reg.size()) { - 8 => { - const imm8 = try math.cast(i8, imm); - encoder.imm8(imm8); - }, - 16 => { - const imm16 = try math.cast(i16, imm); - encoder.imm16(imm16); - }, - 32, 64 => encoder.imm32(imm), - else => unreachable, - } + encodeImm(encoder, imm, dst_reg.size()); }, .memory => |dst_mem| { 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 opc.encode(encoder); Memory.encodeDsOrRip(encoder, modrm_ext, dst_mem.disp, dst_mem.rip); } - switch (dst_mem.ptr_size) { - .byte_ptr => { - const imm8 = try math.cast(i8, imm); - encoder.imm8(imm8); - }, - .word_ptr => { - const imm16 = try math.cast(i16, imm); - encoder.imm16(imm16); - }, - .dword_ptr, .qword_ptr => { - encoder.imm32(imm); - }, - } + encodeImm(encoder, imm, dst_mem.ptr_size.size()); }, } } @@ -1760,16 +1740,7 @@ fn lowerToRmiEnc( } }, } - switch (reg.size()) { - // TODO 8bit immediate - 8 => unreachable, - 16 => { - const imm16 = try math.cast(i16, imm); - encoder.imm16(imm16); - }, - 32, 64 => encoder.imm32(imm), - else => unreachable, - } + encodeImm(encoder, imm, reg.size()); } fn expectEqualHexStrings(expected: []const u8, given: []const u8, assembly: []const u8) !void { |
