Skip to content

Commit 26d104a

Browse files
committedAug 13, 2014
ARM: Prefetch intrinsics
llvm-svn: 215568
1 parent bb415ea commit 26d104a

File tree

5 files changed

+36
-0
lines changed

5 files changed

+36
-0
lines changed
 

‎clang/include/clang/Basic/BuiltinsARM.def

+3
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ BUILTIN(__builtin_arm_dmb, "vUi", "nc")
8080
BUILTIN(__builtin_arm_dsb, "vUi", "nc")
8181
BUILTIN(__builtin_arm_isb, "vUi", "nc")
8282

83+
// Prefetch
84+
BUILTIN(__builtin_arm_prefetch, "vvC*UiUi", "nc")
85+
8386
// MSVC
8487
LANGBUILTIN(__yield, "v", "", ALL_MS_LANGUAGES)
8588
LANGBUILTIN(__wfe, "v", "", ALL_MS_LANGUAGES)

‎clang/lib/CodeGen/CGBuiltin.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -3088,6 +3088,18 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
30883088
return Builder.CreateCall(F, llvm::ConstantInt::get(Int32Ty, HintID));
30893089
}
30903090

3091+
if (BuiltinID == ARM::BI__builtin_arm_prefetch) {
3092+
Value *Address = EmitScalarExpr(E->getArg(0));
3093+
Value *RW = EmitScalarExpr(E->getArg(1));
3094+
Value *IsData = EmitScalarExpr(E->getArg(2));
3095+
3096+
// Locality is not supported on ARM target
3097+
Value *Locality = llvm::ConstantInt::get(Int32Ty, 3);
3098+
3099+
Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
3100+
return Builder.CreateCall4(F, Address, RW, Locality, IsData);
3101+
}
3102+
30913103
if (BuiltinID == ARM::BI__builtin_arm_rbit) {
30923104
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::arm_rbit),
30933105
EmitScalarExpr(E->getArg(0)),

‎clang/lib/Sema/SemaChecking.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,11 @@ bool Sema::CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
624624
return CheckARMBuiltinExclusiveCall(BuiltinID, TheCall, 64);
625625
}
626626

627+
if (BuiltinID == ARM::BI__builtin_arm_prefetch) {
628+
return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1) ||
629+
SemaBuiltinConstantArgRange(TheCall, 2, 0, 1);
630+
}
631+
627632
if (CheckNeonBuiltinFunctionCall(BuiltinID, TheCall))
628633
return true;
629634

‎clang/test/CodeGen/builtins-arm.c

+11
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,14 @@ void test_barrier() {
6666
unsigned rbit(unsigned a) {
6767
return __builtin_arm_rbit(a);
6868
}
69+
70+
void prefetch(int i) {
71+
__builtin_arm_prefetch(&i, 0, 1);
72+
// CHECK: call {{.*}} @llvm.prefetch(i8* %0, i32 0, i32 3, i32 1)
73+
74+
__builtin_arm_prefetch(&i, 1, 1);
75+
// CHECK: call {{.*}} @llvm.prefetch(i8* %0, i32 1, i32 3, i32 1)
76+
77+
__builtin_arm_prefetch(&i, 1, 0);
78+
// CHECK: call {{.*}} @llvm.prefetch(i8* %0, i32 1, i32 3, i32 0)
79+
}

‎clang/test/Sema/builtins-arm.c

+5
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,9 @@ void test3() {
3737
__builtin_arm_isb(18); // expected-error {{argument should be a value from 0 to 15}}
3838
}
3939

40+
void test4() {
41+
__builtin_arm_prefetch(0, 2, 0); // expected-error {{argument should be a value from 0 to 1}}
42+
__builtin_arm_prefetch(0, 0, 2); // expected-error {{argument should be a value from 0 to 1}}
43+
}
44+
4045
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.