[Mono-dev] JIT: MonoReg to replace gssize for registers

Mark Mason mmason at upwardaccess.com
Mon Dec 15 17:30:36 EST 2008


Hello,

On Sun, 2008-12-14 at 10:13 +0100, Zoltan Varga wrote:
> Hi,
> 
>   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
+ */
+#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;
@@ -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]
+#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




More information about the Mono-devel-list mailing list