[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