authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-21 23:25:49+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-02-21 23:34:05+01:00
log2ad2e2f6f5c327187b37619c0d7dd207c29916a1
treee10fae8a8f773afe076486c3c456cd3065a7b342
parentddb33baa11525a4896be850b4e88d9db337b9c2c

link+riscv: use riscv64/bits.zig to implement write helpers


1 files changed, 28 insertions(+), 16 deletions(-)

src/link/riscv.zig+28-16
...@@ -25,34 +25,46 @@ pub fn writeAddend(...@@ -25,34 +25,46 @@ pub fn writeAddend(
25}25}
2626
27pub fn writeInstU(code: *[4]u8, value: u32) void {27pub fn writeInstU(code: *[4]u8, value: u32) void {
28 const inst_mask: u32 = 0b00000000000000000000_11111_1111111;28 var inst = Instruction{
29 const val_mask: u32 = 0xffff_f000;29 .U = mem.bytesToValue(std.meta.TagPayload(
30 var inst = mem.readInt(u32, code, .little);30 Instruction,
31 inst &= inst_mask;31 Instruction.U,
32 ), code),
33 };
32 const compensated: u32 = @bitCast(@as(i32, @bitCast(value)) + 0x800);34 const compensated: u32 = @bitCast(@as(i32, @bitCast(value)) + 0x800);
33 inst |= (compensated & val_mask);35 inst.U.imm12_31 = @truncate(bitSlice(compensated, 31, 12));
34 mem.writeInt(u32, code, inst, .little);36 mem.writeInt(u32, code, inst.toU32(), .little);
35}37}
3638
37pub fn writeInstI(code: *[4]u8, value: u32) void {39pub fn writeInstI(code: *[4]u8, value: u32) void {
38 const mask: u32 = 0b00000000000_11111_111_11111_1111111;40 var inst = Instruction{
39 var inst = mem.readInt(u32, code, .little);41 .I = mem.bytesToValue(std.meta.TagPayload(
40 inst &= mask;42 Instruction,
41 inst |= (bitSlice(value, 11, 0) << 20);43 Instruction.I,
42 mem.writeInt(u32, code, inst, .little);44 ), code),
45 };
46 inst.I.imm0_11 = @truncate(bitSlice(value, 11, 0));
47 mem.writeInt(u32, code, inst.toU32(), .little);
43}48}
4449
45pub fn writeInstS(code: *[4]u8, value: u32) void {50pub fn writeInstS(code: *[4]u8, value: u32) void {
46 const mask: u32 = 0b000000_11111_11111_111_00000_1111111;51 var inst = Instruction{
47 var inst = mem.readInt(u32, code, .little);52 .S = mem.bytesToValue(std.meta.TagPayload(
48 inst &= mask;53 Instruction,
49 inst |= (bitSlice(value, 11, 5) << 25) | (bitSlice(value, 4, 0) << 7);54 Instruction.S,
50 mem.writeInt(u32, code, inst, .little);55 ), code),
56 };
57 inst.S.imm0_4 = @truncate(bitSlice(value, 4, 0));
58 inst.S.imm5_11 = @truncate(bitSlice(value, 11, 5));
59 mem.writeInt(u32, code, inst.toU32(), .little);
51}60}
5261
53fn bitSlice(value: anytype, high: std.math.Log2Int(@TypeOf(value)), low: std.math.Log2Int(@TypeOf(value))) @TypeOf(value) {62fn bitSlice(value: anytype, high: std.math.Log2Int(@TypeOf(value)), low: std.math.Log2Int(@TypeOf(value))) @TypeOf(value) {
54 return (value >> low) & ((@as(@TypeOf(value), 1) << (high - low + 1)) - 1);63 return (value >> low) & ((@as(@TypeOf(value), 1) << (high - low + 1)) - 1);
55}64}
5665
66const bits = @import("../arch/riscv64/bits.zig");
57const mem = std.mem;67const mem = std.mem;
58const std = @import("std");68const std = @import("std");
69
70pub const Instruction = bits.Instruction;