| ... | @@ -913,36 +913,8 @@ pub const Value = struct { | ... | @@ -913,36 +913,8 @@ pub const Value = struct { |
| 913 | ); | 913 | ); |
| 914 | try vi_mat.finish(isel); | 914 | try vi_mat.finish(isel); |
| 915 | } else { | 915 | } else { |
| 916 | const unused_bytes = std.math.divCeil(u64, unused_bits, 8) catch unreachable; | 916 | try isel.failUnimplemented("unimplemented sign-extend width > GPR", .{}); |
| 917 | if (unused_bytes > isel.gprSize()) { | 917 | return; |
| 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 | } | | |
| 946 | } | 918 | } |
| 947 | } | 919 | } |
| 948 | | 920 | |