diff --git a/lib/Headers/arm_acle.h b/lib/Headers/arm_acle.h index d706745ad592dc2855bed2554d5bee48af23800e..a7406fbf0a888076359fd5c3b97a82c20856ac6f 100644 --- a/lib/Headers/arm_acle.h +++ b/lib/Headers/arm_acle.h @@ -34,8 +34,8 @@ extern "C" { #endif -/* Miscellaneous data-processing intrinsics */ - +/* 9 DATA-PROCESSING INTRINSICS */ +/* 9.2 Miscellaneous data-processing intrinsics */ static __inline__ uint32_t __attribute__((always_inline, nodebug)) __clz(uint32_t t) { return __builtin_clz(t); @@ -74,17 +74,20 @@ static __inline__ uint64_t __attribute__((always_inline, nodebug)) return __builtin_bswap64(t); } - /* - * Saturating intrinsics + * 9.4 Saturating intrinsics * * FIXME: Change guard to their corrosponding __ARM_FEATURE flag when Q flag * intrinsics are implemented and the flag is enabled. */ +/* 9.4.1 Width-specified saturation intrinsics */ #if __ARM_32BIT_STATE #define __ssat(x, y) __builtin_arm_ssat(x, y) #define __usat(x, y) __builtin_arm_usat(x, y) +#endif +/* 9.4.2 Saturating addition and subtraction intrinsics */ +#if __ARM_32BIT_STATE static __inline__ int32_t __attribute__((always_inline, nodebug)) __qadd(int32_t t, int32_t v) { return __builtin_arm_qadd(t, v); @@ -101,7 +104,7 @@ __qdbl(int32_t t) { } #endif -/* CRC32 intrinsics */ +/* 9.7 CRC32 intrinsics */ #if __ARM_FEATURE_CRC32 static __inline__ uint32_t __attribute__((always_inline, nodebug)) __crc32b(uint32_t a, uint8_t b) { diff --git a/test/CodeGen/arm_acle.c b/test/CodeGen/arm_acle.c index 88d58a40b1f991f0abf8b8a589137e76979839c5..a2f24d3fbf4f78343ca1c6bc947dab291887be1e 100644 --- a/test/CodeGen/arm_acle.c +++ b/test/CodeGen/arm_acle.c @@ -3,7 +3,8 @@ #include <arm_acle.h> -/* Miscellaneous data-processing intrinsics */ +/* 9 DATA-PROCESSING INTRINSICS */ +/* 9.2 Miscellaneous data-processing intrinsics */ // ARM-LABEL: test_rev // ARM: call i32 @llvm.bswap.i32(i32 %t) uint32_t test_rev(uint32_t t) { @@ -42,8 +43,10 @@ uint64_t test_clzll(uint64_t t) { return __clzll(t); } -/* Saturating intrinsics */ +/* 9.4 Saturating intrinsics */ #ifdef __ARM_32BIT_STATE + +/* 9.4.1 Width-specified saturation intrinsics */ // AArch32-LABEL: test_ssat // AArch32: call i32 @llvm.arm.ssat(i32 %t, i32 1) int32_t test_ssat(int32_t t) { @@ -55,6 +58,8 @@ int32_t test_ssat(int32_t t) { int32_t test_usat(int32_t t) { return __usat(t, 2); } + +/* 9.4.2 Saturating addition and subtraction intrinsics */ // AArch32-LABEL: test_qadd // AArch32: call i32 @llvm.arm.qadd(i32 %a, i32 %b) int32_t test_qadd(int32_t a, int32_t b) { @@ -77,7 +82,7 @@ int32_t test_qdbl() { } #endif -/* CRC32 intrinsics */ +/* 9.7 CRC32 intrinsics */ // ARM-LABEL: test_crc32b // AArch32: call i32 @llvm.arm.crc32b // AArch64: call i32 @llvm.aarch64.crc32b