|
19 | 19 | import java.io.IOException; |
20 | 20 | import java.util.ArrayList; |
21 | 21 | import java.util.HashSet; |
| 22 | +import java.util.List; |
22 | 23 | import java.util.Map; |
23 | 24 | import java.util.Optional; |
24 | 25 | import java.util.stream.Collectors; |
25 | 26 | import java.util.stream.IntStream; |
26 | 27 | import java.util.stream.Stream; |
27 | 28 | import vadl.configuration.LcbConfiguration; |
| 29 | +import vadl.gcb.valuetypes.CompilerRegister; |
28 | 30 | import vadl.lcb.passes.llvmLowering.GenerateTableGenRegistersPass; |
| 31 | +import vadl.lcb.passes.llvmLowering.tablegen.model.register.TableGenRegister; |
29 | 32 | import vadl.lcb.passes.llvmLowering.tablegen.model.register.TableGenRegisterClass; |
30 | 33 | import vadl.lcb.template.CommonVarNames; |
31 | 34 | import vadl.lcb.template.LcbTemplateRenderingPass; |
@@ -126,13 +129,31 @@ protected Map<String, Object> createVariables(final PassResults passResults, |
126 | 129 | outputAliasRegisterClasses.add(new WrappedRegisterFile(registerClass, allocationSeq)); |
127 | 130 | } |
128 | 131 |
|
| 132 | + var registers = sortRegisters(output.registers()); |
129 | 133 | return Map.of(CommonVarNames.NAMESPACE, |
130 | 134 | lcbConfiguration().targetName().value().toLowerCase(), |
131 | 135 | "pointerAlignment", DataLayoutProvider.pointerAlignment(abi), |
132 | | - "registers", output.registers(), |
| 136 | + "registers", registers, |
133 | 137 | "aliasRegisters", output.aliasRegisters(), |
134 | 138 | "registerFiles", outputRegisterClasses, |
135 | 139 | "aliasRegisterFiles", outputAliasRegisterClasses |
136 | 140 | ); |
137 | 141 | } |
| 142 | + |
| 143 | + private List<TableGenRegister> sortRegisters(List<TableGenRegister> registers) { |
| 144 | + var result = new ArrayList<TableGenRegister>(); |
| 145 | + var ready = new HashSet<CompilerRegister>(); |
| 146 | + |
| 147 | + while (result.size() != registers.size()) { |
| 148 | + for (var register : registers) { |
| 149 | + var allSubRegisters = ready.containsAll(register.subRegs()); |
| 150 | + if (allSubRegisters && !ready.contains(register.compilerRegister())) { |
| 151 | + ready.add(register.compilerRegister()); |
| 152 | + result.add(register); |
| 153 | + } |
| 154 | + } |
| 155 | + } |
| 156 | + |
| 157 | + return result; |
| 158 | + } |
138 | 159 | } |
0 commit comments