zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

lwpintrin.h (5115B) - Raw


      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 */