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