Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
/*===---- htmintrin.h - Standard header for PowerPC HTM ---------------===*\
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
#ifndef __HTMINTRIN_H
10
#define __HTMINTRIN_H
11
 
12
#ifndef __HTM__
13
#error "HTM instruction set not enabled"
14
#endif
15
 
16
#ifdef __powerpc__
17
 
18
#include <stdint.h>
19
 
20
typedef uint64_t texasr_t;
21
typedef uint32_t texasru_t;
22
typedef uint32_t texasrl_t;
23
typedef uintptr_t tfiar_t;
24
typedef uintptr_t tfhar_t;
25
 
26
#define _HTM_STATE(CR0) ((CR0 >> 1) & 0x3)
27
#define _HTM_NONTRANSACTIONAL 0x0
28
#define _HTM_SUSPENDED        0x1
29
#define _HTM_TRANSACTIONAL    0x2
30
 
31
#define _TEXASR_EXTRACT_BITS(TEXASR,BITNUM,SIZE) \
32
  (((TEXASR) >> (63-(BITNUM))) & ((1<<(SIZE))-1))
33
#define _TEXASRU_EXTRACT_BITS(TEXASR,BITNUM,SIZE) \
34
  (((TEXASR) >> (31-(BITNUM))) & ((1<<(SIZE))-1))
35
 
36
#define _TEXASR_FAILURE_CODE(TEXASR) \
37
  _TEXASR_EXTRACT_BITS(TEXASR, 7, 8)
38
#define _TEXASRU_FAILURE_CODE(TEXASRU) \
39
  _TEXASRU_EXTRACT_BITS(TEXASRU, 7, 8)
40
 
41
#define _TEXASR_FAILURE_PERSISTENT(TEXASR) \
42
  _TEXASR_EXTRACT_BITS(TEXASR, 7, 1)
43
#define _TEXASRU_FAILURE_PERSISTENT(TEXASRU) \
44
  _TEXASRU_EXTRACT_BITS(TEXASRU, 7, 1)
45
 
46
#define _TEXASR_DISALLOWED(TEXASR) \
47
  _TEXASR_EXTRACT_BITS(TEXASR, 8, 1)
48
#define _TEXASRU_DISALLOWED(TEXASRU) \
49
  _TEXASRU_EXTRACT_BITS(TEXASRU, 8, 1)
50
 
51
#define _TEXASR_NESTING_OVERFLOW(TEXASR) \
52
  _TEXASR_EXTRACT_BITS(TEXASR, 9, 1)
53
#define _TEXASRU_NESTING_OVERFLOW(TEXASRU) \
54
  _TEXASRU_EXTRACT_BITS(TEXASRU, 9, 1)
55
 
56
#define _TEXASR_FOOTPRINT_OVERFLOW(TEXASR) \
57
  _TEXASR_EXTRACT_BITS(TEXASR, 10, 1)
58
#define _TEXASRU_FOOTPRINT_OVERFLOW(TEXASRU) \
59
  _TEXASRU_EXTRACT_BITS(TEXASRU, 10, 1)
60
 
61
#define _TEXASR_SELF_INDUCED_CONFLICT(TEXASR) \
62
  _TEXASR_EXTRACT_BITS(TEXASR, 11, 1)
63
#define _TEXASRU_SELF_INDUCED_CONFLICT(TEXASRU) \
64
  _TEXASRU_EXTRACT_BITS(TEXASRU, 11, 1)
65
 
66
#define _TEXASR_NON_TRANSACTIONAL_CONFLICT(TEXASR) \
67
  _TEXASR_EXTRACT_BITS(TEXASR, 12, 1)
68
#define _TEXASRU_NON_TRANSACTIONAL_CONFLICT(TEXASRU) \
69
  _TEXASRU_EXTRACT_BITS(TEXASRU, 12, 1)
70
 
71
#define _TEXASR_TRANSACTION_CONFLICT(TEXASR) \
72
  _TEXASR_EXTRACT_BITS(TEXASR, 13, 1)
73
#define _TEXASRU_TRANSACTION_CONFLICT(TEXASRU) \
74
  _TEXASRU_EXTRACT_BITS(TEXASRU, 13, 1)
75
 
76
#define _TEXASR_TRANSLATION_INVALIDATION_CONFLICT(TEXASR) \
77
  _TEXASR_EXTRACT_BITS(TEXASR, 14, 1)
78
#define _TEXASRU_TRANSLATION_INVALIDATION_CONFLICT(TEXASRU) \
79
  _TEXASRU_EXTRACT_BITS(TEXASRU, 14, 1)
80
 
81
#define _TEXASR_IMPLEMENTAION_SPECIFIC(TEXASR) \
82
  _TEXASR_EXTRACT_BITS(TEXASR, 15, 1)
83
#define _TEXASRU_IMPLEMENTAION_SPECIFIC(TEXASRU) \
84
  _TEXASRU_EXTRACT_BITS(TEXASRU, 15, 1)
85
 
86
#define _TEXASR_INSTRUCTION_FETCH_CONFLICT(TEXASR) \
87
  _TEXASR_EXTRACT_BITS(TEXASR, 16, 1)
88
#define _TEXASRU_INSTRUCTION_FETCH_CONFLICT(TEXASRU) \
89
  _TEXASRU_EXTRACT_BITS(TEXASRU, 16, 1)
90
 
91
#define _TEXASR_ABORT(TEXASR) \
92
  _TEXASR_EXTRACT_BITS(TEXASR, 31, 1)
93
#define _TEXASRU_ABORT(TEXASRU) \
94
  _TEXASRU_EXTRACT_BITS(TEXASRU, 31, 1)
95
 
96
 
97
#define _TEXASR_SUSPENDED(TEXASR) \
98
  _TEXASR_EXTRACT_BITS(TEXASR, 32, 1)
99
 
100
#define _TEXASR_PRIVILEGE(TEXASR) \
101
  _TEXASR_EXTRACT_BITS(TEXASR, 35, 2)
102
 
103
#define _TEXASR_FAILURE_SUMMARY(TEXASR) \
104
  _TEXASR_EXTRACT_BITS(TEXASR, 36, 1)
105
 
106
#define _TEXASR_TFIAR_EXACT(TEXASR) \
107
  _TEXASR_EXTRACT_BITS(TEXASR, 37, 1)
108
 
109
#define _TEXASR_ROT(TEXASR) \
110
  _TEXASR_EXTRACT_BITS(TEXASR, 38, 1)
111
 
112
#define _TEXASR_TRANSACTION_LEVEL(TEXASR) \
113
  _TEXASR_EXTRACT_BITS(TEXASR, 63, 12)
114
 
115
#endif /* __powerpc */
116
 
