VM Maker Inbox: VMMaker.oscog-KenD.2516.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker Inbox: VMMaker.oscog-KenD.2516.mcz

commits-2
 
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??"!