After the last CG, we agreed to add atomic.fence.
Validation-wise, the instruction has type ([] -> []). Unlike other atomic.* instructions, it is not a validation error for the instruction to occur in a module with a non-shared memory. This is because the instruction fences all memories in the store, not just that of the current module.
Encoding-wise, I hope someone with better intuition about the binary format can suggest something.