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