From 26d104a9ec2470ed0b35171e36ad4522f88837e1 Mon Sep 17 00:00:00 2001 From: Yi Kong Date: Wed, 13 Aug 2014 19:18:14 +0000 Subject: [PATCH] ARM: Prefetch intrinsics llvm-svn: 215568 --- clang/include/clang/Basic/BuiltinsARM.def | 3 +++ clang/lib/CodeGen/CGBuiltin.cpp | 12 ++++++++++++ clang/lib/Sema/SemaChecking.cpp | 5 +++++ clang/test/CodeGen/builtins-arm.c | 11 +++++++++++ clang/test/Sema/builtins-arm.c | 5 +++++ 5 files changed, 36 insertions(+) diff --git a/clang/include/clang/Basic/BuiltinsARM.def b/clang/include/clang/Basic/BuiltinsARM.def index 2e5eac694fc2..4c1400acf3f7 100644 --- a/clang/include/clang/Basic/BuiltinsARM.def +++ b/clang/include/clang/Basic/BuiltinsARM.def @@ -80,6 +80,9 @@ BUILTIN(__builtin_arm_dmb, "vUi", "nc") BUILTIN(__builtin_arm_dsb, "vUi", "nc") BUILTIN(__builtin_arm_isb, "vUi", "nc") +// Prefetch +BUILTIN(__builtin_arm_prefetch, "vvC*UiUi", "nc") + // MSVC LANGBUILTIN(__yield, "v", "", ALL_MS_LANGUAGES) LANGBUILTIN(__wfe, "v", "", ALL_MS_LANGUAGES) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 79f6925ba7a7..092c44f5c28e 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -3088,6 +3088,18 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID, return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID)); } + if (BuiltinID == ARM::BI__builtin_arm_prefetch) { + Value *Address = EmitScalarExpr(E->getArg(0)); + Value *RW = EmitScalarExpr(E->getArg(1)); + Value *IsData = EmitScalarExpr(E->getArg(2)); + + // Locality is not supported on ARM target + Value *Locality = llvm::ConstantInt::get(Int32Ty, 3); + + Value *F = CGM.getIntrinsic(Intrinsic::prefetch); + return Builder.CreateCall4(F, Address, RW, Locality, IsData); + } + if (BuiltinID == ARM::BI__builtin_arm_rbit) { return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_rbit), EmitScalarExpr(E->getArg(0)), diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 7bc3ba7febca..abda2d26649a 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -624,6 +624,11 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return CheckARMBuiltinExclusiveCall(BuiltinID, TheCall, 64); } + if (BuiltinID == ARM::BI__builtin_arm_prefetch) { + return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1) || + SemaBuiltinConstantArgRange(TheCall, 2, 0, 1); + } + if (CheckNeonBuiltinFunctionCall(BuiltinID, TheCall)) return true; diff --git a/clang/test/CodeGen/builtins-arm.c b/clang/test/CodeGen/builtins-arm.c index a51df15ce56b..686ae4e00934 100644 --- a/clang/test/CodeGen/builtins-arm.c +++ b/clang/test/CodeGen/builtins-arm.c @@ -66,3 +66,14 @@ void test_barrier() { unsigned rbit(unsigned a) { return __builtin_arm_rbit(a); } + +void prefetch(int i) { + __builtin_arm_prefetch(&i, 0, 1); +// CHECK: call {{.*}} @llvm.prefetch(i8* %0, i32 0, i32 3, i32 1) + + __builtin_arm_prefetch(&i, 1, 1); +// CHECK: call {{.*}} @llvm.prefetch(i8* %0, i32 1, i32 3, i32 1) + + __builtin_arm_prefetch(&i, 1, 0); +// CHECK: call {{.*}} @llvm.prefetch(i8* %0, i32 1, i32 3, i32 0) +} diff --git a/clang/test/Sema/builtins-arm.c b/clang/test/Sema/builtins-arm.c index 6c367d35a5f5..cc4af7d11df7 100644 --- a/clang/test/Sema/builtins-arm.c +++ b/clang/test/Sema/builtins-arm.c @@ -37,4 +37,9 @@ void test3() { __builtin_arm_isb(18); // expected-error {{argument should be a value from 0 to 15}} } +void test4() { + __builtin_arm_prefetch(0, 2, 0); // expected-error {{argument should be a value from 0 to 1}} + __builtin_arm_prefetch(0, 0, 2); // expected-error {{argument should be a value from 0 to 1}} +} + #endif