The calling convention your compiler is using is dependent on a number of things [1]. It is this calling convention that dictates how values are returned from a function, not whether or not RVO/NRVO is happening. Also, what is being passed as an extra argument, according to many calling conventions, it not really an already constructed object, but an address for an object to be constructed into. Under certain situations the compiler is able to elide copes, which as you pointed out, leads to your copy constructor to never be called at all, even if it has visible side effects. I think these are important distinctions and hoped pointing them out would be beneficial.
Yes, thanks for pointing the calling conventions out, I didn't really know what you were getting at.
The hardware calling convention does dictate certainly what code the compiler can put out.
If the compiler does not support NVRO and emits code that causes multiple copy/constructions it doesn't matter if the hardware supports more efficient behaviour.
I edited my earlier comment with your correction, thanks.
[1] http://en.wikipedia.org/wiki/X86_calling_conventions