[Vm-dev] VM Maker Inbox: VMMaker.oscog-KenD.2509.mcz

Eliot Miranda eliot.miranda at gmail.com
Mon Jan 21 02:52:02 UTC 2019


Hi Ken,

    this all looks fine.  I see one minor slip.  You're supplied

ThreadedFFICalloutStateForARM64>>instVarNamesAndTypesForTranslationDo:
aBinaryBlock
"enumerate aBinaryBlock with the names and C type strings for the inst vars
to include in a ThreadedFFICalloutState struct."

superclass instVarNamesAndTypesForTranslationDo: aBinaryBlock.
self instVarNames do:
[:ivn|
aBinaryBlock
value: ivn
value: (ivn caseOf: {
['integerRegisters'] -> [{#sqLong. '[NumIntRegArgs]'}].
['floatRegisters'] -> [{#double. '[NumFloatRegArgs]'}] }
otherwise:
[#sqLong])]

which differs from the 32-bit ARM one in using double vs float and sqLong
vs sqInt.  Using double vs long is correct.   But using sqLong is
unnecessary, since in 64-bits saint is equal to sqLong, so I would have
written it using saint instead.  But it's fine as is.  I just wanted you to
know that in 64-bits sqInt must be a signed 64-bit type (at least in the
VMMaker.oscog fork).

On Sun, Jan 20, 2019 at 6:40 PM <commits at source.squeak.org> wrote:

>
> Eliot Miranda uploaded a new version of VMMaker to project VM Maker Inbox:
> http://source.squeak.org/VMMakerInbox/VMMaker.oscog-KenD.2509.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-KenD.2509
> Author: KenD
> Time: 20 January 2019, 7:38:17.915054 pm
> UUID: adac22d0-d981-4329-85ee-a8cf5647f645
> Ancestors: VMMaker.oscog-eem.2508
>
> Saved Progress in arm64ffi
>
> =============== Diff against VMMaker.oscog-eem.2508 ===============
>
> Item was changed:
>   ----- Method: RiscOSVMMaker class>>generateSqueakStackVM (in category
> 'configurations') -----
>   generateSqueakStackVM
>         "RISC OS version; build needed plugins, make sure filename
> tweaking is used"
>   "RiscOSVMMaker generateSqueakStackVM"
>         ^self
>                 generate: StackInterpreter
>                 to: (FileDirectory default directoryNamed: 'stacksrc')
> fullName
>                 platformDir: (FileDirectory default directoryNamed:
> 'platforms') fullName
> +               excluding: #(AsynchFilePlugin BrokenPlugin CroquetPlugin
> FFIPlugin IA32ABIPlugin ImmX11Plugin InternetConfigPlugin
> JoystickTabletPlugin MIDIPlugin MacMenubarPlugin Mpeg3Plugin
> NewsqueakIA32ABIPlugin QuicktimePlugin SerialPlugin  TestOSAPlugin
> ThreadedARMFFIPlugin ThreadedARMFFI64Plugin ThreadedFFIPlugin
> ThreadedIA32FFIPlugin ThreadedPPCBEFFIPlugin UUIDPlugin
> VMProfileMacSupportPlugin)!
> -               excluding: #(AsynchFilePlugin BrokenPlugin CroquetPlugin
> FFIPlugin IA32ABIPlugin ImmX11Plugin InternetConfigPlugin
> JoystickTabletPlugin MIDIPlugin MacMenubarPlugin Mpeg3Plugin
> NewsqueakIA32ABIPlugin QuicktimePlugin SerialPlugin  TestOSAPlugin
> ThreadedARMFFIPlugin ThreadedFFIPlugin ThreadedIA32FFIPlugin
> ThreadedPPCBEFFIPlugin UUIDPlugin VMProfileMacSupportPlugin)!
>
> Item was added:
> + ----- Method: ThreadedARM64FFIPlugin class>>calloutStateClass (in
> category 'translation') -----
> + calloutStateClass
> +       ^ThreadedFFICalloutStateForARM64!
>
> Item was added:
> + ----- Method: ThreadedARM64FFIPlugin>>ffiPushDoubleFloat:in: (in
> category 'marshalling') -----
> + ffiPushDoubleFloat: value in: calloutState
> +       <var: #value type: #double>
> +       <var: #calloutState type: #'CalloutState *'>
> +       <inline: #always>
> +
> +       calloutState floatRegisterIndex < (NumFloatRegArgs - 1)
> +               ifTrue:
> +                       [(self cCoerceSimple:
> +                               (self addressOf: (calloutState
> floatRegisters at: calloutState floatRegisterIndex))
> +                                        to: 'double*')
> +                               at: 0
> +                               put: value.
> +                        calloutState floatRegisterIndex: calloutState
> floatRegisterIndex + 2]
> +               ifFalse:
> +                       [calloutState currentArg + self wordSize >
> calloutState limit ifTrue:
> +                               [^FFIErrorCallFrameTooBig].
> +                        calloutState floatRegisterIndex: NumFloatRegArgs.
> +                        interpreterProxy storeFloatAtPointer:
> calloutState currentArg from: value.
> +                        calloutState currentArg: calloutState currentArg
> + self wordSize].
> +       ^0!
>
> Item was added:
> + ----- Method: ThreadedARM64FFIPlugin>>ffiPushSignedInt:in: (in category
> 'marshalling') -----
> + ffiPushSignedInt: value in: calloutState
> +       <var: #calloutState type: #'CalloutState *'>
> +       <inline: true>
> +       calloutState integerRegisterIndex < NumIntRegArgs
> +               ifTrue:
> +                       [calloutState integerRegisters
> +                               at: calloutState integerRegisterIndex
> +                               put: (self cCoerceSimple: value to:
> #sqLong).
> +                        calloutState integerRegisterIndex: calloutState
> integerRegisterIndex + 1]
> +               ifFalse:
> +                       [calloutState currentArg + self wordSize >
> calloutState limit ifTrue:
> +                               [^FFIErrorCallFrameTooBig].
> +                        interpreterProxy longAt: calloutState currentArg
> put: value.
> +                        calloutState currentArg: calloutState currentArg
> + self wordSize].
> +       ^0
> + !
>
> Item was added:
> + ----- Method: ThreadedARM64FFIPlugin>>ffiPushSignedLongLong:in: (in
> category 'marshalling') -----
> + ffiPushSignedLongLong: value in: calloutState
> +       <var: #value type: #sqLong>
> +       <var: #calloutState type: #'CalloutState *'>
> +       <inline: true>
> +       calloutState integerRegisterIndex < NumIntRegArgs
> +               ifTrue:
> +                       [calloutState integerRegisters
> +                               at: calloutState integerRegisterIndex
> +                               put: (self cCoerceSimple: value to:
> #sqLong).
> +                        calloutState integerRegisterIndex: calloutState
> integerRegisterIndex + 1]
> +               ifFalse:
> +                       [calloutState currentArg + self wordSize >
> calloutState limit ifTrue: [^FFIErrorCallFrameTooBig].
> +                        interpreterProxy longAt: calloutState currentArg
> put: value.
> +                        calloutState currentArg: calloutState currentArg
> + self wordSize].
> +       ^0!
>
> Item was added:
> + ----- Method: ThreadedARM64FFIPlugin>>ffiPushSingleFloat:in: (in
> category 'marshalling') -----
> + ffiPushSingleFloat: value in: calloutState
> +       <var: #value type: #float>
> +       <var: #calloutState type: #'CalloutState *'>
> +       <inline: #always>
> +       calloutState floatRegisterIndex < NumFloatRegArgs
> +               ifTrue:
> +                       [calloutState floatRegisters
> +                               at: calloutState floatRegisterIndex
> +                               put: (self cCoerceSimple: value to:
> #double).
> +                        calloutState floatRegisterIndex: calloutState
> floatRegisterIndex + 2]
> +               ifFalse:
> +                       [calloutState currentArg + self wordSize >
> calloutState limit ifTrue:
> +                               [^FFIErrorCallFrameTooBig].
> +                        interpreterProxy storeSingleFloatAtPointer:
> calloutState currentArg from: value.
> +                        calloutState currentArg: calloutState currentArg
> + self wordSize].
> +       ^0!
>
> Item was added:
> + ----- 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.
> +                                        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>>ffiPushUnsignedInt:in: (in
> category 'marshalling') -----
> + ffiPushUnsignedInt: value in: calloutState
> +       <var: #calloutState type: #'CalloutState *'>
> +       <inline: true>
> +       calloutState integerRegisterIndex < NumIntRegArgs
> +               ifTrue:
> +                       [calloutState integerRegisters
> +                               at: calloutState integerRegisterIndex
> +                               put:  (self cCoerceSimple: value to:
> #usqLong).
> +                        calloutState integerRegisterIndex: calloutState
> integerRegisterIndex + 1]
> +               ifFalse:
> +                       [calloutState currentArg + self wordSize >
> calloutState limit ifTrue:
> +                               [^FFIErrorCallFrameTooBig].
> +                        interpreterProxy longAt: calloutState currentArg
> put: value.
> +                        calloutState currentArg: calloutState currentArg
> + self wordSize].
> +       ^0
> +
> + !
>
> Item was added:
> + ----- Method: ThreadedARM64FFIPlugin>>ffiPushUnsignedLongLong:in: (in
> category 'marshalling') -----
> + ffiPushUnsignedLongLong: value in: calloutState
> +       <var: #value type: #usqLong>
> +       <var: #calloutState type: #'CalloutState *'>
> +       <inline: true>
> +       calloutState integerRegisterIndex < NumIntRegArgs
> +               ifTrue:
> +                       [calloutState integerRegisters
> +                               at: calloutState integerRegisterIndex
> +                               put:(self cCoerceSimple: value to:
> #usqLong).
> +                        calloutState integerRegisterIndex: calloutState
> integerRegisterIndex + 1]
> +               ifFalse:
> +                       [calloutState currentArg + self wordSize >
> calloutState limit ifTrue: [^FFIErrorCallFrameTooBig].
> +                        interpreterProxy longAt: calloutState currentArg
> put: value.
> +                        calloutState currentArg: calloutState currentArg
> + self wordSize].
> +       ^0
> + !
>
> Item was added:
> + ThreadedFFICalloutStateForARM subclass: #ThreadedFFICalloutStateForARM64
> +       instanceVariableNames: ''
> +       classVariableNames: ''
> +       poolDictionaries: ''
> +       category: 'VMMaker-Plugins-FFI'!
>
> Item was added:
> + ----- Method: ThreadedFFICalloutStateForARM64
> class>>instVarNamesAndTypesForTranslationDo: (in category 'translation')
> -----
> + instVarNamesAndTypesForTranslationDo: aBinaryBlock
> +       "enumerate aBinaryBlock with the names and C type strings for the
> inst vars to include in a ThreadedFFICalloutState struct."
> +
> +       superclass instVarNamesAndTypesForTranslationDo: aBinaryBlock.
> +       self instVarNames do:
> +               [:ivn|
> +               aBinaryBlock
> +                       value: ivn
> +                       value: (ivn caseOf: {
> +                                               ['integerRegisters']    ->
> [{#sqLong. '[NumIntRegArgs]'}].
> +                                               ['floatRegisters']      ->
> [{#double. '[NumFloatRegArgs]'}] }
> +                                       otherwise:
> +                                               [#sqLong])]!
>
> Item was added:
> + ----- Method: ThreadedFFICalloutStateForARM64>>initialize (in category
> 'initialize-release') -----
> + initialize
> +       super initialize.
> +       "Override with proper # regs"
> +       integerRegisters := CArrayAccessor on: (Array new:
> ThreadedARM64FFIPlugin numIntRegArgs).
> +       floatRegisters     := CArrayAccessor on: (Array new:
> ThreadedARM64FFIPlugin numFloatRegArgs)!
>
> Item was changed:
>   ----- Method: ThreadedFFIPlugin class>>preambleCCode (in category
> 'translation') -----
>   preambleCCode
>         "For a source of builtin defines grep for builtin_define in a gcc
> release config directory.
>          See See platforms/Cross/vm/sqCogStackAlignment.h for per-platform
> definitions for
>          STACK_ALIGN_BYTES MUST_ALIGN_STACK et al."
>         ^'
>   #include "sqAssert.h" /* for assert */
>   #define ThreadedFFIPlugin 1 /* to filter-out unwanted declarations from
> sqFFI.h */
>   #include "sqFFI.h" /* for logging and surface functions */
>   #include "sqCogStackAlignment.h" /* for STACK_ALIGN_BYTES and getsp() */
>
>   #ifdef _MSC_VER
>   # define alloca _alloca
>   #endif
>   #if defined(__GNUC__) && (defined(_X86_) || defined(i386) ||
> defined(__i386) || defined(__i386__))
>   # define setsp(sp) asm volatile ("movl %0,%%esp" : : "m"(sp))
>   # elif defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__)
> ||  defined(__amd64) || defined(__x86_64))
>   # define setsp(sp) asm volatile ("movq %0,%%rsp" : : "m"(sp))
> + # elif defined(__arm64__) || defined(__aarch64__) || defined(ARM64)
> +         /*
> https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm
> +          *
> http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.den0024a/index.html
> +          */
> + #  if __GNUC__
> + #   define getfp() ({ usqIntptr_t fp;
>                        \
> +                                           asm volatile ("mov x0, x29" :
> "=r"(x29) : );  \
> +                                           fp; })
> + #   define getsp() ({ usqIntptr_t sp;
>                        \
> +                                           asm volatile ("mov x0, sp" :
> "=r"(sp) : );    \
> +                                           sp; })
> + # define setsp(sp) asm volatile ("ldr x16, %0 \n\t" "mov sp, x16"  : :
> "m"(sp) )
> + #  endif
>   # elif defined(__GNUC__) && (defined(__arm__))
>   # define setsp(sp) asm volatile ("ldr %%sp, %0" : : "m"(sp))
>   #endif
>   #if !!defined(getsp)
>   # define getsp() 0
>   #endif
>   #if !!defined(setsp)
>   # define setsp(ignored) 0
>   #endif
>
>   #if !!defined(STACK_ALIGN_BYTES)
>   #  define STACK_ALIGN_BYTES 0
>   #endif /* !!defined(STACK_ALIGN_BYTES) */
>
>   /* For ABI that require stack alignment greater than natural word size */
>   #define MUST_ALIGN_STACK (STACK_ALIGN_BYTES > sizeof(void*))
>
>   #if defined(_X86_) || defined(i386) || defined(__i386) ||
> defined(__i386__)
>   /* Both Mac OS X x86 and Win32 x86 return structs of a power of two in
> size
>    * less than or equal to eight bytes in length in registers. Linux never
> does so.
>    */
>   # if __linux__
>   #     define WIN32_X86_STRUCT_RETURN 0
>   # else
>   #     define WIN32_X86_STRUCT_RETURN 1
>   # endif
>   # if _WIN32
>   #     define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 1
>   # endif
>   # elif defined(__amd64__) || defined(__x86_64__) ||  defined(__amd64) ||
> defined(__x86_64)
>   # if _WIN32 | _WIN64
>   #     define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 1
>   # endif
>   #endif /* defined(_X86_) || defined(i386) || defined(__i386) ||
> defined(__i386__) */
>
>   #if !!defined(ALLOCA_LIES_SO_SETSP_BEFORE_CALL)
>   # if defined(__MINGW32__) && !!defined(__clang__) && (__GNUC__ >= 3) &&
> (defined(_X86_) || defined(i386) || defined(__i386) || defined(__i386__))
>       /*
>        * cygwin -mno-cygwin (MinGW) gcc 3.4.x''s alloca is a library
> routine that answers
>        * %esp + xx, so the outgoing stack is offset by one or more word if
> uncorrected.
>        * Grab the actual stack pointer to correct.
>        */
>   #     define ALLOCA_LIES_SO_SETSP_BEFORE_CALL 1
>   # else
>   #     define ALLOCA_LIES_SO_SETSP_BEFORE_CALL 0
>   # endif
>   #endif /* !!defined(ALLOCA_LIES_SO_SETSP_BEFORE_CALL) */
>
>   #if !!defined(PLATFORM_API_USES_CALLEE_POPS_CONVENTION)
>   # define PLATFORM_API_USES_CALLEE_POPS_CONVENTION 0
>   #endif
>
>   /* This alignment stuff is a hack for
> integerAt:put:size:signed:/primitiveFFIIntegerAt[Put].
>    * The assumption right now is that all processors support unaligned
> access.  That only
>    * holds true for x86, x86-64 & ARMv6 & later.  But this keeps us going
> until we can address
>    * it properly.
>    */
>   #define unalignedShortAt(a) shortAt(a)
>   #define unalignedShortAtput(a,v) shortAtput(a,v)
>   #define unalignedLong32At(a) long32At(a)
>   #define unalignedLong32Atput(a,v) long32Atput(a,v)
>   #define unalignedLong64At(a) long64At(a)
>   #define unalignedLong64Atput(a,v) long64Atput(a,v)
>
>   /* The dispatchOn:in:with:with: generates an unwanted call on error.
> Just squash it. */
>   #define error(foo) 0
>   #ifndef SQUEAK_BUILTIN_PLUGIN
>   /* but print assert failures. */
>   void
>   warning(char *s) { /* Print an error message but don''t exit. */
>         printf("\n%s\n", s);
>   }
>   #endif
>
>   /* sanitize */
>   #ifdef SQUEAK_BUILTIN_PLUGIN
>   # define EXTERN
>   #else
>   # define EXTERN extern
>   #endif
>   '!
>
> Item was changed:
>   ----- Method: VMMaker class>>generateVMPlugins (in category
> 'configurations') -----
>   generateVMPlugins
>         ^VMMaker
>                 generatePluginsTo: self sourceTree, '/src'
>                 options: #()
>                 platformDir: self sourceTree, '/platforms'
>                 including:#(    ADPCMCodecPlugin AsynchFilePlugin
>                                         BalloonEnginePlugin
> B3DAcceleratorPlugin B3DEnginePlugin BMPReadWriterPlugin BitBltSimulation
>                                         BochsIA32Plugin BochsX64Plugin
>                                         CameraPlugin CroquetPlugin
> DeflatePlugin DropPlugin
>                                         "Cryptography Plugins:" DESPlugin
> DSAPlugin MD5Plugin SHA256Plugin
>                                         "FT2Plugin" FFTPlugin
> FileCopyPlugin FilePlugin FileAttributesPlugin FloatArrayPlugin
> FloatMathPlugin
>                                         GeniePlugin GdbARMPlugin
> HostWindowPlugin IA32ABIPlugin ImmX11Plugin InternetConfigPlugin
>                                         JPEGReadWriter2Plugin
> JPEGReaderPlugin JoystickTabletPlugin KlattSynthesizerPlugin
>                                         LargeIntegersPlugin LocalePlugin
> MIDIPlugin MacMenubarPlugin Matrix2x3Plugin
>                                         MiscPrimitivePlugin Mpeg3Plugin
> QuicktimePlugin RePlugin
>                                         ScratchPlugin SecurityPlugin
> SerialPlugin SocketPlugin
>                                         SoundCodecPlugin
> SoundGenerationPlugin SoundPlugin SqueakSSLPlugin StarSqueakPlugin
> +                                       ThreadedFFIPlugin
> ThreadedARMFFIPlugin ThreadedARM64FFIPlugin ThreadedIA32FFIPlugin
> +                                       ThreadedX64SysVFFIPlugin
> ThreadedX64Win64FFIPlugin
> -                                       ThreadedFFIPlugin
> ThreadedARMFFIPlugin ThreadedIA32FFIPlugin ThreadedX64SysVFFIPlugin
> ThreadedX64Win64FFIPlugin
>                                         UnicodePlugin UnixAioPlugin
> UUIDPlugin UnixOSProcessPlugin
>                                         Win32OSProcessPlugin
> VMProfileLinuxSupportPlugin VMProfileMacSupportPlugin WeDoPlugin
>                                         XDisplayControlPlugin)!
>
>

-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20190120/f01faa4d/attachment-0001.html>


More information about the Vm-dev mailing list