So with TSO loads to a different address can't be reordered (in the global memory order) unless the earlier load can be satisfied by a store in the store buffer and the second load can't. Keep in mind that a load can only be ordered in the global memory order (globally performed) after the store it reads from.
Let have a look at this simple example.
Is it possible to end up with r1=r3=1 and r2=r4=0?
Yes, because the load of r1 is a load which can be satisfied from the store buffer and the load of r2 from the cache. So they can be reordered in the global memory order. And the same goes for r3/r4.
With IBM 370 a load that could be satisfied by a store in the store buffer needs to wait for the store to be globally visible. Of course the load will still see the same value as with TSO; so what is the point? Well, it will make sure a subsequent load that is loaded from the cache, is globally ordered after the earlier load that could have been satisfied from the store buffer.
As a consequence: with IBM 370, the loads can't be reordered. And it is impossible to end up r1=r3=1 and r2=r4=0.
So TSO will give a total order over the stores. I believe that IBM 370 will also give you a total order over the loads; the order of loads in the memory order is consistent with the order of loads in the program order.
Lets go back to the example (a). For TSO this would be a possible memory order that explains the results.
- P1:register2=flag2 (0)
- P2:register4=flag1 (0)
- P1:register1=A (1)
- P2:register3=A (2)
The trick is with the 2 loads at the end of P1/P2. They have been ordered to the beginning of the memory order since they have a preceding loads that can be satisfied by the store buffer.
With IBM 370 load/load reordering isn't possible. So it is impossible to find a memory order that will be consistent with IBM 370.
PS: I'm no authority, so best to recheck my answer :) I'm also studying this part myself.