[Vm-dev] VM Maker Inbox: VMMaker.oscog-nice.3174.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Mar 9 12:05:12 UTC 2022

Nicolas Cellier uploaded a new version of VMMaker to project VM Maker Inbox:

==================== Summary ====================

Name: VMMaker.oscog-nice.3174
Author: nice
Time: 9 March 2022, 1:04:51.911686 pm
UUID: af4f8704-18fa-564c-ac59-27c6f6364c59
Ancestors: VMMaker.oscog-eem.3173

Workaround : literal characters should have unsigned values

Currently in SistaV1, characters in range 16r100 16rFFFF are encoded as push literal character (bytecode 233) with signed extended B.

This lead to negative character values in the range 16r8000 to 16rFFFF.

The workaround consist in bit-oring extB with 16rFF so as to re-interpret it as unsigned char. BEWARE: this assumes that a single extB will be used rather than multiple consecutive extB. It works by now, because it's currently the case that image side only use 1 extB for encoding literal character - see EncoderForSistaV1>>#genPushCharacter: - above 16rFFFF, a literal index is consumed.

An alternative would be to use extA rather than extB. But it would require a careful recompilation of CompiledMethod at image side.

Similar fix is required at image side in InstructionStream>>#interpretNext2ByteSistaV1Instruction:for:extA:extB:startPC:

=============== Diff against VMMaker.oscog-eem.3173 ===============

Item was changed:
  ----- Method: SimpleStackBasedCogit>>genExtPushCharacterBytecode (in category 'bytecode generators') -----
  	"SistaV1:		233		11101001	iiiiiiii		Push Character #iiiiiiii (+ Extend B * 256)"
  	| value |
+ 	value := byte1 + ((extB bitAnd: 16rFF) << 8).
- 	value := byte1 + (extB << 8).
  	extB := 0.
  	numExtB := 0.
  	^self genPushLiteral: (objectMemory characterObjectOf: value)!

Item was changed:
  ----- Method: StackInterpreter>>extPushCharacterBytecode (in category 'stack bytecodes') -----
  	"SistaV1:	*	233		11101001	iiiiiiii		Push Character #iiiiiiii (+ Extend B * 256)"
  	| value |
+ 	value := self fetchByte + ((extB bitAnd: 16rFF) << 8).
- 	value := self fetchByte + (extB << 8).
  	self fetchNextBytecode.
  	self internalPush: (objectMemory characterObjectOf: value).
  	numExtB := extB := 0!

More information about the Vm-dev mailing list