authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-26 14:01:32-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-06-13 02:22:34-07:00
loga9ef0169432a6709ca59588050be703ab1a10357
treeff644739d443e83e132025252aeccd929b86e88c
parenta270c6f8c82bc81eecf37cc06a326e46ed44fb8b
signaturelock-open Commit is signed but in an unrecognized format.

riscv: implement `airArrayToSlice`


1 files changed, 18 insertions(+), 3 deletions(-)

src/arch/riscv64/CodeGen.zig+18-3
......@@ -5880,10 +5880,25 @@ fn airBitCast(func: *Func, inst: Air.Inst.Index) !void {
58805880}
58815881
58825882fn airArrayToSlice(func: *Func, inst: Air.Inst.Index) !void {
5883 const zcu = func.bin_file.comp.module.?;
58835884 const ty_op = func.air.instructions.items(.data)[@intFromEnum(inst)].ty_op;
5884 const result: MCValue = if (func.liveness.isUnused(inst)) .unreach else return func.fail("TODO implement airArrayToSlice for {}", .{
5885 func.target.cpu.arch,
5886 });
5885
5886 const slice_ty = func.typeOfIndex(inst);
5887 const ptr_ty = func.typeOf(ty_op.operand);
5888 const ptr = try func.resolveInst(ty_op.operand);
5889 const array_ty = ptr_ty.childType(zcu);
5890 const array_len = array_ty.arrayLen(zcu);
5891
5892 const frame_index = try func.allocFrameIndex(FrameAlloc.initSpill(slice_ty, zcu));
5893 try func.genSetMem(.{ .frame = frame_index }, 0, ptr_ty, ptr);
5894 try func.genSetMem(
5895 .{ .frame = frame_index },
5896 @intCast(ptr_ty.abiSize(zcu)),
5897 Type.usize,
5898 .{ .immediate = array_len },
5899 );
5900
5901 const result = MCValue{ .load_frame = .{ .index = frame_index } };
58875902 return func.finishAir(inst, result, .{ ty_op.operand, .none, .none });
58885903}
58895904