[Vm-dev] VM Maker: VMMaker.oscog-eem.3014.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Aug 2 22:34:54 UTC 2021
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3014.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.3014
Author: eem
Time: 2 August 2021, 3:34:00.966805 pm
UUID: c95cf1a8-05f7-4181-9276-7f3fdc1140e6
Ancestors: VMMaker.oscog-eem.3013
Have the FloatArray/Math plugin primitives use the FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag flags. Use the methodReturnFoo: protocol. Surround Spur metadata with #if SPURVM.
In isCodeCompactingPrimitiveIndex: explain why the process switch primitives are not included.
=============== Diff against VMMaker.oscog-eem.3013 ===============
Item was changed:
----- Method: CoInterpreter>>isCodeCompactingPrimitiveIndex: (in category 'primitive support') -----
isCodeCompactingPrimitiveIndex: primIndex
"If instVarAt:, slotAt: or shallowCopy operate on a Context then they compute a
bytecode pc and hence may provoke a code compaction. Hence primitive invocation
+ from these primitives must use a static return address (cePrimReturnEnterCogCode:).
+ Note that the process switch primitives may also provoke a code compaction, which
+ happens when switching to a process whose top context has a machine code pc but
+ the method is no longer in the code cache. However, in this case they are switching
+ process and don't go through the normal return. So we don't include them here."
- from these primitives must use a static return address (cePrimReturnEnterCogCode:)."
<inline: true>
self cCode: [] inSmalltalk: [#primitiveClone. #primitiveInstVarAt. #primitiveSlotAt]. "For senders..."
^primIndex = PrimNumberInstVarAt
or: [primIndex = PrimNumberShallowCopy
or: [primIndex = PrimNumberSlotAt]]!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveAddFloat64Array (in category 'arithmetic primitives') -----
primitiveAddFloat64Array
"Primitive. Add the receiver and the argument, both Float64Arrays and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg rcvrPtr argPtr length |
- <export: true>
<var: #rcvrPtr type: #'double *'>
<var: #argPtr type: #'double *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isLong64s: arg)
and: [(interpreterProxy isLong64s: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (rcvrPtr at: i) + (argPtr at: i)].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1. "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveAddScalar (in category 'arithmetic primitives') -----
primitiveAddScalar
"Primitive. Add the argument, a scalar value to the receiver, a Float64Array"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr rcvrPtr value length |
- <export: true>
<var: #value type: #double>
<var: #rcvrPtr type:#'double *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (rcvrPtr at: i) + value].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1. "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveAt (in category 'access primitives') -----
primitiveAt
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| index rcvr doublePtr |
<var: #doublePtr type: #'double *'>
index := interpreterProxy stackIntegerValue: 0.
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy failed not
and: [(interpreterProxy isLong64s: rcvr)
and: [index > 0 and: [index <= (interpreterProxy slotSizeOf: rcvr)]]]) ifFalse:
[^interpreterProxy primitiveFail].
doublePtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
+ ^interpreterProxy methodReturnFloat: (doublePtr at: index - 1)!
- interpreterProxy methodReturnFloat: (doublePtr at: index - 1)!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveAtPut (in category 'access primitives') -----
primitiveAtPut
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
-
| value floatValue index rcvr doublePtr |
- <export: true>
<var: #floatValue type: #double>
<var: #doublePtr type: #'double *'>
value := interpreterProxy stackValue: 0.
floatValue := (interpreterProxy isIntegerObject: value)
ifTrue: [(interpreterProxy integerValueOf: value) asFloat]
ifFalse: [interpreterProxy floatValueOf: value].
index := interpreterProxy stackIntegerValue: 1.
rcvr := interpreterProxy stackValue: 2.
(interpreterProxy failed not
and: [(interpreterProxy isLong64s: rcvr)
and: [index > 0 and: [index <= (interpreterProxy slotSizeOf: rcvr)]]]) ifFalse:
[^interpreterProxy primitiveFail].
doublePtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
doublePtr at: index-1 put: floatValue.
+ ^interpreterProxy methodReturnValue: value!
- interpreterProxy pop: 3 thenPush: value!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveDivFloat64Array (in category 'arithmetic primitives') -----
primitiveDivFloat64Array
"Primitive. Divide each element in the receiver by the corresponding element in the argument, both Float64Arrays, and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length |
<var: #rcvrPtr type: #'double *'>
<var: #argPtr type: #'double *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isLong64s: arg)
and: [(interpreterProxy isLong64s: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'double *'.
"Check if any of the argument's values is zero"
0 to: length - 1 do:
[:i| (argPtr at: i) = 0.0 ifTrue: "i.e. check for both 0.0 and -0.0"
[^interpreterProxy primitiveFail]].
0 to: length - 1 do:
[:i| rcvrPtr at: i put: (rcvrPtr at: i) / (argPtr at: i)].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveDivScalar (in category 'arithmetic primitives') -----
primitiveDivScalar
"Primitive. Divide each element in the receiver by the argument, a scalar, and store the result into the receiver, a Float64Array"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr rcvrPtr value length |
- <export: true>
<var: #value type: #double>
<var: #rcvrPtr type:#'double *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (rcvrPtr at: i) / value.
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveDotProduct (in category 'arithmetic primitives') -----
primitiveDotProduct
"Primitive. Compute the dot product of the receiver and the argument, both Float64Arrays.
The dot product is defined as the sum of the products of the individual elements."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length result |
<var: #result type: #double>
<var: #rcvrPtr type: #'double *'>
<var: #argPtr type: #'double *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isLong64s: arg)
and: [(interpreterProxy isLong64s: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'double *'.
result := 0.0.
0 to: length-1 do:[:i|
result := result + ((rcvrPtr at: i) * (argPtr at: i)).
].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy methodReturnFloat: result. "Return result"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveEqual (in category 'access primitives') -----
primitiveEqual
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
-
| rcvr arg rcvrPtr argPtr length |
- <export: true>
<var: #rcvrPtr type: #'double *'>
<var: #argPtr type: #'double *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isLong64s: arg)
and: [(interpreterProxy isLong64s: rcvr)]) ifFalse:
[^interpreterProxy primitiveFail].
- interpreterProxy pop: 2.
(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr) ifFalse:
+ [^interpreterProxy methodReturnBool: false].
- [^interpreterProxy pushBool: false].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'double *'.
0 to: length-1 do:[:i|
+ (rcvrPtr at: i) = (argPtr at: i) ifFalse:[^interpreterProxy methodReturnBool: false].
- (rcvrPtr at: i) = (argPtr at: i) ifFalse:[^interpreterProxy pushBool: false].
].
+ ^interpreterProxy methodReturnBool: true!
- ^interpreterProxy pushBool: true!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveFromFloatArray (in category 'access primitives') -----
primitiveFromFloatArray
"Primitive. Set each element of the receiver, a Float64Array with that of the argument, a FloatArray and return the receiver.
Fail if both have different size"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg rcvrPtr argPtr length |
- <export: true>
<var: #rcvrPtr type: #'double *'>
<var: #argPtr type: #'float *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isWords: arg)
and: [(interpreterProxy isLong64s: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'float *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (argPtr at: i) to: #double)].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1. "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveHashArray (in category 'access primitives') -----
primitiveHashArray
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
-
| rcvr rcvrPtr length result |
- <export: true>
<var: #rcvrPtr type: #'unsigned int *'>
<var: #result type: #'unsigned int'>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'unsigned int *'.
result := 0.
0 to: length*2-1 do:[:i|
result := result + (rcvrPtr at: i).
].
+ ^interpreterProxy methodReturnInteger: (result bitAnd: 16r1FFFFFFF)!
- interpreterProxy methodReturnInteger: (result bitAnd: 16r1FFFFFFF)!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveLength (in category 'arithmetic primitives') -----
primitiveLength
"Primitive. Compute the length of the argument (sqrt of sum of component squares)."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr length len |
<var: #rcvrPtr type: #'double *'>
<var: #len type: #double>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
len := 0.0.
0 to: length-1 do:
[:i| len := len + ((rcvrPtr at: i) * (rcvrPtr at: i)) ].
len > 0.0 ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ ^interpreterProxy methodReturnFloat: (self sqrt: len)!
- interpreterProxy methodReturnFloat: (self sqrt: len)!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveMulFloat64Array (in category 'arithmetic primitives') -----
primitiveMulFloat64Array
"Primitive. Multiply the receiver and the argument, both Float64Arrays and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length |
<var: #rcvrPtr type: #'double *'>
<var: #argPtr type: #'double *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isLong64s: arg)
and: [(interpreterProxy isLong64s: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (rcvrPtr at: i) * (argPtr at: i).
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveMulScalar (in category 'arithmetic primitives') -----
primitiveMulScalar
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
"Primitive. Multiply elements in the receiver, a Float64Array, by argument, a scalar value, and store the result into the receiver."
| rcvr rcvrPtr value length |
<var: #value type: #double>
<var: #rcvrPtr type:#'double *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (rcvrPtr at: i) * value.
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveNormalize (in category 'arithmetic primitives') -----
primitiveNormalize
"Primitive. Normalize the argument (A Float64Array) in place."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr length len |
<var: #rcvrPtr type: #'double *'>
<var: #len type: #double>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
len := 0.0.
0 to: length - 1 do:
[:i| len := len + ((rcvrPtr at: i) * (rcvrPtr at: i)) ].
len > 0.0 ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
len := self sqrt: len.
0 to: length - 1 do:
[:i| rcvrPtr at: i put: (rcvrPtr at: i) / len ].
"Leave receiver on the stack."!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveSubFloat64Array (in category 'arithmetic primitives') -----
primitiveSubFloat64Array
"Primitive. Subtract each element in the argument from each element in the receiver, both Float64Arrays and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length |
<var: #rcvrPtr type: #'double *'>
<var: #argPtr type: #'double *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isLong64s: arg)
and: [(interpreterProxy isLong64s: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (rcvrPtr at: i) - (argPtr at: i).
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveSubScalar (in category 'arithmetic primitives') -----
primitiveSubScalar
"Primitive. Subtract the argument, a scalar value from each element in the receiver, a Float64Array"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr value length |
<var: #value type: #double>
<var: #rcvrPtr type:#'double *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (rcvrPtr at: i) - value.
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: Float64ArrayPlugin>>primitiveSum (in category 'arithmetic primitives') -----
primitiveSum
"Primitive. Answer the sum of each float in the receiver, a Float64Array."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr length sum |
<var: #sum type: #double>
<var: #rcvrPtr type: #'double *'>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isLong64s: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'double *'.
sum := 0.0.
0 to: length-1 do:[:i|
sum := sum + (rcvrPtr at: i).
].
+ ^interpreterProxy methodReturnFloat: sum!
- interpreterProxy methodReturnFloat: sum!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveAddFloatArray (in category 'arithmetic primitives') -----
primitiveAddFloatArray
"Primitive. Add the receiver and the argument, both FloatArrays and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg rcvrPtr argPtr length |
- <export: true>
<var: #rcvrPtr type: #'float *'>
<var: #argPtr type: #'float *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isWords: arg)
and: [(interpreterProxy isWords: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'float *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) + (self cCoerce: (argPtr at: i) to: #double)].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1. "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveAddScalar (in category 'arithmetic primitives') -----
primitiveAddScalar
"Primitive. Add the argument, a scalar value to the receiver, a FloatArray"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr rcvrPtr value length |
- <export: true>
<var: #value type: #double>
<var: #rcvrPtr type:#'float *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) + value].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1. "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveAt (in category 'access primitives') -----
primitiveAt
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| index rcvr floatPtr |
<var: #floatPtr type: #'float *'>
index := interpreterProxy stackIntegerValue: 0.
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy failed not
and: [(interpreterProxy isWords: rcvr)
and: [index > 0 and: [index <= (interpreterProxy slotSizeOf: rcvr)]]]) ifFalse:
[^interpreterProxy primitiveFail].
floatPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
+ ^interpreterProxy methodReturnFloat: (floatPtr at: index - 1)!
- interpreterProxy methodReturnFloat: (floatPtr at: index - 1)!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveAtPut (in category 'access primitives') -----
primitiveAtPut
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
-
| value floatValue index rcvr floatPtr |
- <export: true>
<var: #floatValue type: #double>
<var: #floatPtr type: #'float *'>
value := interpreterProxy stackValue: 0.
floatValue := (interpreterProxy isIntegerObject: value)
ifTrue: [(interpreterProxy integerValueOf: value) asFloat]
ifFalse: [interpreterProxy floatValueOf: value].
index := interpreterProxy stackIntegerValue: 1.
rcvr := interpreterProxy stackValue: 2.
(interpreterProxy failed not
and: [(interpreterProxy isWords: rcvr)
and: [index > 0 and: [index <= (interpreterProxy slotSizeOf: rcvr)]]]) ifFalse:
[^interpreterProxy primitiveFail].
floatPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
floatPtr at: index-1 put: (self cCoerce: floatValue to: #float).
+ ^interpreterProxy methodReturnValue: value!
- interpreterProxy pop: 3 thenPush: value!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveDivFloatArray (in category 'arithmetic primitives') -----
primitiveDivFloatArray
"Primitive. Divide each element in the receiver by the corresponding element in the argument, both FloatArrays, and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length |
<var: #rcvrPtr type: #'float *'>
<var: #argPtr type: #'float *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isWords: arg)
and: [(interpreterProxy isWords: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'float *'.
"Check if any of the argument's values is zero"
0 to: length - 1 do:
[:i| (argPtr at: i) = (self cCoerce: 0.0 to: #float) ifTrue: "i.e. check for both 0.0 and -0.0"
[^interpreterProxy primitiveFail]].
0 to: length - 1 do:
[:i| rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) / (self cCoerce: (argPtr at: i) to: #double)].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveDivScalar (in category 'arithmetic primitives') -----
primitiveDivScalar
"Primitive. Divide each element in the receiver by the argument, a scalar, and store the result into the receiver, a FloatArray"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr rcvrPtr value inverse length |
- <export: true>
<var: #inverse type:'double '>
<var: #value type: #double>
<var: #rcvrPtr type:#'float *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
inverse := 1.0 / value.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) * inverse.
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveDotProduct (in category 'arithmetic primitives') -----
primitiveDotProduct
"Primitive. Compute the dot product of the receiver and the argument.
The dot product is defined as the sum of the products of the individual elements."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length result |
<var: #result type: #double>
<var: #rcvrPtr type: #'float *'>
<var: #argPtr type: #'float *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isWords: arg)
and: [(interpreterProxy isWords: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'float *'.
result := 0.0.
0 to: length-1 do:[:i|
result := result + ((self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (argPtr at: i) to: #double)).
].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy methodReturnFloat: result. "Return result"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveEqual (in category 'access primitives') -----
primitiveEqual
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
-
| rcvr arg rcvrPtr argPtr length |
- <export: true>
<var: #rcvrPtr type: #'float *'>
<var: #argPtr type: #'float *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isWords: arg)
and: [(interpreterProxy isWords: rcvr)]) ifFalse:
[^interpreterProxy primitiveFail].
- interpreterProxy pop: 2.
(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr) ifFalse:
+ [^interpreterProxy methodReturnBool: false].
- [^interpreterProxy pushBool: false].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'float *'.
0 to: length-1 do:[:i|
+ (rcvrPtr at: i) = (argPtr at: i) ifFalse:[^interpreterProxy methodReturnBool: false].
- (rcvrPtr at: i) = (argPtr at: i) ifFalse:[^interpreterProxy pushBool: false].
].
+ ^interpreterProxy methodReturnBool: true!
- ^interpreterProxy pushBool: true!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveFromFloat64Array (in category 'access primitives') -----
primitiveFromFloat64Array
"Primitive. Set each element of the receiver, a FloatArray with that of the argument, a Float64Array and return the receiver.
Note that this conversion might loose bits, or generate overflow.
Fail if both have different size"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg rcvrPtr argPtr length |
- <export: true>
<option: #SPURVM>
<var: #rcvrPtr type: #'float *'>
<var: #argPtr type: #'double *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isLong64s: arg)
and: [(interpreterProxy isWords: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'double *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (argPtr at: i) to: #float)].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1. "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveHashArray (in category 'access primitives') -----
primitiveHashArray
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
-
| rcvr rcvrPtr length result |
- <export: true>
<var: #rcvrPtr type: #'unsigned int *'>
<var: #result type: #'unsigned int'>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'unsigned int *'.
result := 0.
0 to: length-1 do:[:i|
result := result + (rcvrPtr at: i).
].
+ ^interpreterProxy methodReturnInteger: (result bitAnd: 16r1FFFFFFF)!
- interpreterProxy methodReturnInteger: (result bitAnd: 16r1FFFFFFF)!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveLength (in category 'arithmetic primitives') -----
primitiveLength
"Primitive. Compute the length of the argument (sqrt of sum of component squares)."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr length len |
<var: #rcvrPtr type: #'float *'>
<var: #len type: #double>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
len := 0.0.
0 to: length-1 do:
[:i| len := len + ((self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (rcvrPtr at: i) to: #double)) ].
len > 0.0 ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
+ ^interpreterProxy methodReturnFloat: (self sqrt: len)!
- interpreterProxy methodReturnFloat: (self sqrt: len)!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveMulFloatArray (in category 'arithmetic primitives') -----
primitiveMulFloatArray
"Primitive. Multiply the receiver and the argument, both FloatArrays and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length |
<var: #rcvrPtr type: #'float *'>
<var: #argPtr type: #'float *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isWords: arg)
and: [(interpreterProxy isWords: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'float *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (argPtr at: i) to: #double).
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveMulScalar (in category 'arithmetic primitives') -----
primitiveMulScalar
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
"Primitive. Multiply elements in the receiver, a FloatArray, by argument, a scalar value, and store the result into the receiver."
| rcvr rcvrPtr value length |
<var: #value type: #double>
<var: #rcvrPtr type:#'float *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) * value.
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveNormalize (in category 'arithmetic primitives') -----
primitiveNormalize
"Primitive. Normalize the argument (A FloatArray) in place."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr length len |
<var: #rcvrPtr type: #'float *'>
<var: #len type: #double>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
len := 0.0.
0 to: length - 1 do:
[:i| len := len + ((self cCoerce: (rcvrPtr at: i) to: #double) * (self cCoerce: (rcvrPtr at: i) to: #double)) ].
len > 0.0 ifFalse:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
len := self sqrt: len.
0 to: length - 1 do:
[:i| rcvrPtr at: i put: ((self cCoerce: (rcvrPtr at: i) to: #double) / len) ].
"Leave receiver on the stack."!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveSubFloatArray (in category 'arithmetic primitives') -----
primitiveSubFloatArray
"Primitive. Subtract each element in the argument from each element in the receiver, both FloatArrays and store the result into the receiver."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr arg rcvrPtr argPtr length |
<var: #rcvrPtr type: #'float *'>
<var: #argPtr type: #'float *'>
arg := interpreterProxy stackValue: 0.
rcvr := interpreterProxy stackValue: 1.
((interpreterProxy isWords: arg)
and: [(interpreterProxy isWords: rcvr)
and: [(length := interpreterProxy stSizeOf: arg) = (interpreterProxy stSizeOf: rcvr)]]) ifFalse:
[^interpreterProxy primitiveFail].
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
argPtr := self cCoerce: (interpreterProxy firstIndexableField: arg) to: #'float *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) - (self cCoerce: (argPtr at: i) to: #double).
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveSubScalar (in category 'arithmetic primitives') -----
primitiveSubScalar
"Primitive. Subtract the argument, a scalar value from each element in the receiver, a FloatArray"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr value length |
<var: #value type: #double>
<var: #rcvrPtr type:#'float *'>
value := interpreterProxy stackFloatValue: 0.
interpreterProxy failed ifTrue:[^nil].
rcvr := interpreterProxy stackValue: 1.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
0 to: length-1 do:[:i|
rcvrPtr at: i put: (self cCoerce: (rcvrPtr at: i) to: #double) - value.
].
+ ^interpreterProxy methodReturnReceiver!
- interpreterProxy pop: 1 "Leave rcvr on stack"!
Item was changed:
----- Method: FloatArrayPlugin>>primitiveSum (in category 'arithmetic primitives') -----
primitiveSum
"Primitive. Answer the sum of each float in the receiver, a FloatArray."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- <export: true>
| rcvr rcvrPtr length sum |
<var: #sum type: #double>
<var: #rcvrPtr type: #'float *'>
rcvr := interpreterProxy stackValue: 0.
(interpreterProxy isWords: rcvr) ifFalse:
[^interpreterProxy primitiveFail].
length := interpreterProxy stSizeOf: rcvr.
rcvrPtr := self cCoerce: (interpreterProxy firstIndexableField: rcvr) to: #'float *'.
sum := 0.0.
0 to: length-1 do:[:i|
sum := sum + (self cCoerce: (rcvrPtr at: i) to: #double).
].
+ ^interpreterProxy methodReturnFloat: sum!
- interpreterProxy methodReturnFloat: sum!
Item was changed:
----- Method: FloatMathPlugin>>primitiveArcCos (in category 'float primitives') -----
primitiveArcCos
"Computes acos(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_acos(rcvr)' inSmalltalk: [rcvr arcCos].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveArcCosH (in category 'float primitives') -----
primitiveArcCosH
"Computes acosh(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_acosh(rcvr)' inSmalltalk: [rcvr arcCosH].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveArcSin (in category 'float primitives') -----
primitiveArcSin
"Computes asin(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_asin(rcvr)' inSmalltalk: [rcvr arcSin].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveArcSinH (in category 'float primitives') -----
primitiveArcSinH
"Computes asinh(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_asinh(rcvr)' inSmalltalk: [rcvr arcSinH].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveArcTan (in category 'float primitives') -----
primitiveArcTan
"Computes atan(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_atan(rcvr)' inSmalltalk: [rcvr arcTan].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveArcTan2 (in category 'float primitives') -----
primitiveArcTan2
"Computes atan2(receiver, arg)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg result |
+ <var: #rcvr type: #double>
+ <var: #arg type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #arg type: 'double'>
- <var: #result type: 'double'>
arg := interpreterProxy stackFloatValue: 0.
rcvr := interpreterProxy stackFloatValue: 1.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_atan2(rcvr, arg)' inSmalltalk: [rcvr arcTan: arg].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveArcTanH (in category 'float primitives') -----
primitiveArcTanH
"Computes atanh(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_atanh(rcvr)' inSmalltalk: [rcvr arcTanH].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveCos (in category 'float primitives') -----
primitiveCos
"Computes cos(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_cos(rcvr)' inSmalltalk: [rcvr cos].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveCosH (in category 'float primitives') -----
primitiveCosH
"Computes cosh(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_cosh(rcvr)' inSmalltalk: [rcvr cosH].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveExp (in category 'float primitives') -----
primitiveExp
"Computes E raised to the receiver power."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := (self cCode: '__ieee754_exp(rcvr)' inSmalltalk: [rcvr exp]).
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveFMod (in category 'float primitives') -----
primitiveFMod
"Computes receiver \\ arg"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg result |
+ <var: #rcvr type: #double>
+ <var: #arg type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #arg type: 'double'>
- <var: #result type: 'double'>
arg := interpreterProxy stackFloatValue: 0.
rcvr := interpreterProxy stackFloatValue: 1.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_fmod(rcvr, arg)' inSmalltalk: [rcvr \\ arg].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveFractionalPart (in category 'float primitives') -----
primitiveFractionalPart
"Computes receiver \\ 1.0"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result trunc |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
+ <var: #trunc type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
- <var: #trunc type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_modf(rcvr, &trunc)' inSmalltalk: [rcvr fractionPart].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveHypot (in category 'float primitives') -----
primitiveHypot
"hypot(x,y) returns sqrt(x^2+y^2) with error less than 1 ulps"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg result |
+ <var: #rcvr type: #double>
+ <var: #arg type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #arg type: 'double'>
- <var: #result type: 'double'>
arg := interpreterProxy stackFloatValue: 0.
rcvr := interpreterProxy stackFloatValue: 1.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_hypot(rcvr, arg)' inSmalltalk: [rcvr hypot: arg].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveLog10 (in category 'float primitives') -----
primitiveLog10
"Computes log10(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
rcvr < 0.0 ifTrue:[^interpreterProxy primitiveFail].
result := self cCode: '__ieee754_log10(rcvr)' inSmalltalk: [rcvr log: 10].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveLogN (in category 'float primitives') -----
primitiveLogN
"Computes log(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
rcvr < 0.0 ifTrue:[^interpreterProxy primitiveFail].
result := self cCode: '__ieee754_log(rcvr)' inSmalltalk: [rcvr ln].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveRaisedToPower (in category 'float primitives') -----
primitiveRaisedToPower
"Computes receiver**arg"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg result |
+ <var: #rcvr type: #double>
+ <var: #arg type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #arg type: 'double'>
- <var: #result type: 'double'>
arg := interpreterProxy stackFloatValue: 0.
rcvr := interpreterProxy stackFloatValue: 1.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_pow(rcvr, arg)' inSmalltalk: [rcvr raisedTo: arg].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveSin (in category 'float primitives') -----
primitiveSin
"Computes sin(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_sin(rcvr)' inSmalltalk: [rcvr sin].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveSinH (in category 'float primitives') -----
primitiveSinH
"Computes sinh(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_sinh(rcvr)' inSmalltalk: [rcvr sinH].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveSqrt (in category 'float primitives') -----
primitiveSqrt
"Computes sqrt(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
rcvr < 0.0 ifTrue:[^interpreterProxy primitiveFail].
result := self cCode: '__ieee754_sqrt(rcvr)' inSmalltalk: [rcvr sqrt].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveTan (in category 'float primitives') -----
primitiveTan
"Computes tan(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_tan(rcvr)' inSmalltalk: [rcvr tan].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveTanH (in category 'float primitives') -----
primitiveTanH
"Computes tanh(receiver)"
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr result |
+ <var: #rcvr type: #double>
+ <var: #result type: #double>
- <export: true>
- <var: #rcvr type: 'double'>
- <var: #result type: 'double'>
rcvr := interpreterProxy stackFloatValue: 0.
+ interpreterProxy failed ifTrue:[^nil].
- (interpreterProxy failed) ifTrue:[^nil].
result := self cCode: '__ieee754_tanh(rcvr)' inSmalltalk: [rcvr tanH].
(self isnan: result) ifTrue:[^interpreterProxy primitiveFail].
+ ^interpreterProxy methodReturnFloat: result!
- interpreterProxy pop: interpreterProxy methodArgumentCount + 1.
- interpreterProxy pushFloat: result.!
Item was changed:
----- Method: FloatMathPlugin>>primitiveTimesTwoPower (in category 'float primitives') -----
primitiveTimesTwoPower
"Multiply the receiver by the power of the argument."
+ <export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
| rcvr arg result |
- <export: true>
<var: #rcvr type: #double>
<var: #result type: #double>
arg := interpreterProxy stackIntegerValue: 0.
rcvr := interpreterProxy stackFloatValue: 1.
interpreterProxy failed ifTrue:
[^nil].
interpreterProxy bytesPerOop > 4 ifTrue:
[| twiceMaxExponent | "clip arg to at most int range; ldexp's last arg is of type int"
twiceMaxExponent := 2 * (1 << self floatExponentBits).
arg < twiceMaxExponent negated
ifTrue: [arg := twiceMaxExponent negated]
ifFalse: [arg > twiceMaxExponent ifTrue:
[arg := twiceMaxExponent]]].
result := self cCode: '__ieee754_ldexp(rcvr, (int)arg)'
inSmalltalk: [rcvr timesTwoPower: arg].
(self isnan: result) ifFalse:
[interpreterProxy methodReturnFloat: result].
^nil!
Item was changed:
----- Method: VMPluginCodeGenerator>>emitExportsOn: (in category 'C code generator') -----
emitExportsOn: aStream
"Store all the exported primitives in the form used by the internal named prim system."
- | nilVMClass |
- (nilVMClass := vmClass isNil) ifTrue: "We need a vmClass temporarily to compute accessor depths."
- [vmClass := StackInterpreter].
aStream cr; cr; nextPutAll:'#ifdef SQUEAK_BUILTIN_PLUGIN'.
self emitExportsNamed: pluginClass moduleName
pluginName: pluginClass internalModuleName
on: aStream.
+ aStream cr; nextPutAll: '#else // ifdef SQ_BUILTIN_PLUGIN'; cr; cr.
- aStream cr; nextPutAll: '#else /* ifdef SQ_BUILTIN_PLUGIN */'; cr; cr.
self emitPrimitiveMetadataOn: aStream.
+ aStream cr; nextPutAll: '#endif // ifdef SQ_BUILTIN_PLUGIN'; cr!
- aStream cr; nextPutAll: '#endif /* ifdef SQ_BUILTIN_PLUGIN */'; cr.
- nilVMClass ifTrue:
- [vmClass := nil]!
Item was changed:
----- Method: VMPluginCodeGenerator>>emitPrimitiveMetadataOn: (in category 'C code generator') -----
emitPrimitiveMetadataOn: aStream
"Output accessor depth bytes for all primitives in the plugin.
This is for external primitives in Spur."
+ | exports |
+ (exports := self exportsNeedingMetadata) isEmpty ifTrue: [^self].
+ aStream nextPutAll: '#if SPURVM'; cr.
+ exports do:
- self exportsNeedingMetadata do:
[:method| | primName depth exportFlags |
primName := self cFunctionNameFor: method selector.
depth := self accessorDepthForMethod: method.
exportFlags := CoInterpreter metadataFlagsForPrimitive: method compiledMethod.
(depth >= 0 or: [exportFlags > 0]) ifTrue:
["store the metadata in a short variable; save a little space
by omitting depths < 0; support code supplies the default."
self assert: depth < 128.
self withOptionalConditionalDefineFor: method
on: aStream
do: [aStream
nextPutAll: 'EXPORT(signed short) ';
nextPutAll: primName;
nextPutAll: 'Metadata = ';
nextPutAll: (self cLiteralFor: (depth bitShift: 8) + exportFlags);
nextPut: $;;
+ cr]]].
+ aStream nextPutAll: '#endif // SPURVM'; cr!
- cr]]]!
More information about the Vm-dev
mailing list