Hello,

Am 15.12.2008 um 23:30 schrieb Mark Mason:

> On Sun, 2008-12-14 at 10:13 +0100, Zoltan Varga wrote:
>>  There is already a type for this called 'greg_t' on linux. So it
>> might be useful to name the
>> new type something similar, like mgreg_t, or something. Other than
>> that, based on the
>> discussion, I think this is ok to check in.
>
> With this in mind, here is the updated patch. I'm still not entirely
> comfortable with the type aliasing between inst_p* and inst_c*, but I
> think this will come the closest to doing the right thing with minimal
> changes.
>
> /Mark
>
> Index: mini.h
> ===================================================================
> --- mini.h    (revision 121486)
> +++ mini.h    (working copy)
> @@ -400,6 +400,16 @@
>       int size, align;
> } MonoMemcpyArgs;
>
> +/* C type matching the size of a machine register. Not always the  
> same
> as 'int' */
> +/* Note that member 'p' of MonoInst must be the same type, as  
> OP_PCONST
> is defined
> + * as one of the OP_ICONST types, so inst_c0 must be the same as
> inst_p0

Line wrapped.

> + */
> +#if SIZEOF_REGISTER == 4
> +typedef gint32 mgreg_t;
> +#elif SIZEOF_REGISTER == 8
> +typedef gint64 mgreg_t;
> +#endif
> +
> struct MonoInst {
>       guint16 opcode;
>       guint8  type; /* stack type */
> @@ -415,8 +425,14 @@
>               union {
>                       MonoInst *src;
>                       MonoMethodVar *var;
> -                     gssize const_val;
> +                     mgreg_t const_val;
> +#if (SIZEOF_REGISTER > SIZEOF_VOID_P) && (G_BYTE_ORDER ==  
> G_BIG_ENDIAN)
> +                     struct {
> +                             gpointer p[SIZEOF_REGISTER/SIZEOF_VOID_P];
> +                     } pdata;
> +#else
>                       gpointer p;
> +#endif
>                       MonoMethod *method;
>                       MonoMethodSignature *signature;
>                       MonoBasicBlock **many_blocks;

What does endianess have to do with register size?

> @@ -511,8 +527,13 @@
> #define inst_c1 data.op[1].const_val
> #define inst_i0 data.op[0].src
> #define inst_i1 data.op[1].src
> +#if (SIZEOF_REGISTER > SIZEOF_VOID_P) && (G_BYTE_ORDER ==  
> G_BIG_ENDIAN)
> +#define inst_p0 data.op[0].pdata.p[SIZEOF_REGISTER/SIZEOF_VOID_P]
> +#define inst_p1 data.op[1].pdata.p[SIZEOF_REGISTER/SIZEOF_VOID_P]

You are off by one.

Is this not the only place where endianess would matter, i.e. first  
index vs. last index?

> +#else
> #define inst_p0 data.op[0].p
> #define inst_p1 data.op[1].p
> +#endif
> #define inst_l  data.i8const
> #define inst_r  data.r8const
> #define inst_left  data.op[0].src

Andreas

_______________________________________________
Mono-devel-list mailing list
[email protected]
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to