[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