From: Eliot M. <mo...@cs...> - 2003-05-29 20:56:43
|
>>>>> "Feng" == Feng QIAN <fen...@ma...> writes: Feng> Hi, Feng> The implementation of i2f in the PPC baseline compiler seems not correct: Feng> /** Feng> * Emit code to implement the i2f bytecode Feng> */ Feng> protected final void emit_i2f() { Feng> asm.emitLWZ (T0, 0, SP); // T0 is X (an int) Feng> asm.emitCMPI (T0, 0); // is X < 0 Feng> asm.emitLFDtoc(F0, VM_Entrypoints.IEEEmagicField.getOffset(), T1); // F0 Feng> is MAGIC Feng> asm.emitSTFD (F0, -4, SP); // MAGIC on stack Feng> asm.emitSTW (T0, 0, SP); // if 0 <= X, MAGIC + X Feng> VM_ForwardReference fr = asm.emitForwardBC(GE); Feng> asm.emitLWZ (T0, -4, SP); // T0 is top of MAGIC Feng> asm.emitADDI (T0, -1, T0); // decrement top of MAGIC Feng> asm.emitSTW (T0, -4, SP); // MAGIC + X is on stack Feng> fr.resolve(asm); Feng> asm.emitLFD (F1, -4, SP); // F1 is MAGIC + X Feng> asm.emitFSUB (F1, F1, F0); // F1 is X Feng> asm.emitSTFS (F1, 0, SP); // float(X) is on stack Feng> } Feng> it uses one more stack slot than it is allowed. For some methods, actually it Feng> overwrites the compiled method id, that's the source of problem Chris and I Feng> encountered in previous days. Feng> Can we use S0 to hold temporary value instead of use SP-4 ? I see the problem, but you cannot move values directly between GP and FP registers: they have to flow through memory. And here, we are dealing with a double, which clearly takes 8 bytes, whereas the input and output are each 4 bytes long. A static location won't do (could be accessed by multiple threads at same time), so we probably need to use a field in the VM_Processor (fast and simple alternative to the more obvious notion of a thread local varable) to hold the scratch floating point number. This is not hard to recode, just a bit annoying (and makes VM_Processor less cleab -- but I think there are other cases a bit like this). Other ideas? -- Eliot |