forked from OSchip/llvm-project
Port memory barriers intrinsics to AArch64
Memory barrier __builtin_arm_[dmb, dsb, isb] intrinsics are required to implement their corresponding ACLE and MSVC intrinsics. This patch ports ARM dmb, dsb, isb intrinsic to AArch64. Requires LLVM r213247. Differential Revision: http://reviews.llvm.org/D4521 llvm-svn: 213250
This commit is contained in:
parent
6dbcbac98b
commit
19a29ac0d0
|
@ -45,4 +45,9 @@ BUILTIN(__builtin_arm_crc32cw, "UiUiUi", "nc")
|
|||
BUILTIN(__builtin_arm_crc32d, "UiUiLUi", "nc")
|
||||
BUILTIN(__builtin_arm_crc32cd, "UiUiLUi", "nc")
|
||||
|
||||
// Memory barrier
|
||||
BUILTIN(__builtin_arm_dmb, "vUi", "nc")
|
||||
BUILTIN(__builtin_arm_dsb, "vUi", "nc")
|
||||
BUILTIN(__builtin_arm_isb, "vUi", "nc")
|
||||
|
||||
#undef BUILTIN
|
||||
|
|
|
@ -645,7 +645,18 @@ bool Sema::CheckAArch64BuiltinFunctionCall(unsigned BuiltinID,
|
|||
if (CheckNeonBuiltinFunctionCall(BuiltinID, TheCall))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
// For intrinsics which take an immediate value as part of the instruction,
|
||||
// range check them here.
|
||||
unsigned i = 0, l = 0, u = 0;
|
||||
switch (BuiltinID) {
|
||||
default: return false;
|
||||
case AArch64::BI__builtin_arm_dmb:
|
||||
case AArch64::BI__builtin_arm_dsb:
|
||||
case AArch64::BI__builtin_arm_isb: l = 0; u = 15; break;
|
||||
}
|
||||
|
||||
// FIXME: VFP Intrinsics should error if VFP not present.
|
||||
return SemaBuiltinConstantArgRange(TheCall, i, l, u + l);
|
||||
}
|
||||
|
||||
bool Sema::CheckMipsBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
|
||||
|
|
|
@ -23,3 +23,9 @@ void hints() {
|
|||
__builtin_arm_sev(); //CHECK: call {{.*}} @llvm.aarch64.hint(i32 4)
|
||||
__builtin_arm_sevl(); //CHECK: call {{.*}} @llvm.aarch64.hint(i32 5)
|
||||
}
|
||||
|
||||
void barriers() {
|
||||
__builtin_arm_dmb(1); //CHECK: call {{.*}} @llvm.aarch64.dmb(i32 1)
|
||||
__builtin_arm_dsb(2); //CHECK: call {{.*}} @llvm.aarch64.dsb(i32 2)
|
||||
__builtin_arm_isb(3); //CHECK: call {{.*}} @llvm.aarch64.isb(i32 3)
|
||||
}
|
||||
|
|
|
@ -16,3 +16,9 @@ void test_clear_cache_voids(void *start, void *end) {
|
|||
void test_clear_cache_no_args() {
|
||||
__clear_cache(); // expected-error {{too few arguments to function call}}
|
||||
}
|
||||
|
||||
void test_memory_barriers() {
|
||||
__builtin_arm_dmb(16); // expected-error {{argument should be a value from 0 to 15}}
|
||||
__builtin_arm_dsb(17); // expected-error {{argument should be a value from 0 to 15}}
|
||||
__builtin_arm_isb(18); // expected-error {{argument should be a value from 0 to 15}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue