(root)/
gcc-13.2.0/
gcc/
config/
rs6000/
htmxlintrin.h
       1  /* XL compiler Hardware Transactional Memory (HTM) execution intrinsics.
       2     Copyright (C) 2013-2023 Free Software Foundation, Inc.
       3     Contributed by Peter Bergner <bergner@vnet.ibm.com>.
       4  
       5     This file is free software; you can redistribute it and/or modify it under
       6     the terms of the GNU General Public License as published by the Free
       7     Software Foundation; either version 3 of the License, or (at your option)
       8     any later version.
       9  
      10     This file is distributed in the hope that it will be useful, but WITHOUT
      11     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      12     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      13     for more details.
      14  
      15     Under Section 7 of GPL version 3, you are granted additional
      16     permissions described in the GCC Runtime Library Exception, version
      17     3.1, as published by the Free Software Foundation.
      18  
      19     You should have received a copy of the GNU General Public License and
      20     a copy of the GCC Runtime Library Exception along with this program;
      21     see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
      22     <http://www.gnu.org/licenses/>.  */
      23  
      24  #ifndef __HTM__
      25  # error "HTM instruction set not enabled"
      26  #endif /* __HTM__ */
      27  
      28  #ifndef _HTMXLINTRIN_H
      29  #define _HTMXLINTRIN_H
      30  
      31  #include <stdint.h>
      32  #include <htmintrin.h>
      33  
      34  #ifdef __cplusplus
      35  extern "C" {
      36  #endif
      37  
      38  #define _TEXASR_PTR(TM_BUF) \
      39    ((texasr_t *)((TM_BUF)+0))
      40  #define _TEXASRU_PTR(TM_BUF) \
      41    ((texasru_t *)((TM_BUF)+0))
      42  #define _TEXASRL_PTR(TM_BUF) \
      43    ((texasrl_t *)((TM_BUF)+4))
      44  #define _TFIAR_PTR(TM_BUF) \
      45    ((tfiar_t *)((TM_BUF)+8))
      46  
      47  typedef char TM_buff_type[16];
      48  
      49  /* Compatibility macro with s390.  This macro can be used to determine
      50     whether a transaction was successfully started from the __TM_begin()
      51     and __TM_simple_begin() intrinsic functions below.  */
      52  #define _HTM_TBEGIN_STARTED     1
      53  
      54  extern __inline long
      55  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
      56  __TM_simple_begin (void)
      57  {
      58    if (__builtin_expect (__builtin_tbegin (0), 1))
      59      return _HTM_TBEGIN_STARTED;
      60    return 0;
      61  }
      62  
      63  extern __inline long
      64  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
      65  __TM_begin (void* const TM_buff)
      66  {
      67    *_TEXASRL_PTR (TM_buff) = 0;
      68    if (__builtin_expect (__builtin_tbegin (0), 1))
      69      return _HTM_TBEGIN_STARTED;
      70  #ifdef __powerpc64__
      71    *_TEXASR_PTR (TM_buff) = __builtin_get_texasr ();
      72  #else
      73    *_TEXASRU_PTR (TM_buff) = __builtin_get_texasru ();
      74    *_TEXASRL_PTR (TM_buff) = __builtin_get_texasr ();
      75  #endif
      76    *_TFIAR_PTR (TM_buff) = __builtin_get_tfiar ();
      77    return 0;
      78  }
      79  
      80  extern __inline long
      81  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
      82  __TM_end (void)
      83  {
      84    unsigned char status = _HTM_STATE (__builtin_tend (0));
      85    if (__builtin_expect (status, _HTM_TRANSACTIONAL))
      86      return 1;
      87    return 0;
      88  }
      89  
      90  extern __inline void
      91  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
      92  __TM_abort (void)
      93  {
      94    __builtin_tabort (0);
      95  }
      96  
      97  extern __inline void
      98  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
      99  __TM_named_abort (unsigned char const code)
     100  {
     101    __builtin_tabort (code);
     102  }
     103  
     104  extern __inline void
     105  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     106  __TM_resume (void)
     107  {
     108    __builtin_tresume ();
     109  }
     110  
     111  extern __inline void
     112  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     113  __TM_suspend (void)
     114  {
     115    __builtin_tsuspend ();
     116  }
     117  
     118  extern __inline long
     119  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     120  __TM_is_user_abort (void* const TM_buff)
     121  {
     122    texasru_t texasru = *_TEXASRU_PTR (TM_buff);
     123    return _TEXASRU_ABORT (texasru);
     124  }
     125  
     126  extern __inline long
     127  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     128  __TM_is_named_user_abort (void* const TM_buff, unsigned char *code)
     129  {
     130    texasru_t texasru = *_TEXASRU_PTR (TM_buff);
     131  
     132    *code = _TEXASRU_FAILURE_CODE (texasru);
     133    return _TEXASRU_ABORT (texasru);
     134  }
     135  
     136  extern __inline long
     137  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     138  __TM_is_illegal (void* const TM_buff)
     139  {
     140    texasru_t texasru = *_TEXASRU_PTR (TM_buff);
     141    return _TEXASRU_DISALLOWED (texasru);
     142  }
     143  
     144  extern __inline long
     145  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     146  __TM_is_footprint_exceeded (void* const TM_buff)
     147  {
     148    texasru_t texasru = *_TEXASRU_PTR (TM_buff);
     149    return _TEXASRU_FOOTPRINT_OVERFLOW (texasru);
     150  }
     151  
     152  extern __inline long
     153  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     154  __TM_nesting_depth (void* const TM_buff)
     155  {
     156    texasrl_t texasrl;
     157  
     158    if (_HTM_STATE (__builtin_ttest ()) == _HTM_NONTRANSACTIONAL)
     159      {
     160        texasrl = *_TEXASRL_PTR (TM_buff);
     161        if (!_TEXASR_FAILURE_SUMMARY (texasrl))
     162          texasrl = 0;
     163      }
     164    else
     165      texasrl = (texasrl_t) __builtin_get_texasr ();
     166  
     167    return _TEXASR_TRANSACTION_LEVEL (texasrl);
     168  }
     169  
     170  extern __inline long
     171  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     172  __TM_is_nested_too_deep(void* const TM_buff)
     173  {
     174    texasru_t texasru = *_TEXASRU_PTR (TM_buff);
     175    return _TEXASRU_NESTING_OVERFLOW (texasru);
     176  }
     177  
     178  extern __inline long
     179  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     180  __TM_is_conflict(void* const TM_buff)
     181  {
     182    texasru_t texasru = *_TEXASRU_PTR (TM_buff);
     183    /* Return TEXASR bits 11 (Self-Induced Conflict) through
     184       14 (Translation Invalidation Conflict).  */
     185    return (_TEXASRU_EXTRACT_BITS (texasru, 14, 4)) ? 1 : 0;
     186  }
     187  
     188  extern __inline long
     189  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     190  __TM_is_failure_persistent(void* const TM_buff)
     191  {
     192    texasru_t texasru = *_TEXASRU_PTR (TM_buff);
     193    return _TEXASRU_FAILURE_PERSISTENT (texasru);
     194  }
     195  
     196  extern __inline long
     197  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     198  __TM_failure_address(void* const TM_buff)
     199  {
     200    return *_TFIAR_PTR (TM_buff);
     201  }
     202  
     203  extern __inline long long
     204  __attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
     205  __TM_failure_code(void* const TM_buff)
     206  {
     207    return *_TEXASR_PTR (TM_buff);
     208  }
     209  
     210  #ifdef __cplusplus
     211  }
     212  #endif
     213  
     214  #endif /* _HTMXLINTRIN_H */