On 02.05.2011 12:48, Igor Stasenko wrote:
Hmm.. that's really strange, because as far as i can see, the code there are the same:
(primitive: 3)
Interpreter>>primitiveLessThan | integerReceiver integerArgument | integerArgument := self popInteger. integerReceiver := self popInteger. self checkBooleanResult: integerReceiver< integerArgument
InterpreterPrimitives>>primitiveLessThan | integerReceiver integerArgument | integerArgument := self popInteger. integerReceiver := self popInteger. self checkBooleanResult: integerReceiver< integerArgument
and #popInteger also same (it fails if value on stack are not smallinteger). So, in Squeak VM comparison primitive also fails, which should lead to evaluating failure code.
Cog has translation methods for those primitives in cogit.c, see genSmallIntegerComparison.
Also, a primitives for floats accepting a smallintegers as arguments, so by rewriting:
SmallInteger>> < aNumber "Primitive. Compare the receiver with the argument and answer with true if the receiver is less than the argument. Otherwise answer false. Fail if the argument is not a SmallInteger. Essential. No Lookup. See Object documentation whatIsAPrimitive."
<primitive: 3> ^ aNumber>= self
[1 to: 2000000 do: [:i | i< 2354.234. ] timeToRun
before:
8223
after: 20
so... 421 times faster :)
Yes, that's basically what I proposed to do in image, albeit in a different place.
Cheers, Henry