ztype: zero extended type -- a larger type that is a multiple of 32 bits in size
* a type to store in registers, a type
* to store on the compile-time or runtime stack
* a type to pass a parameter as
* mtype: memory type -- a smaller type that is possibly truncated to fit
* an in-memory layout

original := Mem[s2.A].mtype;
spurious_failure := whatever;
IF original = Mem[s1.A].mtype AND NOT spurious_failure THEN
Mem [s2.A].mtype := s0.ztype;
s2.result_type := 1;
ELSE
Mem [s2.A].mtype := original; x86 really does rewrite the original value, atomically
s2.result_type := 0;
END;
pop(2);
This is permitted to fail spuriously.
That is, even if Mem[s2.a] = Mem[s1.a], we might
still go down the then branch.