aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-01-02 01:10:04 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-01-04 01:21:23 +0100
commit978de7038161dffbd805e33f27ade177ec873bcc (patch)
treeee6d5f8ee7a89d5e2a53e284fa6a3b4477783a98
parent7a8a630bb22a0f632f13f3cb36715002df9985cc (diff)
downloadzig-978de7038161dffbd805e33f27ade177ec873bcc.tar.gz
zig-978de7038161dffbd805e33f27ade177ec873bcc.zip
stage2: add helper for encoding imm32 based on target size
-rw-r--r--src/arch/x86_64/Isel.zig55
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 {