Also define _M_* in a common location, and clean up code that these
changes break (including DSPJit files that assume X86 yet are compiled
on ARM for some reason...)
- For GCC, use intrinsics that will work on ARM.
- Add AtomicExchangeAcquire.
- Make Atomic{Load,LoadAcquire,Store,StoreRelease} work for any suitable type.
- Call ABI_AlignStack even on x86-64.
- Have ABI_AlignStack respect the difference in current alignment
between the root JIT function, which has a prolog, and
ProtectFunction thunks, which do not. This was causing many games
to crash on start on OS X. Since this might otherwise mean changing
the stack pointer before every call...
- Have one prolog/epilog function rather than two (one of which
definitely did not do what it was thought to do), and make it
actually work like a normal one, so that the stack frame shows up
properly in the debugger. There should be no performance impact.
Changes a lot of parsing code which previously was not aware of the notion of
key/value, and operated only with raw lines. Now key/value is the default and
lines are handled as raw only if they do not contain =, or they start with $ or
+ (for Gecko/AR compatibility).
It isn't easily accessible with sigaction or Mach exceptions (well,
requires an additional system call in the latter), and isn't necessary.
(and get rid of the enum, because it's only used once, and the comments
are more expressive than enum names)
MSVC insisted on using a copy assignment where a move was intended and
ought to be used. This would have been caught, because the class in
question inherits from NonCopyable, which declares a move assignment
operator, which is supposed to delete the implicitly declared copy
assignment operator, but of course MSVC didn't do that either, causing a
class that should have been safe to be unsafe.
(Intertwined enough that's it's easier to do in one patch.)
(1) /dev/es did not support state save, which could cause crashes and
incorrect behavior after loading.
(2) NANDContentLoader tried to read all of a title's contents into
memory when it was first opened. Two issues:
- If any contents were missing, it bailed out. However, with DLC,
only some of the contents may be downloaded, as determined by the
permission bits in the ticket. Instead, return an appropriate error
when a content is accessed that doesn't exist on the filesystem
(don't bother checking the permission bits though).
- Everything was loaded into memory - even if it consisted of 3 GB of
songs, which caused Dolphin to lag out for quite a while (and would
fail on 32-bit). Instead, open content on demand.
This is required to be able to move objects that inherit from it.
(Note that this patch also #ifs out the class for the externals that
include it yet are compiled in pre-C++11 mode. It shouldn't matter,
since those externals don't use it.)