After much discussion we feel that there is a possibility that we can gain an improvement in the performance of immediates if we switched from storing the low 30 bits of integer values to instead storing the high 30 bits of the double, this reduces us to about 20 bits of integer precision, but provides a greater range. It also has the benefit of removing special case logic and branches from JSImmediate::from(double), it also removes the int->double cast needed for standard mathematical operands. That said this may reduce the performance of bitwise operators, and array access, but we really needed to implement it to see what happens. We'll need to fix various immediate optimisations we make for dealing with pairs of immediate values.
We now store 32 bits of integer & 64 bits of double :-D