117
#ifdef __s390__
118
 
119
/* Condition codes generated by tbegin  */
120
#define _HTM_TBEGIN_STARTED       0
121
#define _HTM_TBEGIN_INDETERMINATE 1
122
#define _HTM_TBEGIN_TRANSIENT     2
123
#define _HTM_TBEGIN_PERSISTENT    3
124
 
125
/* The abort codes below this threshold are reserved for machine use.  */
126
#define _HTM_FIRST_USER_ABORT_CODE 256
127
 
128
/* The transaction diagnostic block is it is defined in the Principles
129
   of Operation chapter 5-91.  */
130
 
131
struct __htm_tdb {
132
  unsigned char format;                /*   0 */
133
  unsigned char flags;
134
  unsigned char reserved1[4];
135
  unsigned short nesting_depth;
136
  unsigned long long abort_code;       /*   8 */
137
  unsigned long long conflict_token;   /*  16 */
138
  unsigned long long atia;             /*  24 */
139
  unsigned char eaid;                  /*  32 */
140
  unsigned char dxc;
141
  unsigned char reserved2[2];
142
  unsigned int program_int_id;
143
  unsigned long long exception_id;     /*  40 */
144
  unsigned long long bea;              /*  48 */
145
  unsigned char reserved3[72];         /*  56 */
146
  unsigned long long gprs[16];         /* 128 */
147
} __attribute__((__packed__, __aligned__ (8)));
148
 
149
 
150
/* Helper intrinsics to retry tbegin in case of transient failure.  */
151
 
152
static __inline int __attribute__((__always_inline__, __nodebug__))
153
__builtin_tbegin_retry_null (int __retry)
154
{
155
  int cc, i = 0;
156
 
157
  while ((cc = __builtin_tbegin(0)) == _HTM_TBEGIN_TRANSIENT
158
         && i++ < __retry)
159
    __builtin_tx_assist(i);
160
 
161
  return cc;
162
}
163
 
164
static __inline int __attribute__((__always_inline__, __nodebug__))
165
__builtin_tbegin_retry_tdb (void *__tdb, int __retry)
166
{
167
  int cc, i = 0;
168
 
169
  while ((cc = __builtin_tbegin(__tdb)) == _HTM_TBEGIN_TRANSIENT
170
         && i++ < __retry)
171
    __builtin_tx_assist(i);
172
 
173
  return cc;
174
}
175
 
176
#define __builtin_tbegin_retry(tdb, retry) \
177
  (__builtin_constant_p(tdb == 0) && tdb == 0 ? \
178
   __builtin_tbegin_retry_null(retry) : \
179
   __builtin_tbegin_retry_tdb(tdb, retry))
180
 
181
static __inline int __attribute__((__always_inline__, __nodebug__))
182
__builtin_tbegin_retry_nofloat_null (int __retry)
183
{
184
  int cc, i = 0;
185
 
186
  while ((cc = __builtin_tbegin_nofloat(0)) == _HTM_TBEGIN_TRANSIENT
187
         && i++ < __retry)
188
    __builtin_tx_assist(i);
189
 
190
  return cc;
191
}
192
 
193
static __inline int __attribute__((__always_inline__, __nodebug__))
194
__builtin_tbegin_retry_nofloat_tdb (void *__tdb, int __retry)
195
{
196
  int cc, i = 0;
197
 
198
  while ((cc = __builtin_tbegin_nofloat(__tdb)) == _HTM_TBEGIN_TRANSIENT
199
         && i++ < __retry)
200
    __builtin_tx_assist(i);
201
 
202
  return cc;
203
}
204
 
205
#define __builtin_tbegin_retry_nofloat(tdb, retry) \
206
  (__builtin_constant_p(tdb == 0) && tdb == 0 ? \
207
   __builtin_tbegin_retry_nofloat_null(retry) : \
208
   __builtin_tbegin_retry_nofloat_tdb(tdb, retry))
209
 
210
#endif /* __s390__ */
211
 
212
#endif /* __HTMINTRIN_H */