[Vm-dev] Integer comparition primitive failures on Cog
Henrik Sperre Johansen
henrik.s.johansen at veloxit.no
Mon May 2 11:32:13 UTC 2011
On 02.05.2011 13:22, Igor Stasenko wrote:
>
> On 2 May 2011 13:06, Henrik Sperre Johansen
> <henrik.s.johansen at veloxit.no> wrote:
>> 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.
>
> So , i think the problem is, that #genSmallIntegerComparison: (and friends)
> generating code for comparing integers only and falls back to normal
> send when it fails,
> without attempting to use #primitiveFloatLess:thanArg: .
static sqInt
genSmallIntegerComparison(sqInt jumpOpcode)
{
AbstractInstruction *jumpFail;
AbstractInstruction *jumpTrue;
gMoveRR(Arg0Reg, TempReg);
jumpFail = genJumpNotSmallIntegerInScratchReg(TempReg);
Assuming genJumpNotSmallIntegerInScratchReg is an accurate name, I'd say
yes. :)
Cheers,
Henry
More information about the Vm-dev
mailing list