]> granicus.if.org Git - clang/commitdiff
[COFF, ARM64] Add __getReg intrinsic
authorMandeep Singh Grang <mgrang@codeaurora.org>
Thu, 4 Oct 2018 22:32:42 +0000 (22:32 +0000)
committerMandeep Singh Grang <mgrang@codeaurora.org>
Thu, 4 Oct 2018 22:32:42 +0000 (22:32 +0000)
Reviewers: rnk, mstorsjo, compnerd, TomTan, haripul, javed.absar, efriedma

Reviewed By: efriedma

Subscribers: peter.smith, efriedma, kristof.beyls, chrib, cfe-commits

Differential Revision: https://reviews.llvm.org/D52838

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343824 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/BuiltinsAArch64.def
lib/CodeGen/CGBuiltin.cpp
lib/Headers/intrin.h
lib/Sema/SemaChecking.cpp
test/CodeGen/arm64-microsoft-intrinsics.c
test/Sema/builtins-microsoft-arm64.c [new file with mode: 0644]

index 4c46f50a8dc62d13089e534af026a482b213d602..2b6fcdabdcce354731686a11fdfc4fa536fbbde2 100644 (file)
@@ -104,6 +104,7 @@ TARGET_HEADER_BUILTIN(_InterlockedOr64,          "LLiLLiD*LLi", "nh", "intrin.h"
 TARGET_HEADER_BUILTIN(_InterlockedXor64,         "LLiLLiD*LLi", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
 
 TARGET_HEADER_BUILTIN(_ReadWriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(__getReg, "ULLii", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
 
 #undef BUILTIN
 #undef LANGBUILTIN
index 49c2b126dd87b03907ea26ff9d14763def848dbf..b59fa379d84893c1a777a09aabbb090d9d12106c 100644 (file)
@@ -6576,6 +6576,23 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
     return Builder.CreateCall(F, {StoreVal, StoreAddr}, "stxr");
   }
 
+  if (BuiltinID == AArch64::BI__getReg) {
+    APSInt Value;
+    if (!E->getArg(0)->EvaluateAsInt(Value, CGM.getContext()))
+      llvm_unreachable("Sema will ensure that the parameter is constant");
+
+    LLVMContext &Context = CGM.getLLVMContext();
+    std::string Reg = Value == 31 ? "sp" : "x" + Value.toString(10);
+
+    llvm::Metadata *Ops[] = {llvm::MDString::get(Context, Reg)};
+    llvm::MDNode *RegName = llvm::MDNode::get(Context, Ops);
+    llvm::Value *Metadata = llvm::MetadataAsValue::get(Context, RegName);
+
+    llvm::Value *F =
+        CGM.getIntrinsic(llvm::Intrinsic::read_register, {Int64Ty});
+    return Builder.CreateCall(F, Metadata);
+  }
+
   if (BuiltinID == AArch64::BI__builtin_arm_clrex) {
     Function *F = CGM.getIntrinsic(Intrinsic::aarch64_clrex);
     return Builder.CreateCall(F);
index edb947eef659236b5dc49e1236bdb502a6182447..c5b4ff4d7d8510793135187c71b360776312662e 100644 (file)
@@ -864,6 +864,13 @@ __nop(void) {
 }
 #endif
 
+/*----------------------------------------------------------------------------*\
+|* MS AArch64 specific
+\*----------------------------------------------------------------------------*/
+#if defined(__aarch64__)
+unsigned __int64 __getReg(int);
+#endif
+
 /*----------------------------------------------------------------------------*\
 |* Privileged intrinsics
 \*----------------------------------------------------------------------------*/
index d6183dde95f13bb4901c371936ba69e4d46f0cef..113626374c44155f4bd3563b67865e1ceace8d8b 100644 (file)
@@ -1749,6 +1749,9 @@ bool Sema::CheckAArch64BuiltinFunctionCall(unsigned BuiltinID,
       BuiltinID == AArch64::BI__builtin_arm_wsrp)
     return SemaBuiltinARMSpecialReg(BuiltinID, TheCall, 0, 5, true);
 
+  if (BuiltinID == AArch64::BI__getReg)
+    return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31);
+
   if (CheckNeonBuiltinFunctionCall(BuiltinID, TheCall))
     return true;
 
index d29e9305ccd0b948a46222e97f84991b9f6a489c..89e6c369f4d34577644eed11573699a982968ca4 100644 (file)
@@ -66,3 +66,15 @@ void check_ReadWriteBarrier() {
 
 // CHECK-MSVC: fence syncscope("singlethread")
 // CHECK-LINUX: error: implicit declaration of function '_ReadWriteBarrier'
+
+unsigned __int64 check__getReg() {
+  unsigned volatile __int64 reg;
+  reg = __getReg(18);
+  reg = __getReg(31);
+  return reg;
+}
+
+// CHECK-MSVC: call i64 @llvm.read_register.i64(metadata !2)
+// CHECK-MSVC: call i64 @llvm.read_register.i64(metadata !3)
+// CHECK-MSVC: !2 = !{!"x18"}
+// CHECK-MSVC: !3 = !{!"sp"}
diff --git a/test/Sema/builtins-microsoft-arm64.c b/test/Sema/builtins-microsoft-arm64.c
new file mode 100644 (file)
index 0000000..34f9834
--- /dev/null
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -triple arm64-windows -fsyntax-only -verify \
+// RUN: -fms-compatibility -ffreestanding -fms-compatibility-version=17.00 %s
+
+#include <intrin.h>
+
+void check__getReg() {
+  __getReg(-1); // expected-error-re {{argument value {{.*}} is outside the valid range}}
+  __getReg(32); // expected-error-re {{argument value {{.*}} is outside the valid range}}
+}