A new version of VMMaker was added to project VM Maker Inbox: http://source.squeak.org/VMMakerInbox/VMMaker.oscog-KenD.2516.mcz ==================== Summary ==================== Name: VMMaker.oscog-KenD.2516 Author: KenD Time: 26 January 2019, 2:02:25.625799 am UUID: 1401fcfb-5b98-43eb-ad9e-73a3ccf4e8dc Ancestors: VMMaker.oscog-KenD.2514 Retry update to current (1 unit test fails) =============== Diff against VMMaker.oscog-KenD.2513 =============== Item was changed: ----- Method: ThreadedARM64FFIPlugin>>ffiPushStructure:ofSize:typeSpec:ofLength:in: (in category 'marshalling') ----- ffiPushStructure: pointer ofSize: structSize typeSpec: argSpec ofLength: argSpecSize in: calloutState <var: #pointer type: #'void *'> <var: #argSpec type: #'sqInt *'> <var: #calloutState type: #'CalloutState *'> <inline: true> | availableRegisterSpace stackPartSize roundedSize | availableRegisterSpace := (NumIntRegArgs - calloutState integerRegisterIndex) * self wordSize. stackPartSize := structSize. availableRegisterSpace > 0 ifTrue: [structSize <= availableRegisterSpace ifTrue: ["all in registers" stackPartSize := 0. self memcpy: (self cCoerceSimple: (self addressOf: (calloutState integerRegisters at: calloutState integerRegisterIndex)) to: 'void *') _: pointer _: structSize. + "Round structSize up and divide by 8 ( NB: _not_ 4 !!)" + calloutState integerRegisterIndex: calloutState integerRegisterIndex + (structSize + 3 bitShift: -3) ] - calloutState integerRegisterIndex: calloutState integerRegisterIndex + (structSize + 3 bitShift: -2) ] ifFalse: ["If no previous co-processor candidate arg has already been pushed on the stack, then split the struct between registers and stack. Otherwise push entire struct on stack." calloutState currentArg = calloutState argVector ifTrue: [stackPartSize := structSize - availableRegisterSpace. self memcpy: (self cCoerceSimple: (self addressOf: (calloutState integerRegisters at: calloutState integerRegisterIndex)) to: 'void *') _: pointer _: availableRegisterSpace] ifFalse: [availableRegisterSpace := 0]. calloutState integerRegisterIndex: NumIntRegArgs]]. stackPartSize > 0 ifTrue: [roundedSize := stackPartSize + 3 bitClear: 3. calloutState currentArg + roundedSize > calloutState limit ifTrue: [^FFIErrorCallFrameTooBig]. self memcpy: calloutState currentArg _: (self addressOf: ((self cCoerceSimple: pointer to: 'char *') at: availableRegisterSpace)) _: stackPartSize. calloutState currentArg: calloutState currentArg + roundedSize]. ^0! Item was added: + ----- Method: ThreadedARM64FFIPlugin>>nonRegisterStructReturnIsViaImplicitFirstArgument (in category 'marshalling') ----- + nonRegisterStructReturnIsViaImplicitFirstArgument + "Answer if a struct returned in memory is returned to the + referent of a pointer passed as an implciit first argument. + It almost always is. Subclasses can override if not." + ^false! Item was added: + ----- Method: ThreadedARM64FFIPlugin>>returnStructInRegisters: (in category 'marshalling') ----- + returnStructInRegisters: returnStructSize + "Answer if a struct result of a given size is returned in memory or not." + ^returnStructSize <= (2 * self wordSize) "??numIntRegs--> 8 * wordsize??"! |
Free forum by Nabble | Edit this page |