[Vm-dev] VM Maker: VMMaker.oscog-eem.1426.mcz

Eliot Miranda eliot.miranda at gmail.com
Mon Jul 20 20:35:51 UTC 2015


Hi David,

On Sun, Jul 19, 2015 at 8:52 PM, David T. Lewis <lewis at mail.msen.com> wrote:

>
> On Sun, Jul 19, 2015 at 11:35:46AM -0400, David T. Lewis wrote:
> >
> > On Sat, Jul 18, 2015 at 09:51:30PM -0700, Eliot Miranda wrote:
> > >
> > > On Sat, Jul 18, 2015 at 8:10 PM, David T. Lewis <lewis at mail.msen.com>
> wrote:
> > > >
> > > > I may be missing something, but I do not see anything about the Spur
> > > > 64-bit image format that should require special handling for this.
> > > >
> > >
> > > Yes, I think you're missing something.  let me take you through it.
> We're
> > > talking about evaluating, in a 64-bit C, sizeof(long) == 8,
> sizeof(int) ==
> > > 4, the following two variants:
> > >
> > > #define MillisecondClockMask 0x1FFFFFFF
> > >
> > > (sqInt)((MillisecondClockMask << 3) + 1L)
> > >
> > > (sqInt)(((sqInt)MillisecondClockMask << 3) + 1L)
> > >
> > >
> > > So let's take the first.  The type of MillisecondClockMask is int.  The
> > > type of MillisecondClockMask << 3 is int.  It's bit-pattern is
> 0xFFFFFFF8,
> > > and hence its value is, incorrectly, -8.  So it evaluates to the
> > > SmallInteger -1, not 16r1FFFFFFF as desired.
> > >
> > > In the second, the type of MillisecondClockMask is int. The type of
> > > (sqInt) MillisecondClockMask is long.  The type
> > > of ((sqInt)MillisecondClockMask << 3).  It's bit pattern is also
> 0xFFFFFFF8
> > > but its value is 0xFFFFFFF8, /not/ -8, and so it evaluates to the
> > > SMallInteger 16r1FFFFFFF as desired.
> > >
> > > Does that make sense?
> >
> > Yes, the shift left 3 (rather that 1 in the old object format) is what I
> > was missing.
> >
> > I suspect that a cast to usqInt would accomplish the same thing without
> > the ifTrue: test. Sorry I can't try it right now but it might be worth a
> > look.
> >
>
> At the risk of further annoyance, here is one more question/observation:
>
> In VMMaker.oscog-eem.1417 (and sq.h in platforms sources), we change the
> type of the event buffer from int[8] to long[8], which corrects a failure
> in starting in the 64-bit Spur image. I don't know exactly what was
> failing,
> but I am suspecting perhaps the time stamp field in the event struct was
> being incorrectly converted from its 32 bit int value to an integer object
> in primitiveGetNextEvent, and that using long rather than int fields
> prevented this from happening.
>
> Later, in VMMaker.oscog-eem.1426 we have the fix for conversion of integer
> value to integer object, which particularly affected conversion of
> millisecond clock values. So I wonder if the fix in VMMaker.oscog-eem.1426
> might make the changes in VMMaker.oscog-eem.1417 unnecessary? And if so,
> can the fields of the sqInputEvent struct be changed back from long to
> int (possibly with some performance advantage)?
>

Well, indeed the commit comment on  VMMaker.oscog-eem.1417 is wrong, in
that the size of the evtBuf wasn't the cause of the bug.  But there /is/ a
bug here with 64-bits.  Look at platforms/Cross/vm/sq.h:

The generic input event conforms to int evtBuf[8]:

/* generic input event */
typedef struct sqInputEvent
{
  int type;         /* type of event; either one of EventTypeXXX */
  unsigned int timeStamp;   /* time stamp */
  /* the interpretation of the following fields depend on the type of the
event */
  int unused1;
  int unused2;
  int unused3;
  int unused4;
  int unused5;
  int windowIndex;      /* SmallInteger used in image to identify a host
window structure */
} sqInputEvent;

But the complex event *does not*:

typedef struct sqComplexEvent
    {
        int type;           /* type of event;  EventTypeComplex */
        unsigned int timeStamp; /* time stamp */
        /* the interpretation of the following fields depend on the type
 of the event */
        int action;             /* one of ComplexEventXXX (see below) */
        usqInt objectPointer;   /* used to point to object */
        int unused1;            /*  */
        int unused2;            /*  */
        int unused3;            /*  */
        int windowIndex;    /* host window structure */
    } sqComplexEvent;

In 64-bits usqInt objectPointer occupies 64-bits, not 32, and so
a sqComplexEvent does not conform to int evtBuf[8].


Hence my solution is to change evtBuf to long evtBuf[8], and change all the
fields in the events from (unsigned) int to (unsigned) long.  There is no
performance issue with 32-bits; sizeof(long) == sizeof(int), and in 64 bits
it won't make any difference either; events are simply not that frequent
for this to be an issue.

HTH

_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20150720/e46bedc5/attachment.htm


More information about the Vm-dev mailing list