Allow me to call out some layout comparison points against the 2014 version:
There is no separate member to track the shared reader count.
The four-byte spinlock is gone.
The four-byte waiting writer count is gone.
The two chunks of four-byte padding (for qword alignment of pointers) are gone.
The WaitListEntry structure hasn’t changed at all.
Ewald also covers Compare-And-Swap operations in detail. Definitely a good read.