diff dmd/codegen/Util.d @ 67:f708f0452e81

some of the backend/codegen stuff implemented
author korDen
date Mon, 23 Aug 2010 21:21:05 +0400
parents fd4acc376c45
children ef02e2e203c2
line wrap: on
line diff
--- a/dmd/codegen/Util.d	Mon Aug 23 20:38:30 2010 +0400
+++ b/dmd/codegen/Util.d	Mon Aug 23 21:21:05 2010 +0400
@@ -1151,3 +1151,52 @@
     }
     return s.lblock;
 }
+
+/*******************************************
+ * Generate elem to zero fill contents of Symbol stmp
+ * from *poffset..offset2.
+ * May store anywhere from 0..maxoff, as this function
+ * tries to use aligned int stores whereever possible.
+ * Update *poffset to end of initialized hole; *poffset will be >= offset2.
+ */
+
+elem* fillHole(Symbol* stmp, size_t* poffset, size_t offset2, size_t maxoff)
+{   
+	elem* e = null;
+    int basealign = 1;
+
+    while (*poffset < offset2)
+    {   
+		tym_t ty;
+		elem* e1;
+
+		if (tybasic(stmp.Stype.Tty) == TYnptr)
+			e1 = el_var(stmp);
+		else
+			e1 = el_ptr(stmp);
+			
+		if (basealign)
+			*poffset &= ~3;
+			
+		basealign = 1;
+		size_t sz = maxoff - *poffset;
+		switch (sz)
+		{   
+			case 1: ty = TYchar;	break;
+			case 2: ty = TYshort;	break;
+			case 3:
+				ty = TYshort;
+				basealign = 0;
+				break;
+			default:
+				ty = TYlong;
+				break;
+		}
+		e1 = el_bin(OPadd, TYnptr, e1, el_long(TYsize_t, *poffset));
+		e1 = el_una(OPind, ty, e1);
+		e1 = el_bin(OPeq, ty, e1, el_long(ty, 0));
+		e = el_combine(e, e1);
+		*poffset += tysize[ty];
+    }
+    return e;
+}
\ No newline at end of file