Encodes an entry for a virtual register group.
(group: VirtRegGroup, stage: Stage, virt_regs: &VirtRegs)
| 71 | |
| 72 | /// Encodes an entry for a virtual register group. |
| 73 | fn encode_group(group: VirtRegGroup, stage: Stage, virt_regs: &VirtRegs) -> Self { |
| 74 | let stage = match stage { |
| 75 | Stage::Evict => 1, |
| 76 | Stage::Split => 0, |
| 77 | }; |
| 78 | let members = virt_regs.group_members(group); |
| 79 | let has_fixed_hint = members.iter().any(|&vreg| virt_regs[vreg].has_fixed_hint) as u64; |
| 80 | let group_size = members.len() as u64 - 1; |
| 81 | let size: u64 = members |
| 82 | .iter() |
| 83 | .map(|&vreg| ValueSegment::live_insts(virt_regs.segments(vreg)) as u64) |
| 84 | .sum(); |
| 85 | let size = size.min((1 << 27) - 1); |
| 86 | let index = group.index() as u64; |
| 87 | Entry { |
| 88 | bits: (stage << 63) |
| 89 | | (has_fixed_hint << 62) |
| 90 | | (group_size << 59) |
| 91 | | (size << 32) |
| 92 | | index, |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | /// Decodes an entry. |
| 97 | fn decode(self) -> (VirtRegOrGroup, Stage) { |