On 10/19/2011 09:26 AM, Andrew MacLeod wrote: > well, they are explicitly 'compare_exchange_strong' and > 'compare_exchange_weak' calls... so yes, they have 'hardcoded' one or the > other :-) > we could alternatively do 2 separate builtins, but I didn't see the point. > But Im ambivalent.
I'm just not keen on issuing errors this late. If we 'know' it's always going to be 0/1 because of other things the compiler does, we might as well simply do weak = (opN == const1_rtx) and leave it at that. > I clearly misunderstood what you said then, I thought you said use > QImode :-P. So, look at target and use that mode? target may not > be set sometimes tho right? what do you use then? QImode? You never look at target, you look at insn_data[icode].operand[opno].mode if target is set and doesn't match that mode, then create a new pseudo of the proper mode and let your caller do the conversion. > If I understand my previous conversation with Lawrence, we need to > know what mode the native CAS is. We don't have that knowledge for any of the other rtl patterns; we ask the rtl pattern to enforce a given mode. We should do the same for CAS. > Worst case, if the native CAS is relaxed, the fences need to be > issued as such to implement > > compare_exchange (T* ptr, T* old, new, success, failure) > > memory_fence (success) // release modes > val = *old; > res = relaxed_CAS (ptr, val, new) > if (success) > { > memory_fence (success); // acquire modes > return true; > } > *old = res; > memory_fence (failure) > return false; If the target uses LL/SC, then native CAS is likely relaxed. However, we will already be emitting a number of jumps in order to implement the LL/SC sequence and stuffing the fences into those jumps is going to be much better than you trying to do it in the middle-end outside of that sequence. Really. > So if the CAS can handle it all, why does it matter if the pattern > has a single "compressed" parameter for the 3 values, or whether it > simply explicitly lists all three? *shrug* Just for less memory consumption. It *could* remain 3 values. r~