From 56b7cd4cadf893e3f8a4619af83f5f8e5154a933 Mon Sep 17 00:00:00 2001 From: Yi Kong Date: Wed, 13 Aug 2014 23:20:15 +0000 Subject: [PATCH] ARM: Add mappings for ACLE prefetch intrinsics Implement __pld, __pldx, __pli and __plix builtin intrinsics as specified in ARM ACLE 2.0. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215599 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Headers/arm_acle.h | 23 +++++++++++++++++++++++ test/CodeGen/arm_acle.c | 29 +++++++++++++++++++++++++++++ test/Sema/arm_acle.c | 7 +++++++ 3 files changed, 59 insertions(+) diff --git a/lib/Headers/arm_acle.h b/lib/Headers/arm_acle.h index a0fd6894ab..286bc20e12 100644 --- a/lib/Headers/arm_acle.h +++ b/lib/Headers/arm_acle.h @@ -66,6 +66,29 @@ static __inline__ void __attribute__((always_inline, nodebug)) __yield(void) { } #endif +/* 8.6 Memory prefetch intrinsics */ +/* 8.6.1 Data prefetch */ +#define __pld(addr) __pldx(0, 0, 0, addr) + +#if __ARM_32BIT_STATE +#define __pldx(access_kind, cache_level, retention_policy, addr) \ + __builtin_arm_prefetch(addr, access_kind, 1) +#else +#define __pldx(access_kind, cache_level, retention_policy, addr) \ + __builtin_arm_prefetch(addr, access_kind, cache_level, retention_policy, 1) +#endif + +/* 8.6.2 Instruction prefetch */ +#define __pli(addr) __plix(0, 0, addr) + +#if __ARM_32BIT_STATE +#define __plix(cache_level, retention_policy, addr) \ + __builtin_arm_prefetch(addr, 0, 0) +#else +#define __plix(cache_level, retention_policy, addr) \ + __builtin_arm_prefetch(addr, 0, cache_level, retention_policy, 0) +#endif + /* 8.7 NOP */ static __inline__ void __attribute__((always_inline, nodebug)) __nop(void) { __builtin_arm_nop(); diff --git a/test/CodeGen/arm_acle.c b/test/CodeGen/arm_acle.c index 8550c58b36..8a23df836e 100644 --- a/test/CodeGen/arm_acle.c +++ b/test/CodeGen/arm_acle.c @@ -62,6 +62,35 @@ void test_sevl(void) { __sevl(); } +/* 8.6 Memory prefetch intrinsics */ +/* 8.6.1 Data prefetch */ +// ARM-LABEL: test_pld +// ARM: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 1) +void test_pld() { + __pld(0); +} + +// ARM-LABEL: test_pldx +// AArch32: call void @llvm.prefetch(i8* null, i32 1, i32 3, i32 1) +// AArch64: call void @llvm.prefetch(i8* null, i32 1, i32 1, i32 1) +void test_pldx() { + __pldx(1, 2, 0, 0); +} + +/* 8.6.2 Instruction prefetch */ +// ARM-LABEL: test_pli +// ARM: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 0) +void test_pli() { + __pli(0); +} + +// ARM-LABEL: test_plix +// AArch32: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 0) +// AArch64: call void @llvm.prefetch(i8* null, i32 0, i32 1, i32 0) +void test_plix() { + __plix(2, 0, 0); +} + /* 8.7 NOP */ // ARM-LABEL: test_nop // AArch32: call void @llvm.arm.hint(i32 0) diff --git a/test/Sema/arm_acle.c b/test/Sema/arm_acle.c index 866626fc38..2d1d68a886 100644 --- a/test/Sema/arm_acle.c +++ b/test/Sema/arm_acle.c @@ -30,3 +30,10 @@ int32_t test_ssat_const_diag(int32_t t, const int32_t v) { int32_t test_usat_const_diag(int32_t t, const int32_t v) { return __usat(t, v); // expected-error-re {{argument to {{.*}} must be a constant integer}} } + +/* + * Prefetch intrinsics + */ +void test_pldx_const_diag(int32_t i) { + __pldx(i, 0, 0, 0); // expected-error-re {{argument to {{.*}} must be a constant integer}} +} -- 2.40.0