Skip to content

[X86][CFE] Support EGPR in GCCRegNames. #91323

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 8, 2024
Merged

Conversation

FreddyLeaf
Copy link
Contributor

No description provided.

@llvmbot llvmbot added clang Clang issues not falling into any other category backend:X86 clang:frontend Language frontend issues, e.g. anything involving "Sema" labels May 7, 2024
@FreddyLeaf FreddyLeaf requested review from phoebewang and KanRobert May 7, 2024 13:06
@llvmbot
Copy link
Member

llvmbot commented May 7, 2024

@llvm/pr-subscribers-backend-x86

Author: Freddy Ye (FreddyLeaf)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/91323.diff

2 Files Affected:

  • (modified) clang/lib/Basic/Targets/X86.cpp (+21)
  • (added) clang/test/CodeGen/X86/register_asm.c (+10)
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index bf1767c87fe1c..55c1bde31158e 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -66,6 +66,11 @@ static const char *const GCCRegNames[] = {
     "tmm0",  "tmm1",  "tmm2",  "tmm3",  "tmm4",    "tmm5",  "tmm6",  "tmm7",
 };
 
+static const char *const ExtendedGCCRegNames[] = {
+    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
+};
+
 const TargetInfo::AddlRegName AddlRegNames[] = {
     {{"al", "ah", "eax", "rax"}, 0},
     {{"bl", "bh", "ebx", "rbx"}, 3},
@@ -85,6 +90,16 @@ const TargetInfo::AddlRegName AddlRegNames[] = {
     {{"r15d", "r15w", "r15b"}, 45},
 };
 
+const TargetInfo::AddlRegName ExtendedAddlRegNames[] = {
+    {{"r16d", "r16w", "r16b"}, 165}, {{"r17d", "r17w", "r17b"}, 166},
+    {{"r18d", "r18w", "r18b"}, 167}, {{"r19d", "r19w", "r19b"}, 168},
+    {{"r20d", "r20w", "r20b"}, 169}, {{"r21d", "r21w", "r21b"}, 170},
+    {{"r22d", "r22w", "r22b"}, 171}, {{"r23d", "r23w", "r23b"}, 172},
+    {{"r24d", "r24w", "r24b"}, 173}, {{"r25d", "r25w", "r25b"}, 174},
+    {{"r26d", "r26w", "r26b"}, 175}, {{"r27d", "r27w", "r27b"}, 176},
+    {{"r28d", "r28w", "r28b"}, 177}, {{"r29d", "r29w", "r29b"}, 178},
+    {{"r30d", "r30w", "r30b"}, 179}, {{"r31d", "r31w", "r31b"}, 180},
+};
 } // namespace targets
 } // namespace clang
 
@@ -1763,10 +1778,16 @@ void X86TargetInfo::fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) con
 }
 
 ArrayRef<const char *> X86TargetInfo::getGCCRegNames() const {
+  if (HasEGPR)
+    GCCRegNames.insert(GCCRegNames.end(), ExtendedGCCRegNames.begin(),
+                       ExtendedGCCRegNames.end());
   return llvm::ArrayRef(GCCRegNames);
 }
 
 ArrayRef<TargetInfo::AddlRegName> X86TargetInfo::getGCCAddlRegNames() const {
+  if (HasEGPR)
+    AddlRegNames.insert(AddlRegNames.end(), ExtendedAddlRegNames.begin(),
+                        ExtendedAddlRegNames.end());
   return llvm::ArrayRef(AddlRegNames);
 }
 
diff --git a/clang/test/CodeGen/X86/register_asm.c b/clang/test/CodeGen/X86/register_asm.c
new file mode 100644
index 0000000000000..7986b392deed3
--- /dev/null
+++ b/clang/test/CodeGen/X86/register_asm.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -o /dev/null
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +egpr %s -o /dev/null
+
+int foo(void) {
+  register int a __asm__("ebx");
+#ifdef __EGPR__
+  register int b __asm__("r16");
+#endif // __EGPR__
+  return a;
+}

@llvmbot
Copy link
Member

llvmbot commented May 7, 2024

@llvm/pr-subscribers-clang

Author: Freddy Ye (FreddyLeaf)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/91323.diff

2 Files Affected:

  • (modified) clang/lib/Basic/Targets/X86.cpp (+21)
  • (added) clang/test/CodeGen/X86/register_asm.c (+10)
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index bf1767c87fe1c..55c1bde31158e 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -66,6 +66,11 @@ static const char *const GCCRegNames[] = {
     "tmm0",  "tmm1",  "tmm2",  "tmm3",  "tmm4",    "tmm5",  "tmm6",  "tmm7",
 };
 
+static const char *const ExtendedGCCRegNames[] = {
+    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
+};
+
 const TargetInfo::AddlRegName AddlRegNames[] = {
     {{"al", "ah", "eax", "rax"}, 0},
     {{"bl", "bh", "ebx", "rbx"}, 3},
@@ -85,6 +90,16 @@ const TargetInfo::AddlRegName AddlRegNames[] = {
     {{"r15d", "r15w", "r15b"}, 45},
 };
 
+const TargetInfo::AddlRegName ExtendedAddlRegNames[] = {
+    {{"r16d", "r16w", "r16b"}, 165}, {{"r17d", "r17w", "r17b"}, 166},
+    {{"r18d", "r18w", "r18b"}, 167}, {{"r19d", "r19w", "r19b"}, 168},
+    {{"r20d", "r20w", "r20b"}, 169}, {{"r21d", "r21w", "r21b"}, 170},
+    {{"r22d", "r22w", "r22b"}, 171}, {{"r23d", "r23w", "r23b"}, 172},
+    {{"r24d", "r24w", "r24b"}, 173}, {{"r25d", "r25w", "r25b"}, 174},
+    {{"r26d", "r26w", "r26b"}, 175}, {{"r27d", "r27w", "r27b"}, 176},
+    {{"r28d", "r28w", "r28b"}, 177}, {{"r29d", "r29w", "r29b"}, 178},
+    {{"r30d", "r30w", "r30b"}, 179}, {{"r31d", "r31w", "r31b"}, 180},
+};
 } // namespace targets
 } // namespace clang
 
@@ -1763,10 +1778,16 @@ void X86TargetInfo::fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) con
 }
 
 ArrayRef<const char *> X86TargetInfo::getGCCRegNames() const {
+  if (HasEGPR)
+    GCCRegNames.insert(GCCRegNames.end(), ExtendedGCCRegNames.begin(),
+                       ExtendedGCCRegNames.end());
   return llvm::ArrayRef(GCCRegNames);
 }
 
 ArrayRef<TargetInfo::AddlRegName> X86TargetInfo::getGCCAddlRegNames() const {
+  if (HasEGPR)
+    AddlRegNames.insert(AddlRegNames.end(), ExtendedAddlRegNames.begin(),
+                        ExtendedAddlRegNames.end());
   return llvm::ArrayRef(AddlRegNames);
 }
 
diff --git a/clang/test/CodeGen/X86/register_asm.c b/clang/test/CodeGen/X86/register_asm.c
new file mode 100644
index 0000000000000..7986b392deed3
--- /dev/null
+++ b/clang/test/CodeGen/X86/register_asm.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -o /dev/null
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -target-feature +egpr %s -o /dev/null
+
+int foo(void) {
+  register int a __asm__("ebx");
+#ifdef __EGPR__
+  register int b __asm__("r16");
+#endif // __EGPR__
+  return a;
+}

@FreddyLeaf FreddyLeaf requested a review from RKSimon May 7, 2024 13:07
@FreddyLeaf FreddyLeaf marked this pull request as draft May 7, 2024 13:13
Copy link

github-actions bot commented May 7, 2024

⚠️ C/C++ code formatter, clang-format found issues in your code. ⚠️

You can test this locally with the following command:
git-clang-format --diff 05f4448d40f00b9fb2447e1c32cd18a7a9b8b011 a627464ef0ed4e999dc52b6b2d445548b559fe8b -- clang/test/CodeGen/X86/inline-asm-gcc-regs.c clang/lib/Basic/Targets/X86.cpp
View the diff from clang-format here.
diff --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp
index 67e2126cf7..7cf53dee62 100644
--- a/clang/lib/Basic/Targets/X86.cpp
+++ b/clang/lib/Basic/Targets/X86.cpp
@@ -59,13 +59,12 @@ static const char *const GCCRegNames[] = {
     "zmm10", "zmm11", "zmm12", "zmm13", "zmm14",   "zmm15", "zmm16", "zmm17",
     "zmm18", "zmm19", "zmm20", "zmm21", "zmm22",   "zmm23", "zmm24", "zmm25",
     "zmm26", "zmm27", "zmm28", "zmm29", "zmm30",   "zmm31", "k0",    "k1",
-    "k2",    "k3",    "k4",    "k5",    "k6",      "k7",
-    "cr0",   "cr2",   "cr3",   "cr4",   "cr8",
-    "dr0",   "dr1",   "dr2",   "dr3",   "dr6",     "dr7",
-    "bnd0",  "bnd1",  "bnd2",  "bnd3",
-    "tmm0",  "tmm1",  "tmm2",  "tmm3",  "tmm4",    "tmm5",  "tmm6",  "tmm7",
-    "r16",   "r17",   "r18",   "r19",   "r20",     "r21",   "r22",   "r23",
-    "r24",   "r25",   "r26",   "r27",   "r28",     "r29",   "r30",   "r31",
+    "k2",    "k3",    "k4",    "k5",    "k6",      "k7",    "cr0",   "cr2",
+    "cr3",   "cr4",   "cr8",   "dr0",   "dr1",     "dr2",   "dr3",   "dr6",
+    "dr7",   "bnd0",  "bnd1",  "bnd2",  "bnd3",    "tmm0",  "tmm1",  "tmm2",
+    "tmm3",  "tmm4",  "tmm5",  "tmm6",  "tmm7",    "r16",   "r17",   "r18",
+    "r19",   "r20",   "r21",   "r22",   "r23",     "r24",   "r25",   "r26",
+    "r27",   "r28",   "r29",   "r30",   "r31",
 };
 
 const TargetInfo::AddlRegName AddlRegNames[] = {

@FreddyLeaf FreddyLeaf marked this pull request as ready for review May 7, 2024 13:28
@FreddyLeaf FreddyLeaf changed the title [X86][CFE] Support EGPR in inline assembly. [X86][CFE] Support EGPR in GCCRegNames. May 8, 2024
Copy link
Contributor

@KanRobert KanRobert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@FreddyLeaf FreddyLeaf merged commit e44600f into llvm:main May 8, 2024
2 of 4 checks passed
@FreddyLeaf FreddyLeaf deleted the egpr_cfe branch May 8, 2024 07:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:X86 clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants