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
__llwpcb(void * __addr)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
__slwpcb(void)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