1 /*===---- lwpintrin.h - LWP intrinsics -------------------------------------=== 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===-----------------------------------------------------------------------=== 8 */ 9 10 #ifndef __X86INTRIN_H 11 #error "Never use <lwpintrin.h> directly; include <x86intrin.h> instead." 12 #endif 13 14 #ifndef __LWPINTRIN_H 15 #define __LWPINTRIN_H 16 17 /* Define the default attributes for the functions in this file. */ 18 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("lwp"))) 19 20 /// Parses the LWPCB at the specified address and enables 21 /// profiling if valid. 22 /// 23 /// \headerfile <x86intrin.h> 24 /// 25 /// This intrinsic corresponds to the <c> LLWPCB </c> instruction. 26 /// 27 /// \param __addr 28 /// Address to the new Lightweight Profiling Control Block (LWPCB). If the 29 /// LWPCB is valid, writes the address into the LWP_CBADDR MSR and enables 30 /// Lightweight Profiling. 31 static __inline__ void __DEFAULT_FN_ATTRS 32 __llwpcb (void *__addr) 33 { 34 __builtin_ia32_llwpcb(__addr); 35 } 36 37 /// Flushes the LWP state to memory and returns the address of the LWPCB. 38 /// 39 /// \headerfile <x86intrin.h> 40 /// 41 /// This intrinsic corresponds to the <c> SLWPCB </c> instruction. 42 /// 43 /// \return 44 /// Address to the current Lightweight Profiling Control Block (LWPCB). 45 /// If LWP is not currently enabled, returns NULL. 46 static __inline__ void* __DEFAULT_FN_ATTRS 47 __slwpcb (void) 48 { 49 return __builtin_ia32_slwpcb(); 50 } 51 52 /// Inserts programmed event record into the LWP event ring buffer 53 /// and advances the ring buffer pointer. 54 /// 55 /// \headerfile <x86intrin.h> 56 /// 57 /// This intrinsic corresponds to the <c> LWPINS </c> instruction. 58 /// 59 /// \param DATA2 60 /// A 32-bit value is zero-extended and inserted into the 64-bit Data2 field. 61 /// \param DATA1 62 /// A 32-bit value is inserted into the 32-bit Data1 field. 63 /// \param FLAGS 64 /// A 32-bit immediate value is inserted into the 32-bit Flags field. 65 /// \returns If the ring buffer is full and LWP is running in Synchronized Mode, 66 /// the event record overwrites the last record in the buffer, the MissedEvents 67 /// counter in the LWPCB is incremented, the head pointer is not advanced, and 68 /// 1 is returned. Otherwise 0 is returned. 69 #define __lwpins32(DATA2, DATA1, FLAGS) \ 70 (__builtin_ia32_lwpins32((unsigned int) (DATA2), (unsigned int) (DATA1), \ 71 (unsigned int) (FLAGS))) 72 73 /// Decrements the LWP programmed value sample event counter. If the result is 74 /// negative, inserts an event record into the LWP event ring buffer in memory 75 /// and advances the ring buffer pointer. 76 /// 77 /// \headerfile <x86intrin.h> 78 /// 79 /// This intrinsic corresponds to the <c> LWPVAL </c> instruction. 80 /// 81 /// \param DATA2 82 /// A 32-bit value is zero-extended and inserted into the 64-bit Data2 field. 83 /// \param DATA1 84 /// A 32-bit value is inserted into the 32-bit Data1 field. 85 /// \param FLAGS 86 /// A 32-bit immediate value is inserted into the 32-bit Flags field. 87 #define __lwpval32(DATA2, DATA1, FLAGS) \ 88 (__builtin_ia32_lwpval32((unsigned int) (DATA2), (unsigned int) (DATA1), \ 89 (unsigned int) (FLAGS))) 90 91 #ifdef __x86_64__ 92 93 /// Inserts programmed event record into the LWP event ring buffer 94 /// and advances the ring buffer pointer. 95 /// 96 /// \headerfile <x86intrin.h> 97 /// 98 /// This intrinsic corresponds to the <c> LWPINS </c> instruction. 99 /// 100 /// \param DATA2 101 /// A 64-bit value is inserted into the 64-bit Data2 field. 102 /// \param DATA1 103 /// A 32-bit value is inserted into the 32-bit Data1 field. 104 /// \param FLAGS 105 /// A 32-bit immediate value is inserted into the 32-bit Flags field. 106 /// \returns If the ring buffer is full and LWP is running in Synchronized Mode, 107 /// the event record overwrites the last record in the buffer, the MissedEvents 108 /// counter in the LWPCB is incremented, the head pointer is not advanced, and 109 /// 1 is returned. Otherwise 0 is returned. 110 #define __lwpins64(DATA2, DATA1, FLAGS) \ 111 (__builtin_ia32_lwpins64((unsigned long long) (DATA2), (unsigned int) (DATA1), \ 112 (unsigned int) (FLAGS))) 113 114 /// Decrements the LWP programmed value sample event counter. If the result is 115 /// negative, inserts an event record into the LWP event ring buffer in memory 116 /// and advances the ring buffer pointer. 117 /// 118 /// \headerfile <x86intrin.h> 119 /// 120 /// This intrinsic corresponds to the <c> LWPVAL </c> instruction. 121 /// 122 /// \param DATA2 123 /// A 64-bit value is and inserted into the 64-bit Data2 field. 124 /// \param DATA1 125 /// A 32-bit value is inserted into the 32-bit Data1 field. 126 /// \param FLAGS 127 /// A 32-bit immediate value is inserted into the 32-bit Flags field. 128 #define __lwpval64(DATA2, DATA1, FLAGS) \ 129 (__builtin_ia32_lwpval64((unsigned long long) (DATA2), (unsigned int) (DATA1), \ 130 (unsigned int) (FLAGS))) 131 132 #endif 133 134 #undef __DEFAULT_FN_ATTRS 135 136 #endif /* __LWPINTRIN_H */ 137