Writes the register definition to the given sink.
(&self, f: &mut impl fmt::Write)
| 98 | |
| 99 | /// Writes the register definition to the given sink. |
| 100 | pub fn emit(&self, f: &mut impl fmt::Write) -> Result<()> { |
| 101 | writeln!(f, "; Generated by regalloc3-tool, do not edit manually")?; |
| 102 | writeln!( |
| 103 | f, |
| 104 | "; Re-generate with: cargo run -p regalloc3-tool -- example-reginfo -f {} {}", |
| 105 | self.num_fixed_stack, self.arch, |
| 106 | )?; |
| 107 | |
| 108 | writeln!(f)?; |
| 109 | for (reg, regdata) in self.regs.iter() { |
| 110 | let location = if regdata.is_stack { "stack" } else { "reg" }; |
| 111 | if regdata.units.is_empty() { |
| 112 | writeln!(f, "{reg} = {location} nonallocatable ; {}", regdata.name,)?; |
| 113 | } else { |
| 114 | writeln!( |
| 115 | f, |
| 116 | "{reg} = {location} {} ; {}", |
| 117 | DisplayIter(regdata.units.iter()), |
| 118 | regdata.name, |
| 119 | )?; |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | writeln!(f)?; |
| 124 | for (group, groupdata) in self.groups.iter() { |
| 125 | writeln!( |
| 126 | f, |
| 127 | "{group} = {} ; ({})", |
| 128 | DisplayIter(groupdata.regs.iter()), |
| 129 | DisplayIter(groupdata.regs.iter().map(|&r| &self.regs[r].name)), |
| 130 | )?; |
| 131 | } |
| 132 | |
| 133 | for (bank, bankdata) in self.banks.iter() { |
| 134 | writeln!(f)?; |
| 135 | writeln!(f, "; {}", bankdata.desc)?; |
| 136 | writeln!(f, "{bank} {{")?; |
| 137 | writeln!(f, " top_level_class = {}", bankdata.top_level_class)?; |
| 138 | writeln!( |
| 139 | f, |
| 140 | " stack_to_stack_class = {}", |
| 141 | bankdata.stack_to_stack_class |
| 142 | )?; |
| 143 | writeln!(f, " spillslot_size = {}", bankdata.spillslot_size)?; |
| 144 | |
| 145 | for &class in &bankdata.classes { |
| 146 | let classdata = &self.classes[class]; |
| 147 | writeln!(f)?; |
| 148 | writeln!(f, " ; {}", classdata.desc)?; |
| 149 | if let Some(superclass) = classdata.superclass { |
| 150 | writeln!(f, " {class}: {superclass} {{")?; |
| 151 | } else { |
| 152 | writeln!(f, " {class} {{")?; |
| 153 | } |
| 154 | if classdata.group_size != 1 { |
| 155 | writeln!(f, " group_size = {}", classdata.group_size)?; |
| 156 | } |
| 157 | if classdata.allows_spillslots { |