Mercurial > projects > ddmd
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