Wow.. that's cool. I had no time to get so deep into Cog JIT internals. And it is really interesting to hear your feedback about it (to Eliot as well, i assume) :)
On 3 May 2011 22:05, Nicolas Cellier nicolas.cellier.aka.nice@gmail.com wrote:
OK, easy, I had a reference to ClassReg instead of Arg0Reg (copy/paste error from super). My feeling is that it is very uncomfortable to program this part... Since we mapped our local variables and arguments to an equivalent of global variables (registers Arg0Reg etc), then no compiler will tell us that this register is used before assigned or never used or what... Far, far away from Smalltalk safe lands...
Here is a new try attached:
[1 to: 2000000 do: [:i | i < 2354.234. i <= 2354.234. i >= 2354.234. i > 2354.234.]] timeToRun 71
A bit slower than SimpleCogit ?
Nicolas
2011/5/3 Nicolas Cellier nicolas.cellier.aka.nice@gmail.com:
OK, with SimpleCogit: [1 to: 2000000 do: [:i | i < 2354.234. i <= 2354.234. i >= 2354.234. i > 2354.234.]] timeToRun 69
vs 4.2.5 VM: [1 to: 2000000 do: [:i | i < 2354.234. i <= 2354.234. i >= 2354.234. i > 2354.234.]] timeToRun 299
StackToRegisterMappingCogit: crash...
I don't get the x86 certification yet :(
Nicolas
2011/5/3 Nicolas Cellier nicolas.cellier.aka.nice@gmail.com:
Apart another declaration bug (FP missing in function name...) there is a killer :
StackToRegisterMappingCogit inherits silently from SimpleStackBasedCogit>>#genSmallIntegerComparison:orDoubleComparison: though it does not share the stack structure. This is fatal...
So an override StackToRegisterMappingCogit>>#genSmallIntegerComparison:orDoubleComparison: is mandatory
Bad, bad inheritance...
Now compiling the VM again...
Nicolas
2011/5/3 Nicolas Cellier nicolas.cellier.aka.nice@gmail.com:
Hem, some declaration were missing... and the argument for FP comparison is tricky indeed... Sorry for the noise, but this is a direct live
Nicolas
2011/5/3 Nicolas Cellier nicolas.cellier.aka.nice@gmail.com:
And if genSmallIntegerComparison:orDoubleComparison: is correct, then usage shall be quite straight forward
Nicolas
2011/5/3 Nicolas Cellier nicolas.cellier.aka.nice@gmail.com:
I always refused to learn x86 assembler, but by code imitation I can give my own try in attachment. Note that I did not use the trick to invert FP comparison operands since this does not seem necessary.
Nicolas
2011/5/2 Eliot Miranda eliot.miranda@gmail.com: > > Hi Henrik, > > Eliot (phone) > > On May 2, 2011, at 3:12 AM, Henrik Sperre Johansen henrik.s.johansen@veloxit.no wrote: > >> As per my comment on the recent Morphic performance graphs,(http://blog.openinworld.com/2011/03/morphic-flavour-performance/#comment-59) on a Cog VM these primitives fail with a Float parameter, which leads to a huge performance hit when comparing Ints to Floats by doing silly things in the fallback code. >> >> Cog: >> [1 to: 2000000 do: [:i | >> i < 2354.234. >> i <= 2354.234. >> i >= 2354.234. >> i > 2354.234.]] timeToRun 26594 >> >> Trunk: >> [1 to: 2000000 do: [:i | >> i < 2354.234. >> i <= 2354.234. >> i >= 2354.234. >> i > 2354.234.]] timeToRun 229 >> >> Should this be changed in the VM, > > I think so. When I first wrote the SmallInteger translated prims I hadn't yet written the JIT support for floats and so couldn't write int/float comparison. Now all the support is there and it should be straight-forward. Do you fancy trying to write this yourself? Would be a fun exercise. Let me know and I can hand-hold with using the simulator. > > > Best > Eliot (phone) > > >> or is the difference for pure int/int comparition large enough that we should instead change >> Float>>adaptToInteger: andCompare: >> to use the corresponding comparitions with Float as receiver, which does work? >> That's still slower than trunk in my image, but quite a bit better, above test takes about 1s. >> >> Cheers, >> Henry >