1// RUN: %clang_cc1 -ffreestanding -triple armv8 -target-cpu cortex-a57 -O -S -emit-llvm -o - %s | FileCheck %s -check-prefix=ARM -check-prefix=AArch32
2// RUN: %clang_cc1 -ffreestanding -triple aarch64 -target-cpu cortex-a57 -O -S -emit-llvm -o - %s | FileCheck %s -check-prefix=ARM -check-prefix=AArch64
3
4#include <arm_acle.h>
5
6/* Miscellaneous data-processing intrinsics */
7// ARM-LABEL: test_rev
8// ARM: call i32 @llvm.bswap.i32(i32 %t)
9uint32_t test_rev(uint32_t t) {
10  return __rev(t);
11}
12
13// ARM-LABEL: test_revl
14// AArch32: call i32 @llvm.bswap.i32(i32 %t)
15// AArch64: call i64 @llvm.bswap.i64(i64 %t)
16long test_revl(long t) {
17  return __revl(t);
18}
19
20// ARM-LABEL: test_revll
21// ARM: call i64 @llvm.bswap.i64(i64 %t)
22uint64_t test_revll(uint64_t t) {
23  return __revll(t);
24}
25
26// ARM-LABEL: test_clz
27// ARM: call i32 @llvm.ctlz.i32(i32 %t, i1 false)
28uint32_t test_clz(uint32_t t) {
29  return __clz(t);
30}
31
32// ARM-LABEL: test_clzl
33// AArch32: call i32 @llvm.ctlz.i32(i32 %t, i1 false)
34// AArch64: call i64 @llvm.ctlz.i64(i64 %t, i1 false)
35long test_clzl(long t) {
36  return __clzl(t);
37}
38
39// ARM-LABEL: test_clzll
40// ARM: call i64 @llvm.ctlz.i64(i64 %t, i1 false)
41uint64_t test_clzll(uint64_t t) {
42  return __clzll(t);
43}
44
45/* Saturating intrinsics */
46#ifdef __ARM_32BIT_STATE
47// AArch32-LABEL: test_ssat
48// AArch32: call i32 @llvm.arm.ssat(i32 %t, i32 1)
49int32_t test_ssat(int32_t t) {
50  return __ssat(t, 1);
51}
52
53// AArch32-LABEL: test_usat
54// AArch32: call i32 @llvm.arm.usat(i32 %t, i32 2)
55int32_t test_usat(int32_t t) {
56  return __usat(t, 2);
57}
58// AArch32-LABEL: test_qadd
59// AArch32: call i32 @llvm.arm.qadd(i32 %a, i32 %b)
60int32_t test_qadd(int32_t a, int32_t b) {
61  return __qadd(a, b);
62}
63
64// AArch32-LABEL: test_qsub
65// AArch32: call i32 @llvm.arm.qsub(i32 %a, i32 %b)
66int32_t test_qsub(int32_t a, int32_t b) {
67  return __qsub(a, b);
68}
69
70extern int32_t f();
71// AArch32-LABEL: test_qdbl
72// AArch32: [[VAR:%[a-z0-9]+]] = {{.*}} call {{.*}} @f
73// AArch32-NOT: call {{.*}} @f
74// AArch32: call i32 @llvm.arm.qadd(i32 [[VAR]], i32 [[VAR]])
75int32_t test_qdbl() {
76  return __qdbl(f());
77}
78#endif
79
80/* CRC32 intrinsics */
81// ARM-LABEL: test_crc32b
82// AArch32: call i32 @llvm.arm.crc32b
83// AArch64: call i32 @llvm.aarch64.crc32b
84uint32_t test_crc32b(uint32_t a, uint8_t b) {
85  return __crc32b(a, b);
86}
87
88// ARM-LABEL: test_crc32h
89// AArch32: call i32 @llvm.arm.crc32h
90// AArch64: call i32 @llvm.aarch64.crc32h
91uint32_t test_crc32h(uint32_t a, uint16_t b) {
92  return __crc32h(a, b);
93}
94
95// ARM-LABEL: test_crc32w
96// AArch32: call i32 @llvm.arm.crc32w
97// AArch64: call i32 @llvm.aarch64.crc32w
98uint32_t test_crc32w(uint32_t a, uint32_t b) {
99  return __crc32w(a, b);
100}
101
102// ARM-LABEL: test_crc32d
103// AArch32: call i32 @llvm.arm.crc32w
104// AArch32: call i32 @llvm.arm.crc32w
105// AArch64: call i32 @llvm.aarch64.crc32x
106uint32_t test_crc32d(uint32_t a, uint64_t b) {
107  return __crc32d(a, b);
108}
109
110// ARM-LABEL: test_crc32cb
111// AArch32: call i32 @llvm.arm.crc32cb
112// AArch64: call i32 @llvm.aarch64.crc32cb
113uint32_t test_crc32cb(uint32_t a, uint8_t b) {
114  return __crc32cb(a, b);
115}
116
117// ARM-LABEL: test_crc32ch
118// AArch32: call i32 @llvm.arm.crc32ch
119// AArch64: call i32 @llvm.aarch64.crc32ch
120uint32_t test_crc32ch(uint32_t a, uint16_t b) {
121  return __crc32ch(a, b);
122}
123
124// ARM-LABEL: test_crc32cw
125// AArch32: call i32 @llvm.arm.crc32cw
126// AArch64: call i32 @llvm.aarch64.crc32cw
127uint32_t test_crc32cw(uint32_t a, uint32_t b) {
128  return __crc32cw(a, b);
129}
130
131// ARM-LABEL: test_crc32cd
132// AArch32: call i32 @llvm.arm.crc32cw
133// AArch32: call i32 @llvm.arm.crc32cw
134// AArch64: call i32 @llvm.aarch64.crc32cx
135uint32_t test_crc32cd(uint32_t a, uint64_t b) {
136  return __crc32cd(a, b);
137}
138