1*08e4fe6cSPaul Robinson // RUN: %clang_cc1 -ffreestanding %s -triple=i686-- -target-feature +rdpru -emit-llvm -o - -Wall -Werror | FileCheck %s 2*08e4fe6cSPaul Robinson // RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-- -target-feature +rdpru -emit-llvm -o - -Wall -Werror | FileCheck %s 3*08e4fe6cSPaul Robinson // RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-- -target-cpu znver2 -emit-llvm -o - -Wall -Werror | FileCheck %s 4*08e4fe6cSPaul Robinson 5*08e4fe6cSPaul Robinson #include <x86intrin.h> 6*08e4fe6cSPaul Robinson 7*08e4fe6cSPaul Robinson // NOTE: This should correspond to the tests in llvm/test/CodeGen/X86/rdpru.ll 8*08e4fe6cSPaul Robinson test_rdpru(int regid)9*08e4fe6cSPaul Robinsonunsigned long long test_rdpru(int regid) { 10*08e4fe6cSPaul Robinson // CHECK-LABEL: test_rdpru 11*08e4fe6cSPaul Robinson // CHECK: [[RESULT:%.*]] = call i64 @llvm.x86.rdpru(i32 %{{.*}}) 12*08e4fe6cSPaul Robinson // CHECK-NEXT: ret i64 [[RESULT]] 13*08e4fe6cSPaul Robinson return __rdpru(regid); 14*08e4fe6cSPaul Robinson } 15*08e4fe6cSPaul Robinson test_mperf()16*08e4fe6cSPaul Robinsonunsigned long long test_mperf() { 17*08e4fe6cSPaul Robinson // CHECK-LABEL: test_mperf 18*08e4fe6cSPaul Robinson // CHECK: [[RESULT:%.*]] = call i64 @llvm.x86.rdpru(i32 0) 19*08e4fe6cSPaul Robinson // CHECK-NEXT: ret i64 [[RESULT]] 20*08e4fe6cSPaul Robinson return __mperf(); 21*08e4fe6cSPaul Robinson } 22*08e4fe6cSPaul Robinson test_aperf()23*08e4fe6cSPaul Robinsonunsigned long long test_aperf() { 24*08e4fe6cSPaul Robinson // CHECK-LABEL: test_aperf 25*08e4fe6cSPaul Robinson // CHECK: [[RESULT:%.*]] = call i64 @llvm.x86.rdpru(i32 1) 26*08e4fe6cSPaul Robinson // CHECK-NEXT: ret i64 [[RESULT]] 27*08e4fe6cSPaul Robinson return __aperf(); 28*08e4fe6cSPaul Robinson } 29*08e4fe6cSPaul Robinson test_direct_calls_to_builtin_rdpru(int regid)30*08e4fe6cSPaul Robinsonvoid test_direct_calls_to_builtin_rdpru(int regid) { 31*08e4fe6cSPaul Robinson // CHECK: call i64 @llvm.x86.rdpru(i32 0) 32*08e4fe6cSPaul Robinson // CHECK: call i64 @llvm.x86.rdpru(i32 1) 33*08e4fe6cSPaul Robinson // CHECK: call i64 @llvm.x86.rdpru(i32 %{{.*}}) 34*08e4fe6cSPaul Robinson (void) __builtin_ia32_rdpru(0); 35*08e4fe6cSPaul Robinson (void) __builtin_ia32_rdpru(1); 36*08e4fe6cSPaul Robinson (void) __builtin_ia32_rdpru(regid); 37*08e4fe6cSPaul Robinson } 38