| ... | ... | @@ -913,36 +913,8 @@ pub const Value = struct { |
| 913 | 913 | ); |
| 914 | 914 | try vi_mat.finish(isel); |
| 915 | 915 | } else { |
| 916 | | const unused_bytes = std.math.divCeil(u64, unused_bits, 8) catch unreachable; |
| 917 | | if (unused_bytes > isel.gprSize()) { |
| 918 | | try isel.failUnimplemented("unimplemented sign-extend width > GPR", .{}); |
| 919 | | return; |
| 920 | | } |
| 921 | | const used_bytes = vi.size(isel) - unused_bytes; |
| 922 | | |
| 923 | | var hit = false; |
| 924 | | var walker = vi.walk(isel, .{}); |
| 925 | | while (walker.next()) |part_vi| { |
| 926 | | const part_offset = part_vi.offsetIn(isel, vi); |
| 927 | | const part_size = part_vi.size(isel); |
| 928 | | const part_end = part_offset + part_size; |
| 929 | | if (part_end <= used_bytes) continue; |
| 930 | | if (part_size > isel.gprSize()) continue; |
| 931 | | |
| 932 | | walker.skipChildren(part_vi); |
| 933 | | |
| 934 | | const part_mat = try part_vi.mat(isel, .{ .pref = .only_reg }); |
| 935 | | try isel.fillUnusedBits( |
| 936 | | part_mat.reg(), |
| 937 | | part_mat.reg(), |
| 938 | | dst_ext, |
| 939 | | src_ext, |
| 940 | | @intCast(unused_bits - ((vi.size(isel) - part_end) * 8)), |
| 941 | | ); |
| 942 | | try part_mat.finish(isel); |
| 943 | | if (hit) unreachable; // TODO |
| 944 | | hit = true; |
| 945 | | } |
| 916 | try isel.failUnimplemented("unimplemented sign-extend width > GPR", .{}); |
| 917 | return; |
| 946 | 918 | } |
| 947 | 919 | } |
| 948 | 920 | |