fix for treating '0 || 0' as a constant
reinstate invariant code motion again
addition of InterlockedCompareExchange
update C++ version of preprocessor