Skip to content

Commit 4f0b5d5

Browse files
authored
[M68k] Change gcc register name from a7 to sp. (llvm#87095)
In M68kRegisterInfo.td, register SP is defined with name sp and alternate name a7. Fixes: llvm#78620
1 parent 153b843 commit 4f0b5d5

File tree

3 files changed

+143
-3
lines changed

3 files changed

+143
-3
lines changed

clang/lib/Basic/Targets/M68k.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,21 @@ bool M68kTargetInfo::hasFeature(StringRef Feature) const {
127127

128128
const char *const M68kTargetInfo::GCCRegNames[] = {
129129
"d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
130-
"a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
130+
"a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
131131
"pc"};
132132

133133
ArrayRef<const char *> M68kTargetInfo::getGCCRegNames() const {
134134
return llvm::ArrayRef(GCCRegNames);
135135
}
136136

137+
const TargetInfo::GCCRegAlias M68kTargetInfo::GCCRegAliases[] = {
138+
{{"bp"}, "a5"},
139+
{{"fp"}, "a6"},
140+
{{"usp", "ssp", "isp", "a7"}, "sp"},
141+
};
142+
137143
ArrayRef<TargetInfo::GCCRegAlias> M68kTargetInfo::getGCCRegAliases() const {
138-
// No aliases.
139-
return std::nullopt;
144+
return llvm::ArrayRef(GCCRegAliases);
140145
}
141146

142147
bool M68kTargetInfo::validateAsmConstraint(

clang/lib/Basic/Targets/M68k.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace targets {
2525

2626
class LLVM_LIBRARY_VISIBILITY M68kTargetInfo : public TargetInfo {
2727
static const char *const GCCRegNames[];
28+
static const TargetInfo::GCCRegAlias GCCRegAliases[];
2829

2930
enum CPUKind {
3031
CK_Unknown,
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
// RUN: %clang_cc1 -triple m68k -emit-llvm -O2 %s -o - | FileCheck %s
2+
3+
/// Check GCC register names and alias can be used in register variable definition.
4+
5+
// CHECK-LABEL: @test_d0
6+
// CHECK: call void asm sideeffect "", "{d0}"(i32 undef)
7+
void test_d0() {
8+
register int a asm ("d0");
9+
asm ("" :: "r" (a));
10+
}
11+
12+
// CHECK-LABEL: @test_d1
13+
// CHECK: call void asm sideeffect "", "{d1}"(i32 undef)
14+
void test_d1() {
15+
register int a asm ("d1");
16+
asm ("" :: "r" (a));
17+
}
18+
19+
// CHECK-LABEL: @test_d2
20+
// CHECK: call void asm sideeffect "", "{d2}"(i32 undef)
21+
void test_d2() {
22+
register int a asm ("d2");
23+
asm ("" :: "r" (a));
24+
}
25+
26+
// CHECK-LABEL: @test_d3
27+
// CHECK: call void asm sideeffect "", "{d3}"(i32 undef)
28+
void test_d3() {
29+
register int a asm ("d3");
30+
asm ("" :: "r" (a));
31+
}
32+
33+
// CHECK-LABEL: @test_d4
34+
// CHECK: call void asm sideeffect "", "{d4}"(i32 undef)
35+
void test_d4() {
36+
register int a asm ("d4");
37+
asm ("" :: "r" (a));
38+
}
39+
40+
// CHECK-LABEL: @test_d5
41+
// CHECK: call void asm sideeffect "", "{d5}"(i32 undef)
42+
void test_d5() {
43+
register int a asm ("d5");
44+
asm ("" :: "r" (a));
45+
}
46+
47+
// CHECK-LABEL: @test_d6
48+
// CHECK: call void asm sideeffect "", "{d6}"(i32 undef)
49+
void test_d6() {
50+
register int a asm ("d6");
51+
asm ("" :: "r" (a));
52+
}
53+
54+
// CHECK-LABEL: @test_d7
55+
// CHECK: call void asm sideeffect "", "{d7}"(i32 undef)
56+
void test_d7() {
57+
register int a asm ("d7");
58+
asm ("" :: "r" (a));
59+
}
60+
61+
// CHECK-LABEL: @test_a0
62+
// CHECK: call void asm sideeffect "", "{a0}"(i32 undef)
63+
void test_a0() {
64+
register int a asm ("a0");
65+
asm ("" :: "r" (a));
66+
}
67+
68+
// CHECK-LABEL: @test_a1
69+
// CHECK: call void asm sideeffect "", "{a1}"(i32 undef)
70+
void test_a1() {
71+
register int a asm ("a1");
72+
asm ("" :: "r" (a));
73+
}
74+
75+
// CHECK-LABEL: @test_a2
76+
// CHECK: call void asm sideeffect "", "{a2}"(i32 undef)
77+
void test_a2() {
78+
register int a asm ("a2");
79+
asm ("" :: "r" (a));
80+
}
81+
82+
// CHECK-LABEL: @test_a3
83+
// CHECK: call void asm sideeffect "", "{a3}"(i32 undef)
84+
void test_a3() {
85+
register int a asm ("a3");
86+
asm ("" :: "r" (a));
87+
}
88+
89+
// CHECK-LABEL: @test_a4
90+
// CHECK: call void asm sideeffect "", "{a4}"(i32 undef)
91+
void test_a4() {
92+
register int a asm ("a4");
93+
asm ("" :: "r" (a));
94+
}
95+
96+
// CHECK-LABEL: @test_a5
97+
// CHECK: call void asm sideeffect "", "{a5}"(i32 undef)
98+
void test_a5() {
99+
register int a asm ("a5");
100+
register int b asm ("bp");
101+
asm ("" :: "r" (a));
102+
asm ("" :: "r" (b));
103+
}
104+
105+
// CHECK-LABEL: @test_a6
106+
// CHECK: call void asm sideeffect "", "{a6}"(i32 undef)
107+
void test_a6() {
108+
register int a asm ("a6");
109+
register int b asm ("fp");
110+
asm ("" :: "r" (a));
111+
asm ("" :: "r" (b));
112+
}
113+
114+
// CHECK-LABEL: @test_sp
115+
// CHECK: call void asm sideeffect "", "{sp}"(i32 undef)
116+
void test_sp() {
117+
register int a asm ("sp");
118+
register int b asm ("usp");
119+
register int c asm ("ssp");
120+
register int d asm ("isp");
121+
register int e asm ("a7");
122+
asm ("" :: "r" (a));
123+
asm ("" :: "r" (b));
124+
asm ("" :: "r" (c));
125+
asm ("" :: "r" (d));
126+
asm ("" :: "r" (e));
127+
}
128+
129+
// CHECK-LABEL: @test_pc
130+
// CHECK: call void asm sideeffect "", "{pc}"(i32 undef)
131+
void test_pc() {
132+
register int a asm ("pc");
133+
asm ("" :: "r" (a));
134+
}

0 commit comments

Comments
 (0)