Message ID | 54EBCB24.6080903@codesourcery.com |
---|---|
State | New |
Headers | show |
On 02/24/2015 01:51 AM, Sandra Loosemore wrote: > On 02/23/2015 03:36 AM, Patrick Marlier wrote: >> On 02/22/2015 04:06 AM, Sandra Loosemore wrote: >> >> +Here is an example showing handling for @code{_XABORT_RETRY} >> +and a fallback path for other failures: >> + >> +@smallexample >> +#include <immintrin.h> >> + >> +int n_tries, max_tries; >> +unsigned status = _XBEGIN_STARTED; >> >> I would suggest to set it to something different. Indeed if max_tries == >> 0, then it will end up to do the transactional code with no transaction >> started. > > Good catch.... > >> +... >> + >> +for (n_tries = 0; n_tries < max_tries; n_tries++) >> + @{ >> + status = _xbegin (); >> + if (status == _XBEGIN_STARTED || !(status | _XABORT_RETRY)) >> >> Should not be || !(status & _XABORT_RETRY) ? > > Yup, that was a think-o. > >> + break; >> + @} >> +if (status == _XBEGIN_STARTED) >> + @{ >> + ... transaction code... >> + _xend (); >> + @} >> +else >> + @{ >> + ... non transactional fallback path... >> + @} >> +@end smallexample >> >> Thanks a lot. It gives a good idea on how to use it. I just would like >> to mention that the non transactional and transactional code must >> synchronize together (in most cases) to ensure consistency. > > OK, I added a sentence about that. > > Revised patch attached. OK to commit this version? > > -Sandra > _XBEGIN_EXPLICIT does not exist right? maybe 0 is better to avoid confusion? or ~_XBEGIN_STARTED? But it sounds good to me. Thanks. -- Patrick
On 02/24/2015 03:01 AM, Patrick Marlier wrote: > On 02/24/2015 01:51 AM, Sandra Loosemore wrote: >> [snip] >> Revised patch attached. OK to commit this version? >> >> -Sandra > > _XBEGIN_EXPLICIT does not exist right? maybe 0 is better to avoid > confusion? or ~_XBEGIN_STARTED? Argh, I meant to change _XBEGIN_STARTED to _XABORT_EXPLICIT here. :-P I'll fix that before checking it in. > But it sounds good to me. Thanks. Thanks for the review; I think we've got the technical corrections nailed down now. Doc maintainers, is this OK? -Sandra
On Tue, 24 Feb 2015, Sandra Loosemore wrote: > Thanks for the review; I think we've got the technical corrections > nailed down now. Doc maintainers, is this OK? You can approve yourself now. Watch out for my next mail. ;-) Gerald
Index: gcc/doc/extend.texi =================================================================== --- gcc/doc/extend.texi (revision 220892) +++ gcc/doc/extend.texi (working copy) @@ -17274,24 +17274,11 @@ and suitable fallback code always needs Start a RTM (Restricted Transactional Memory) transaction. Returns @code{_XBEGIN_STARTED} when the transaction started successfully (note this is not 0, so the constant has to be -explicitly tested). If the transaction aborts, all side-effects -are undone and an abort code is returned. There is no guarantee -any transaction ever succeeds, so there always needs to be a valid -fallback path. -@end deftypefn - -@smallexample -#include <immintrin.h> - -if ((status = _xbegin ()) == _XBEGIN_STARTED) @{ - ... transaction code... - _xend (); -@} else @{ - ... non transactional fallback path... -@} -@end smallexample +explicitly tested). -If the transaction aborts, the return value is one of: +If the transaction aborts, all side-effects +are undone and an abort code encoded as a bit mask is returned. +The following macros are defined: @table @code @item _XABORT_EXPLICIT @@ -17309,6 +17296,11 @@ Transaction abort due to a debug trap. Transaction abort in an inner nested transaction. @end table +There is no guarantee +any transaction ever succeeds, so there always needs to be a valid +fallback path. +@end deftypefn + @deftypefn {RTM Function} {void} _xend () Commit the current transaction. When no transaction is active this faults. All memory side-effects of the transaction become visible @@ -17325,6 +17317,37 @@ The @var{status} is an 8-bit constant; i value from @code{_xbegin}. @end deftypefn +Here is an example showing handling for @code{_XABORT_RETRY} +and a fallback path for other failures: + +@smallexample +#include <immintrin.h> + +int n_tries, max_tries; +unsigned status = _XBEGIN_EXPLICIT; +... + +for (n_tries = 0; n_tries < max_tries; n_tries++) + @{ + status = _xbegin (); + if (status == _XBEGIN_STARTED || !(status & _XABORT_RETRY)) + break; + @} +if (status == _XBEGIN_STARTED) + @{ + ... transaction code... + _xend (); + @} +else + @{ + ... non-transactional fallback path... + @} +@end smallexample + +@noindent +Note that, in most cases, the transactional and non-transactional code +must synchronize together to ensure consistency. + @node Target Format Checks @section Format Checks Specific to Particular Target Machines