authorgravatar for xtex@astrafall.orgxtex <xtex@astrafall.org> 2026-10-16 08:40:44+08:00
committergravatar for xtex@astrafall.orgxtex <xtex@astrafall.org> 2026-10-17 10:20:56+08:00
log03128b0e6180c1e13182803204d73f510de67ff4
treecdf4709a66f8c5318b6cc63b0f88a0d1f2714f77
parent1ab08d09cb123352ebc33e3510196ce95c9b7aa4
signature Signed by SSH key SHA256:IEYEjkZlkUTr5U9GiDAmZU/4eZus2t2RsxusyhQqwao

loongarch: implement constant load of slice fields


1 files changed, 17 insertions(+), 2 deletions(-)

src/codegen/loongarch/Select.zig+17-2
......@@ -6615,8 +6615,23 @@ fn moveConstant(isel: *Select, dst: Value.Location, init_constant: Constant, ini
66156615 .field => |field_idx| {
66166616 var base_ptr = ip.indexToKey(field_idx.base).ptr;
66176617 const agg_ty: ZigType = .fromInterned(ip.indexToKey(base_ptr.ty).ptr_type.child);
6618 base_ptr.byte_offset += agg_ty.structFieldOffset(@intCast(field_idx.index), zcu) + ptr.byte_offset;
6619 continue :constant_key .{ .ptr = base_ptr };
6618 switch (ip.indexToKey(agg_ty.toIntern())) {
6619 .ptr_type => |ptr_ty| {
6620 assert(ptr_ty.flags.size == .slice);
6621 const field_offset = switch (field_idx.index) {
6622 Constant.slice_ptr_index => 0,
6623 Constant.slice_len_index => isel.gprSize(),
6624 else => unreachable,
6625 };
6626 base_ptr.byte_offset += ptr.byte_offset + field_offset;
6627 continue :constant_key .{ .ptr = base_ptr };
6628 },
6629 .struct_type, .tuple_type, .union_type => {
6630 base_ptr.byte_offset += agg_ty.structFieldOffset(@intCast(field_idx.index), zcu) + ptr.byte_offset;
6631 continue :constant_key .{ .ptr = base_ptr };
6632 },
6633 else => unreachable,
6634 }
66206635 },
66216636 .comptime_alloc, .comptime_field, .arr_elem => unreachable,
66226637 };