1*753f127fSDimitry Andric /*===---- rdpruintrin.h - RDPRU intrinsics ---------------------------------=== 2*753f127fSDimitry Andric * 3*753f127fSDimitry Andric * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*753f127fSDimitry Andric * See https://llvm.org/LICENSE.txt for license information. 5*753f127fSDimitry Andric * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*753f127fSDimitry Andric * 7*753f127fSDimitry Andric *===-----------------------------------------------------------------------=== 8*753f127fSDimitry Andric */ 9*753f127fSDimitry Andric 10*753f127fSDimitry Andric #if !defined __X86INTRIN_H 11*753f127fSDimitry Andric #error "Never use <rdpruintrin.h> directly; include <x86intrin.h> instead." 12*753f127fSDimitry Andric #endif 13*753f127fSDimitry Andric 14*753f127fSDimitry Andric #ifndef __RDPRUINTRIN_H 15*753f127fSDimitry Andric #define __RDPRUINTRIN_H 16*753f127fSDimitry Andric 17*753f127fSDimitry Andric /* Define the default attributes for the functions in this file. */ 18*753f127fSDimitry Andric #define __DEFAULT_FN_ATTRS \ 19*753f127fSDimitry Andric __attribute__((__always_inline__, __nodebug__, __target__("rdpru"))) 20*753f127fSDimitry Andric 21*753f127fSDimitry Andric 22*753f127fSDimitry Andric /// Reads the content of a processor register. 23*753f127fSDimitry Andric /// 24*753f127fSDimitry Andric /// \headerfile <x86intrin.h> 25*753f127fSDimitry Andric /// 26*753f127fSDimitry Andric /// This intrinsic corresponds to the <c> RDPRU </c> instruction. 27*753f127fSDimitry Andric /// 28*753f127fSDimitry Andric /// \param reg_id 29*753f127fSDimitry Andric /// A processor register identifier. 30*753f127fSDimitry Andric static __inline__ unsigned long long __DEFAULT_FN_ATTRS __rdpru(int reg_id)31*753f127fSDimitry Andric__rdpru (int reg_id) 32*753f127fSDimitry Andric { 33*753f127fSDimitry Andric return __builtin_ia32_rdpru(reg_id); 34*753f127fSDimitry Andric } 35*753f127fSDimitry Andric 36*753f127fSDimitry Andric #define __RDPRU_MPERF 0 37*753f127fSDimitry Andric #define __RDPRU_APERF 1 38*753f127fSDimitry Andric 39*753f127fSDimitry Andric /// Reads the content of processor register MPERF. 40*753f127fSDimitry Andric /// 41*753f127fSDimitry Andric /// \headerfile <x86intrin.h> 42*753f127fSDimitry Andric /// 43*753f127fSDimitry Andric /// This intrinsic generates instruction <c> RDPRU </c> to read the value of 44*753f127fSDimitry Andric /// register MPERF. 45*753f127fSDimitry Andric #define __mperf() __builtin_ia32_rdpru(__RDPRU_MPERF) 46*753f127fSDimitry Andric 47*753f127fSDimitry Andric /// Reads the content of processor register APERF. 48*753f127fSDimitry Andric /// 49*753f127fSDimitry Andric /// \headerfile <x86intrin.h> 50*753f127fSDimitry Andric /// 51*753f127fSDimitry Andric /// This intrinsic generates instruction <c> RDPRU </c> to read the value of 52*753f127fSDimitry Andric /// register APERF. 53*753f127fSDimitry Andric #define __aperf() __builtin_ia32_rdpru(__RDPRU_APERF) 54*753f127fSDimitry Andric 55*753f127fSDimitry Andric #undef __DEFAULT_FN_ATTRS 56*753f127fSDimitry Andric 57*753f127fSDimitry Andric #endif /* __RDPRUINTRIN_H */ 58