[Vm-dev] VM Maker: VMMaker.oscog-eem.3081.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Oct 1 01:05:14 UTC 2021


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3081.mcz

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

Name: VMMaker.oscog-eem.3081
Author: eem
Time: 30 September 2021, 6:05:02.20738 pm
UUID: cdb6421d-dd12-4068-9e4c-c9b93e7eb606
Ancestors: VMMaker.oscog-eem.3080

Cog: Insist on alignment for some MiscPrimitivePlugin primitives since Clang is smart enough to use SE3 instructions for what are floating-point-free primtiives.

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

Item was changed:
  ----- Method: MiscPrimitivePlugin>>primitiveCompressToByteArray (in category 'primitives') -----
  primitiveCompressToByteArray
  	"Bitmap compress: bm toByteArray: ba"
+ 	<export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)> "optimizing compilers require this; e.g. Clang/MSVC uses xmm/SE3"
- 	<export: true flags: #FastCPrimitiveFlag>
  	| bmOop baOop bm ba eqBytes i j k lowByte size destSize word |
  	<var: 'ba' type: #'unsigned char *'>
  	<var: 'bm' type: #'int *'>
  	bmOop := interpreterProxy stackValue: 1.
  	baOop := interpreterProxy stackValue: 0.
  	bm := self cCode: [interpreterProxy arrayValueOf: bmOop]
  				inSmalltalk: [interpreterProxy
  								cCoerce: (interpreterProxy arrayValueOf: bmOop)
  								to: #'int *'].
  	interpreterProxy failed ifTrue: [^nil].
  	(interpreterProxy isBytes: baOop) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	(interpreterProxy isOopImmutable: baOop) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNoModification].
  	ba := interpreterProxy firstIndexableField: baOop.
  	size := interpreterProxy sizeOfSTArrayFromCPrimitive: bm.
  	destSize := interpreterProxy sizeOfSTArrayFromCPrimitive: ba.
  	interpreterProxy failed ifTrue: "the sizeOfSTArrayFromCPrimitive:'s fail for e.g. CompiledMethod"
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	destSize < ((size * 4) + 7 + (size // 1984 * 3)) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrUnsupported]. "Size may be OK but we don't know, hence fail with unsupported"
  	i := self encodeInt: size in: ba at: 0.
  	k := 0.
  	[k < size] whileTrue: 
  		[word := bm at: k.
  		lowByte := word bitAnd: 255.
  		eqBytes := (word >> 8 bitAnd: 255) = lowByte and: [(word >> 16 bitAnd: 255) = lowByte and: [(word >> 24 bitAnd: 255) = lowByte]].
  		j := k.
  		[j + 1 < size and: [word = (bm at: j + 1)]] whileTrue: [j := j + 1].
  		j > k
  			ifTrue: 
  				[eqBytes
  					ifTrue: 
  						[i := self encodeInt: j - k + 1 * 4 + 1 in: ba at: i.
  						ba at: i put: lowByte.
  						i := i + 1]
  					ifFalse: 
  						[i := self encodeInt: j - k + 1 * 4 + 2 in: ba at: i.
  						i := self encodeBytesOf: word in: ba at: i].
  				k := j + 1]
  			ifFalse:
  				[eqBytes
  					ifTrue: 
  						[i := self encodeInt: 1 * 4 + 1 in: ba at: i.
  						ba at: i put: lowByte.
  						i := i + 1.
  						k := k + 1]
  					ifFalse: 
  						[[j + 1 < size and: [(bm at: j) ~= (bm at: j + 1)]] whileTrue: [j := j + 1].
  						j + 1 = size ifTrue: [j := j + 1].
  						i := self encodeInt: j - k * 4 + 3 in: ba at: i.
  						k to: j - 1 by: 1 do: [ :m | i := self encodeBytesOf: (bm at: m) in: ba at: i].
  						k := j]]].
  	interpreterProxy methodReturnInteger: i!

Item was changed:
  ----- Method: MiscPrimitivePlugin>>primitiveConvert8BitSigned (in category 'primitives') -----
  primitiveConvert8BitSigned
  	"SampledSound (class) convert8bitSignedFrom: aByteArray to16Bit: aSoundBuffer"
+ 	<export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)> "optimizing compilers require this; e.g. Clang/MSVC uses xmm/SE3"
- 	<export: true flags: #FastCPrimitiveFlag>
  	| aByteArray aSoundBuffer arraySize byteArrayOop soundBufferOop |
  
  	<var: 'aByteArray' type: #'unsigned char *'>
  	<var: 'aSoundBuffer' type: #'unsigned short *'>
  	byteArrayOop := interpreterProxy stackValue: 1.
  	(interpreterProxy isBytes: byteArrayOop) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	aByteArray := interpreterProxy firstIndexableField: byteArrayOop.
  	soundBufferOop := interpreterProxy stackValue: 0.
  	(interpreterProxy isOopImmutable: soundBufferOop) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNoModification].
  	aSoundBuffer := self
  						cCode: [interpreterProxy arrayValueOf: soundBufferOop]
  						inSmalltalk: [interpreterProxy
  										cCoerce: (interpreterProxy arrayValueOf: soundBufferOop)
  										to: #'unsigned short *'].
  	arraySize := interpreterProxy sizeOfSTArrayFromCPrimitive: aByteArray.
  	interpreterProxy failed ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	(interpreterProxy byteSizeOf: soundBufferOop) < (2 * arraySize) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	0 to: arraySize - 1 do: 
  		[ :i | | s |
  		s := aByteArray at: i.
  		aSoundBuffer
  			at: i
  			put: (s > 127
  					ifTrue: [s - 256 bitShift: 8]
  					ifFalse: [s bitShift: 8])].
  	interpreterProxy methodReturnReceiver!

Item was changed:
  ----- Method: MiscPrimitivePlugin>>primitiveDecompressFromByteArray (in category 'primitives') -----
  primitiveDecompressFromByteArray
  	"Bitmap decompress: bm fromByteArray: ba at: index"
+ 	<export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)> "optimizing compilers require this; e.g. Clang/MSVC uses xmm/SE3"
- 	<export: true flags: #FastCPrimitiveFlag>
  	| bmOop baOop bm ba index i anInt code data end k n pastEnd |
  	<var: 'ba' type: #'unsigned char *'>
  	<var: 'bm' type: #'int *'>
  	<var: 'anInt' type: #'unsigned int'>
  	<var: 'code' type: #'unsigned int'>
  	<var: 'data' type: #'unsigned int'>
  	<var: 'n' type: #'unsigned int'>
  	bmOop := interpreterProxy stackValue: 2.
  	baOop := interpreterProxy stackValue: 1.
  	bm := self cCode: [interpreterProxy arrayValueOf: bmOop]
  				inSmalltalk: [interpreterProxy
  								cCoerce: (interpreterProxy arrayValueOf: bmOop)
  								to: #'int *'].
  	(interpreterProxy isOopImmutable: bmOop) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNoModification].
  	(interpreterProxy isBytes: baOop) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	ba := interpreterProxy firstIndexableField: baOop.
  	index := interpreterProxy stackIntegerValue: 0.
  	end := interpreterProxy sizeOfSTArrayFromCPrimitive: ba.
  	pastEnd := interpreterProxy sizeOfSTArrayFromCPrimitive: bm.
  	interpreterProxy failed ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	i := index - 1.
  	k := 0.
  	[i < end] whileTrue: 
  		[anInt := ba at: i.
  		i := i + 1.
  		anInt <= 223 ifFalse:
  			[anInt <= 254
  				ifTrue: 
  					[anInt := anInt - 224 * 256 + (ba at: i).
  					i := i + 1]
  				ifFalse: 
  					[anInt := 0.
  					1 to: 4 by: 1 do: 
  						[ :j | anInt := (anInt bitShift: 8) + (ba at: i).
  						i := i + 1]]].
  		n := anInt >> 2.
  		k + n > pastEnd ifTrue:
  			[^interpreterProxy primitiveFailFor: PrimErrBadIndex].
  		code := anInt bitAnd: 3.
  		"code = 0 ifTrue: [nil]."
  		code = 1 ifTrue: 
  			[data := ba at: i.
  			i := i + 1.
  			data := data bitOr: (data bitShift: 8).
  			data := data bitOr: (data bitShift: 16).
  			1 to: n do: 
  				[ :j |
  				bm at: k put: data.
  				k := k + 1]].
  		code = 2 ifTrue: 
  			[data := 0.
  			1 to: 4 do: 
  				[ :j |
  				data := (data bitShift: 8) bitOr: (ba at: i).
  				i := i + 1].
  			1 to: n do: 
  				[ :j |
  				bm at: k put: data.
  				k := k + 1]].
  		code = 3 ifTrue:
  			[1 to: n do: 
  				[ :m |
  				data := 0.
  				1 to: 4 do: 
  					[ :j |
  					data := (data bitShift: 8) bitOr: (ba at: i).
  					i := i + 1].
  				bm at: k put: data.
  				k := k + 1]]].
+ 	interpreterProxy methodReturnReceiver!
- 	interpreterProxy pop: interpreterProxy methodArgumentCount!



More information about the Vm-dev mailing list