master
  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.
 31static __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.
 46static __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 */