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