Skip to content

Commit 2caff8b

Browse files
authored
lcb: Defined multiple subreg index to allow aliases (#463)
* lcb: Defined multiple subreg index to allow aliases * lcb: Fixed sub register indices * chore: Make CheckStyle happy * lcb: Updated tests
1 parent 72cb7a7 commit 2caff8b

File tree

7 files changed

+126
-52
lines changed

7 files changed

+126
-52
lines changed

vadl/main/resources/templates/lcb/llvm/lib/Target/RegisterInfo.td

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
// SubRegIndexes for GPR registers
2-
def SUB_32 : SubRegIndex<32>;
3-
def SUB_32_HI : SubRegIndex<32, 32>;
4-
def FULL_64 : SubRegIndex<64>;
1+
[# th:each="index : ${sub32}" ]
2+
def [(${index})] : SubRegIndex<32>;
3+
[/]
4+
[# th:each="index : ${sub32Hi}" ]
5+
def [(${index})] : SubRegIndex<32, 32>;
6+
[/]
7+
[# th:each="index : ${full64}" ]
8+
def [(${index})] : SubRegIndex<64>;
9+
[/]
510

611
[# th:each="register, iterStat : ${aliasRegisters}" ]
712
def [(${register.name})] : Register<"[(${register.name})]">

vadl/main/vadl/gcb/passes/GenerateCompilerRegistersPass.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,11 @@ private void createSubRegisters(List<CompilerRegisterClass> aliasRegisterClasses
109109
var realRegister = registerClass.registers().get(i);
110110

111111
if (hasEqualType && artificialResource.type().equals(BitsType.bits(64))) {
112-
realRegister.addSubReg(aliasRegister, CompilerRegister.SubRegIndex.FULL_64);
112+
realRegister.addSubReg(aliasRegister, new CompilerRegister.SubRegIndex(
113+
CompilerRegister.SubRegIndexEnum.FULL_64));
113114
} else {
114-
realRegister.addSubReg(aliasRegister, CompilerRegister.SubRegIndex.SUB_32);
115+
realRegister.addSubReg(aliasRegister, new CompilerRegister.SubRegIndex(
116+
CompilerRegister.SubRegIndexEnum.SUB_32));
115117
}
116118
}
117119
}

vadl/main/vadl/gcb/valuetypes/CompilerRegister.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.List;
21+
import java.util.Objects;
2122

2223
/**
2324
* Extends the register with information which a compiler requires.
@@ -26,14 +27,14 @@ public abstract class CompilerRegister {
2627
/**
2728
* Indicates the indices for sub registers.
2829
*/
29-
public enum SubRegIndex {
30+
public enum SubRegIndexEnum {
3031
SUB_32("sub_32"),
3132
SUB_32_HI("sub_32_hi"),
3233
FULL_64("full_64");
3334

3435
private final String name;
3536

36-
SubRegIndex(String name) {
37+
SubRegIndexEnum(String name) {
3738
this.name = name;
3839
}
3940

@@ -42,6 +43,51 @@ public String getName() {
4243
}
4344
}
4445

46+
/**
47+
* Represents an index for a sub register.
48+
*/
49+
public static class SubRegIndex {
50+
private final SubRegIndexEnum subRegIndex;
51+
private int version = 0;
52+
53+
public SubRegIndex(SubRegIndexEnum subRegIndex) {
54+
this.subRegIndex = subRegIndex;
55+
}
56+
57+
public SubRegIndexEnum inner() {
58+
return subRegIndex;
59+
}
60+
61+
/**
62+
* Get the name of the register.
63+
*/
64+
public String name() {
65+
if (version == 0) {
66+
return subRegIndex.name();
67+
} else {
68+
return subRegIndex.name() + "_" + version;
69+
}
70+
}
71+
72+
public void incrementVersion() {
73+
version++;
74+
}
75+
76+
@Override
77+
public boolean equals(Object o) {
78+
if (o == null || getClass() != o.getClass()) {
79+
return false;
80+
}
81+
SubRegIndex that = (SubRegIndex) o;
82+
return version == that.version && subRegIndex == that.subRegIndex;
83+
}
84+
85+
@Override
86+
public int hashCode() {
87+
return Objects.hash(subRegIndex, version);
88+
}
89+
}
90+
4591
protected final String name;
4692
protected final String asmName;
4793
protected final List<String> altNames;

vadl/main/vadl/lcb/passes/llvmLowering/tablegen/model/register/TableGenRegister.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ public Map<String, Object> renderObj() {
5555
map.put("subRegs",
5656
subRegs.stream().map(CompilerRegister::name).collect(Collectors.joining(", ")));
5757
map.put("subRegIndices",
58-
subRegIndices.stream().map(Enum::name).collect(Collectors.joining(", ")));
58+
subRegIndices.stream().map(CompilerRegister.SubRegIndex::name)
59+
.collect(Collectors.joining(", ")));
5960
index.ifPresent(integer -> map.put("index", integer));
6061
return map;
6162
}

vadl/main/vadl/lcb/template/lib/Target/EmitRegisterInfoTableGenFilePass.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,35 @@ protected Map<String, Object> createVariables(final PassResults passResults,
130130
}
131131

132132
var registers = sortRegisters(output.registers());
133+
134+
var sub32 = new ArrayList<String>();
135+
var sub32Hi = new ArrayList<String>();
136+
var full64 = new ArrayList<String>();
137+
138+
for (var register : registers) {
139+
var seen = new HashSet<String>();
140+
for (var subRegIndex : register.subRegIndices()) {
141+
if (seen.contains(subRegIndex.name())) {
142+
subRegIndex.incrementVersion();
143+
}
144+
145+
var name = subRegIndex.name();
146+
seen.add(name);
147+
switch (subRegIndex.inner()) {
148+
case SUB_32 -> sub32.add(name);
149+
case FULL_64 -> full64.add(name);
150+
case SUB_32_HI -> sub32Hi.add(name);
151+
}
152+
}
153+
}
154+
133155
return Map.of(CommonVarNames.NAMESPACE,
134156
lcbConfiguration().targetName().value().toLowerCase(),
135157
"pointerAlignment", DataLayoutProvider.pointerAlignment(abi),
136158
"registers", registers,
159+
"sub32", sub32.stream().distinct().toList(),
160+
"sub32Hi", sub32Hi.stream().distinct().toList(),
161+
"full64", full64.stream().distinct().toList(),
137162
"aliasRegisters", output.aliasRegisters(),
138163
"registerFiles", outputRegisterClasses,
139164
"aliasRegisterFiles", outputAliasRegisterClasses

0 commit comments

Comments
 (0)