arm_acle.c revision ef8225444452a1486bd721f3285301fe84643b00
1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// RUN: %clang_cc1 -ffreestanding -triple armv8 -target-cpu cortex-a57 -O -S -emit-llvm -o - %s | FileCheck %s -check-prefix=ARM -check-prefix=AArch32
2a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// RUN: %clang_cc1 -ffreestanding -triple aarch64 -target-cpu cortex-a57 -O -S -emit-llvm -o - %s | FileCheck %s -check-prefix=ARM -check-prefix=AArch64
3a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
4a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include <arm_acle.h>
5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
6a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch/* Miscellaneous data-processing intrinsics */
7a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_rev
8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM: call i32 @llvm.bswap.i32(i32 %t)
9a3f7b4e666c476898878fa745f637129375cd889Ben Murdochuint32_t test_rev(uint32_t t) {
10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __rev(t);
11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_revl
14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.bswap.i32(i32 %t)
15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch64: call i64 @llvm.bswap.i64(i64 %t)
16a3f7b4e666c476898878fa745f637129375cd889Ben Murdochlong test_revl(long t) {
17a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __revl(t);
18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_revll
21a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM: call i64 @llvm.bswap.i64(i64 %t)
22a3f7b4e666c476898878fa745f637129375cd889Ben Murdochuint64_t test_revll(uint64_t t) {
23a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __revll(t);
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
25a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_clz
27a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM: call i32 @llvm.ctlz.i32(i32 %t, i1 false)
28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochuint32_t test_clz(uint32_t t) {
29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return __clz(t);
30a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
31a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
32a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_clzl
33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.ctlz.i32(i32 %t, i1 false)
34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch64: call i64 @llvm.ctlz.i64(i64 %t, i1 false)
35a3f7b4e666c476898878fa745f637129375cd889Ben Murdochlong test_clzl(long t) {
36a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __clzl(t);
37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
38a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_clzll
40a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM: call i64 @llvm.ctlz.i64(i64 %t, i1 false)
41a3f7b4e666c476898878fa745f637129375cd889Ben Murdochuint64_t test_clzll(uint64_t t) {
42a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __clzll(t);
43a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
44a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
45a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch/* Saturating intrinsics */
46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#ifdef __ARM_32BIT_STATE
47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// AArch32-LABEL: test_ssat
48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.arm.ssat(i32 %t, i32 1)
49a3f7b4e666c476898878fa745f637129375cd889Ben Murdochint32_t test_ssat(int32_t t) {
50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __ssat(t, 1);
51a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
53a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32-LABEL: test_usat
54a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.arm.usat(i32 %t, i32 2)
55a3f7b4e666c476898878fa745f637129375cd889Ben Murdochint32_t test_usat(int32_t t) {
56a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __usat(t, 2);
57a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
58a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32-LABEL: test_qadd
59a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.arm.qadd(i32 %a, i32 %b)
60a3f7b4e666c476898878fa745f637129375cd889Ben Murdochint32_t test_qadd(int32_t a, int32_t b) {
61a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __qadd(a, b);
62a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
63a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
64a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32-LABEL: test_qsub
65a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.arm.qsub(i32 %a, i32 %b)
66a3f7b4e666c476898878fa745f637129375cd889Ben Murdochint32_t test_qsub(int32_t a, int32_t b) {
67a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __qsub(a, b);
68a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
69a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
70a3f7b4e666c476898878fa745f637129375cd889Ben Murdochextern int32_t f();
71a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32-LABEL: test_qdbl
72a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: [[VAR:%[a-z0-9]+]] = {{.*}} call {{.*}} @f
73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32-NOT: call {{.*}} @f
74a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.arm.qadd(i32 [[VAR]], i32 [[VAR]])
75a3f7b4e666c476898878fa745f637129375cd889Ben Murdochint32_t test_qdbl() {
76a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __qdbl(f());
77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#endif
79a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
80a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch/* CRC32 intrinsics */
81a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_crc32b
82a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.arm.crc32b
83a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch64: call i32 @llvm.aarch64.crc32b
84a3f7b4e666c476898878fa745f637129375cd889Ben Murdochuint32_t test_crc32b(uint32_t a, uint8_t b) {
85a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __crc32b(a, b);
86a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
87a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_crc32h
89a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch32: call i32 @llvm.arm.crc32h
90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// AArch64: call i32 @llvm.aarch64.crc32h
91a3f7b4e666c476898878fa745f637129375cd889Ben Murdochuint32_t test_crc32h(uint32_t a, uint16_t b) {
92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  return __crc32h(a, b);
93a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
94a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
95a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM-LABEL: test_crc32w
96a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// 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