summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorSaleem Abdulrasool <compnerd@compnerd.org>2014-05-04 02:52:25 +0000
committerSaleem Abdulrasool <compnerd@compnerd.org>2014-05-04 02:52:25 +0000
commit956c2ec532ab716f05cf51e8a5634088a8d728f4 (patch)
tree010505e5f1a1cb9e4077057f90a5fb552a852fe7 /clang
parent6323a2d63c704aa26e6e10b48cbc6d55325a496a (diff)
downloadbcm5719-llvm-956c2ec532ab716f05cf51e8a5634088a8d728f4.tar.gz
bcm5719-llvm-956c2ec532ab716f05cf51e8a5634088a8d728f4.zip
CodeGen: complete ARM ACLE hint 8.4 support
Add support for the remaining hints from the ACLE. Although __dbg is listed as a hint, it is handled different, so it is not covered by this change. llvm-svn: 207930
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/BuiltinsARM.def3
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp25
-rw-r--r--clang/test/CodeGen/builtins-arm.c24
3 files changed, 47 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/BuiltinsARM.def b/clang/include/clang/Basic/BuiltinsARM.def
index 8ca93e735f6..9f650cc4154 100644
--- a/clang/include/clang/Basic/BuiltinsARM.def
+++ b/clang/include/clang/Basic/BuiltinsARM.def
@@ -60,6 +60,9 @@ BUILTIN(__builtin_arm_crc32cd, "UiUiLLUi", "nc")
// HINT
BUILTIN(__yield, "v", "")
+BUILTIN(__wfe, "v", "")
+BUILTIN(__wfi, "v", "")
+BUILTIN(__sev, "v", "")
BUILTIN(__sevl, "v", "")
// Data barrier
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 3800685cfef..824de8ccbb9 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4327,14 +4327,29 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
const CallExpr *E) {
- if (BuiltinID == ARM::BI__yield) {
- Function *F = CGM.getIntrinsic(Intrinsic::arm_hint);
- return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, 1));
+ unsigned HintID = static_cast<unsigned>(-1);
+ switch (BuiltinID) {
+ default: break;
+ case ARM::BI__yield:
+ HintID = 1;
+ break;
+ case ARM::BI__wfe:
+ HintID = 2;
+ break;
+ case ARM::BI__wfi:
+ HintID = 3;
+ break;
+ case ARM::BI__sev:
+ HintID = 4;
+ break;
+ case ARM::BI__sevl:
+ HintID = 5;
+ break;
}
- if (BuiltinID == ARM::BI__sevl) {
+ if (HintID != static_cast<unsigned>(-1)) {
Function *F = CGM.getIntrinsic(Intrinsic::arm_hint);
- return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, 5));
+ return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID));
}
if (BuiltinID == ARM::BI__clear_cache) {
diff --git a/clang/test/CodeGen/builtins-arm.c b/clang/test/CodeGen/builtins-arm.c
index fe04026545f..c5e487aafd6 100644
--- a/clang/test/CodeGen/builtins-arm.c
+++ b/clang/test/CodeGen/builtins-arm.c
@@ -19,6 +19,30 @@ void test_eh_return_data_regno()
res = __builtin_eh_return_data_regno(1); // CHECK: store volatile i32 1
}
+void yield() {
+ __yield();
+}
+
+// CHECK: call {{.*}} @llvm.arm.hint(i32 1)
+
+void wfe() {
+ __wfe();
+}
+
+// CHECK: call {{.*}} @llvm.arm.hint(i32 2)
+
+void wfi() {
+ __wfi();
+}
+
+// CHECK: call {{.*}} @llvm.arm.hint(i32 3)
+
+void sev() {
+ __sev();
+}
+
+// CHECK: call {{.*}} @llvm.arm.hint(i32 4)
+
void sevl() {
__sevl();
}
OpenPOWER on IntegriCloud