On Mon, May 3, 2010 at 9:49 PM, Shane McDonald <mcdonald.shane@xxxxxxxxx> wrote: > Looking at env[0], I see that the __fpc_csr field has a value of 1024, > indicating a divide-by-zero. As soon as that ctc1 instruction > is executed, the exception is raised. I guess that makes > sense, but I don't understand why __fpc_csr has a value of 1024. > When I step through the call to setjmp(), it gets set to a value of 0. > In longjmp(), every other field in env[0] has the value that it was > set to in the call to setjmp(). Wait, I take that back -- I was looking at the wrong env[0] variable! I can see that __fpc_csr actually does have a value of 1024 when I call setjmp(), and that's why longjmp() is setting the FCSR register to indicate divide-by-zero. If I comment out my call to feenableexcept( FE_DIVBYZERO ), it is set to 0; if I include that call, it is set to 1024. Looking further, I also see that I confused the Cause bits and the Enable bits of the FCSR -- the Enable divide-by-zero bit is set, not the Cause bit. Clearly, the call to feenableexcept() must be setting that bit. But, it no longer makes sense that an exception is raised when the FCSR register is restored to the value 1024. Shane