bmi-builtins.c revision 435d2682893f5ebdaa652b567073ff223f5ada4f
119b4a714de8841aed2727031674597f7efb62ce2Craig Topper// RUN: %clang_cc1 %s -O3 -triple=x86_64-apple-darwin -target-feature +bmi -emit-llvm -o - | FileCheck %s
25c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper
35c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper// Don't include mm_malloc.h, it's system specific.
45c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper#define __MM_MALLOC_H
55c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper
65c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper#include <x86intrin.h>
75c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper
8435d2682893f5ebdaa652b567073ff223f5ada4fCraig Topperunsigned short test__tzcnt_u16(unsigned short __X) {
919b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: @llvm.cttz.i16
10435d2682893f5ebdaa652b567073ff223f5ada4fCraig Topper  return __tzcnt_u16(__X);
115c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper}
125c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper
130b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned int test__andn_u32(unsigned int __X, unsigned int __Y) {
1419b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = xor i32 %{{.*}}, -1
1519b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = and i32 %{{.*}}, [[DEST]]
160b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __andn_u32(__X, __Y);
170b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
180b269c1f3641511fb397488f8b82850416892fc9Craig Topper
190b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned int test__bextr_u32(unsigned int __X, unsigned int __Y) {
2019b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: @llvm.x86.bmi.bextr.32
210b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __bextr_u32(__X, __Y);
220b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
230b269c1f3641511fb397488f8b82850416892fc9Craig Topper
240b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned int test__blsi_u32(unsigned int __X) {
2519b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = sub i32 0, [[SRC:%.*]]
2619b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = and i32 [[SRC]], [[DEST]]
270b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __blsi_u32(__X);
280b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
290b269c1f3641511fb397488f8b82850416892fc9Craig Topper
300b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned int test__blsmsk_u32(unsigned int __X) {
3119b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = add i32 [[SRC:%.*]], -1
3219b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = xor i32 [[DEST]], [[SRC]]
330b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __blsmsk_u32(__X);
340b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
350b269c1f3641511fb397488f8b82850416892fc9Craig Topper
360b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned int test__blsr_u32(unsigned int __X) {
3719b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = add i32 [[SRC:%.*]], -1
3819b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = and i32 [[DEST]], [[SRC]]
390b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __blsr_u32(__X);
400b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
410b269c1f3641511fb397488f8b82850416892fc9Craig Topper
42435d2682893f5ebdaa652b567073ff223f5ada4fCraig Topperunsigned int test_tzcnt_u32(unsigned int __X) {
4319b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: @llvm.cttz.i32
44435d2682893f5ebdaa652b567073ff223f5ada4fCraig Topper  return __tzcnt_u32(__X);
455c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper}
465c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper
470b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) {
4819b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = xor i64 %{{.*}}, -1
4919b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = and i64 %{{.*}}, [[DEST]]
500b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __andn_u64(__X, __Y);
510b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
520b269c1f3641511fb397488f8b82850416892fc9Craig Topper
530b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned long long test__bextr_u64(unsigned long __X, unsigned long __Y) {
5419b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: @llvm.x86.bmi.bextr.64
550b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __bextr_u64(__X, __Y);
560b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
570b269c1f3641511fb397488f8b82850416892fc9Craig Topper
580b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned long long test__blsi_u64(unsigned long long __X) {
5919b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = sub i64 0, [[SRC:%.*]]
6019b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = and i64 [[SRC]], [[DEST]]
610b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __blsi_u64(__X);
620b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
630b269c1f3641511fb397488f8b82850416892fc9Craig Topper
640b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned long long test__blsmsk_u64(unsigned long long __X) {
6519b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = add i64 [[SRC:%.*]], -1
6619b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = xor i64 [[DEST]], [[SRC]]
670b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __blsmsk_u64(__X);
680b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
690b269c1f3641511fb397488f8b82850416892fc9Craig Topper
700b269c1f3641511fb397488f8b82850416892fc9Craig Topperunsigned long long test__blsr_u64(unsigned long long __X) {
7119b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: [[DEST:%.*]] = add i64 [[SRC:%.*]], -1
7219b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK-NEXT: %{{.*}} = and i64 [[DEST]], [[SRC]]
730b269c1f3641511fb397488f8b82850416892fc9Craig Topper  return __blsr_u64(__X);
740b269c1f3641511fb397488f8b82850416892fc9Craig Topper}
750b269c1f3641511fb397488f8b82850416892fc9Craig Topper
76435d2682893f5ebdaa652b567073ff223f5ada4fCraig Topperunsigned long long test__tzcnt_u64(unsigned long long __X) {
7719b4a714de8841aed2727031674597f7efb62ce2Craig Topper  // CHECK: @llvm.cttz.i64
78435d2682893f5ebdaa652b567073ff223f5ada4fCraig Topper  return __tzcnt_u64(__X);
795c75208a5b88c835bce0a1671015c7e22c72f35fCraig Topper}
80