| ... | @@ -32,7 +32,7 @@ pub fn writeInstU(code: *[4]u8, value: u32) void { | ... | @@ -32,7 +32,7 @@ pub fn writeInstU(code: *[4]u8, value: u32) void { |
| 32 | ), code), | 32 | ), code), |
| 33 | }; | 33 | }; |
| 34 | const compensated: u32 = @bitCast(@as(i32, @bitCast(value)) + 0x800); | 34 | const compensated: u32 = @bitCast(@as(i32, @bitCast(value)) + 0x800); |
| 35 | inst.U.imm12_31 = @truncate(bitSlice(compensated, 31, 12)); | 35 | inst.U.imm12_31 = bitSlice(compensated, 31, 12); |
| 36 | mem.writeInt(u32, code, inst.toU32(), .little); | 36 | mem.writeInt(u32, code, inst.toU32(), .little); |
| 37 | } | 37 | } |
| 38 | | 38 | |
| ... | @@ -43,7 +43,7 @@ pub fn writeInstI(code: *[4]u8, value: u32) void { | ... | @@ -43,7 +43,7 @@ pub fn writeInstI(code: *[4]u8, value: u32) void { |
| 43 | Instruction.I, | 43 | Instruction.I, |
| 44 | ), code), | 44 | ), code), |
| 45 | }; | 45 | }; |
| 46 | inst.I.imm0_11 = @truncate(bitSlice(value, 11, 0)); | 46 | inst.I.imm0_11 = bitSlice(value, 11, 0); |
| 47 | mem.writeInt(u32, code, inst.toU32(), .little); | 47 | mem.writeInt(u32, code, inst.toU32(), .little); |
| 48 | } | 48 | } |
| 49 | | 49 | |
| ... | @@ -54,13 +54,17 @@ pub fn writeInstS(code: *[4]u8, value: u32) void { | ... | @@ -54,13 +54,17 @@ pub fn writeInstS(code: *[4]u8, value: u32) void { |
| 54 | Instruction.S, | 54 | Instruction.S, |
| 55 | ), code), | 55 | ), code), |
| 56 | }; | 56 | }; |
| 57 | inst.S.imm0_4 = @truncate(bitSlice(value, 4, 0)); | 57 | inst.S.imm0_4 = bitSlice(value, 4, 0); |
| 58 | inst.S.imm5_11 = @truncate(bitSlice(value, 11, 5)); | 58 | inst.S.imm5_11 = bitSlice(value, 11, 5); |
| 59 | mem.writeInt(u32, code, inst.toU32(), .little); | 59 | mem.writeInt(u32, code, inst.toU32(), .little); |
| 60 | } | 60 | } |
| 61 | | 61 | |
| 62 | fn bitSlice(value: anytype, high: std.math.Log2Int(@TypeOf(value)), low: std.math.Log2Int(@TypeOf(value))) @TypeOf(value) { | 62 | fn bitSlice( |
| 63 | return (value >> low) & ((@as(@TypeOf(value), 1) << (high - low + 1)) - 1); | 63 | value: anytype, |
| | 64 | comptime high: comptime_int, |
| | 65 | comptime low: comptime_int, |
| | 66 | ) std.math.IntFittingRange(0, 1 << high - low) { |
| | 67 | return @truncate((value >> low) & (1 << (high - low + 1)) - 1); |
| 64 | } | 68 | } |
| 65 | | 69 | |
| 66 | const bits = @import("../arch/riscv64/bits.zig"); | 70 | const bits = @import("../arch/riscv64/bits.zig"); |