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 }