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!
vm-dev@lists.squeakfoundation.org