> > Hello everyone: I made some changes to the Hugs sources which give
> > small runtime speed gains.
> 
> I think you're the first person to look at optimizing Hugs in quite a
> while.  Great stuff!
> 
> I toyed with changing whatIs a few years ago.  Instead of your
> table-based approach, I was thinking of using a bitwise encoding.  My
> idea was to use one bit to select int/not int and that everything else
> would be interpreted as a triple of the form:
> 
>   (WhatisTag,ModuleId,Index)
> 
> Where, for example, the WhatisTag is 5 bits, the ModuleId is 10 bits
> and the Index is 16 bits (the numbers will probably need tweaked
> somewhat). So, each module would have its own set of tables for
> storing names, types, etc.

In the Hugs-alike compiler I was working on a few years ago (never got
around to finishing it) I used the following representation: a 'cell' is
either boxed or unboxed, according to bit zero (0 == a heap reference),
and an unboxed word consists of 7 bits of "tag" (bits 1-8), and 24 bits
of data.  Applications and list cells are just pairs (like Hugs), but
everything else has a "box" tag in the first word.  The heap stored
variable-width objects unlike Hugs which only has pairs, but I don't
think that's relevant.

I think this is pretty similar to what you suggested above, Alastair.

The appropriate macros are:

#define IsRef(c)        (((c) & 1) == 0)
#define IsBox(c)        (((c) & 1) && TagOf(c) >= BoxedThings)
#define IsApp(c)        (IsRef(c) && !IsBox(Fst(c))) 

#define MkValue(c)      ((uint)(c) << 8)
#define ValueOf(c)      ((uint)(c) >> 8)

#define TagOf(c)        ((c) & 0xff)

#define whatIs(c)       (IsRef(c) ? (IsBox(Fst(c)) ? Fst(c) : Ap) :
TagOf(c))

I remember testing various representations at the time, and this one
turned out to be pretty good.

Cheers,
        Simon
_______________________________________________
Hugs-Users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/hugs-users

Reply via email to