Mercurial > projects > ddmd
comparison 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 |
comparison
equal
deleted
inserted
replaced
66:efb1e5bdf63c | 67:f708f0452e81 |
---|---|
1149 if (s.isReturnLabel) | 1149 if (s.isReturnLabel) |
1150 s.lblock.Btry = null; | 1150 s.lblock.Btry = null; |
1151 } | 1151 } |
1152 return s.lblock; | 1152 return s.lblock; |
1153 } | 1153 } |
1154 | |
1155 /******************************************* | |
1156 * Generate elem to zero fill contents of Symbol stmp | |
1157 * from *poffset..offset2. | |
1158 * May store anywhere from 0..maxoff, as this function | |
1159 * tries to use aligned int stores whereever possible. | |
1160 * Update *poffset to end of initialized hole; *poffset will be >= offset2. | |
1161 */ | |
1162 | |
1163 elem* fillHole(Symbol* stmp, size_t* poffset, size_t offset2, size_t maxoff) | |
1164 { | |
1165 elem* e = null; | |
1166 int basealign = 1; | |
1167 | |
1168 while (*poffset < offset2) | |
1169 { | |
1170 tym_t ty; | |
1171 elem* e1; | |
1172 | |
1173 if (tybasic(stmp.Stype.Tty) == TYnptr) | |
1174 e1 = el_var(stmp); | |
1175 else | |
1176 e1 = el_ptr(stmp); | |
1177 | |
1178 if (basealign) | |
1179 *poffset &= ~3; | |
1180 | |
1181 basealign = 1; | |
1182 size_t sz = maxoff - *poffset; | |
1183 switch (sz) | |
1184 { | |
1185 case 1: ty = TYchar; break; | |
1186 case 2: ty = TYshort; break; | |
1187 case 3: | |
1188 ty = TYshort; | |
1189 basealign = 0; | |
1190 break; | |
1191 default: | |
1192 ty = TYlong; | |
1193 break; | |
1194 } | |
1195 e1 = el_bin(OPadd, TYnptr, e1, el_long(TYsize_t, *poffset)); | |
1196 e1 = el_una(OPind, ty, e1); | |
1197 e1 = el_bin(OPeq, ty, e1, el_long(ty, 0)); | |
1198 e = el_combine(e, e1); | |
1199 *poffset += tysize[ty]; | |
1200 } | |
1201 return e; | |
1202 } |