[Vm-dev] dispatchOn:in: and inlining bytecode routines

André Wendt andre.wendt at hpi.uni-potsdam.de
Sun Apr 13 16:35:30 UTC 2008


Hi Mathieu,

Mathieu Suen wrote:
> 
> Hi,
> 
> Can you show use the smalltalk code?
> I think is because your aren't using the internalPush..

I use

initializePushConstantBytecodeTable
	self inline: true. "already toggled this, but didn't help"
	PushConstantBytecodeTable := Array new: 8.
	self table: PushConstantBytecodeTable from:
	#(
		(0 pushReceiverBytecode)
		(1 pushConstantTrueBytecode)
		(2 pushConstantFalseBytecode)
		(3 pushConstantNilBytecode)
		(4 pushConstantMinusOneBytecode)
		(5 pushConstantZeroBytecode)
		(6 pushConstantOneBytecode)
		(7 pushConstantTwoBytecode)
	).

for the bytecode table that I want to dispatch on. It is called in
Interpreter>>#initialize. Then I use

self dispatchOn: (byte1 >> 4) in: PushConstantBytecodeTable.

in a bytecode routine. I don't understand how that relates to
internalPush...

André

> 
> 
> On Apr 12, 2008, at 12:40 PM, André Wendt wrote:
>>
>> Hi,
>>
>> as far as I can see, there's nothing special about BytecodeTable in the
>> Interpreter that instructs VMMaker to generate a switch statement that
>> includes:
>>
>> case 112:
>>    /* pushReceiverBytecode */
>>    {
>>        /* begin fetchNextBytecode */
>>        currentBytecode = byteAtPointer(++localIP);
>>        /* begin internalPush: */
>>        longAtPointerput(localSP += BytesPerWord, foo->receiver);
>>    }
>>    break;
>>
>> However, when I want to dispatch on a code in a subset of bytecodes
>> using my own table (for integrating multiple bytecodes into one), I get
>>
>> case 0:
>>    pushReceiverBytecode();
>>    break;
>>
>> instead of an inlined pushReceiverBytecode routine. Needless to say my
>> code doesn't compile because of the pushReceiverBytecode() call.
>>
>> Why does pushReceiverBytecode get inlined when used with BytecodeTable,
>> but not in my own?
>>
>> Thanks,
>> André
> 
>     Mth
> 
> 
> 



More information about the Vm-dev mailing list