DREAMWEB: removed while loops from rep+stos/movs instructions

This commit is contained in:
Vladimir Menshakov 2011-06-16 16:44:58 +04:00
parent 4fd3cdf984
commit d8d16e0231
2 changed files with 71 additions and 114 deletions

View File

@ -34,6 +34,9 @@ class proc:
if not isinstance(stmts[i], cls):
i += 1
continue
if i > 0 and isinstance(stmts[i - 1], op._rep): #skip rep prefixed instructions for now
i += 1
continue
j = i + 1
while j < len(stmts):
@ -49,6 +52,17 @@ class proc:
else:
i = j
i = 0
while i < len(stmts):
if not isinstance(stmts[i], op._rep):
i += 1
continue
if i + 1 >= len(stmts):
break
if isinstance(stmts[i + 1], cls):
stmts[i + 1].repeat = 'context.cx'
del stmts[i]
i += 1
return
def optimize(self):

View File

@ -2711,8 +2711,7 @@ void clearsprites(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768);
context.al = 255;
context.cx = (32)*16;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
}
void makesprite(Context &context) {
@ -2740,8 +2739,7 @@ void delsprite(Context &context) {
context.di = context.bx;
context.cx = (32);
context.al = 255;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
}
void spriteupdate(Context &context) {
@ -4082,8 +4080,7 @@ void updatepeople(Context &context) {
context.data.word(kListpos) = context.di;
context.cx = 12*5;
context.al = 255;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context._inc(context.data.word(kMaintimer));
context.es = context.cs;
context.bx = 534;
@ -4726,8 +4723,7 @@ void delthisone(Context &context) {
deloneloop:
context.push(context.cx);
context.ch = 0;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.cx = context.pop();
context._add(context.di, context.ax);
context._add(context.si, context.dx);
@ -5093,8 +5089,7 @@ void transferinv(Context &context) {
context._mul(context.cx);
context.cx = context.ax;
context.push(context.cx);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.cx = context.pop();
context.ax = context.pop();
context.es.word(context.bx+2) = context.ax;
@ -5141,8 +5136,7 @@ void transfermap(Context &context) {
context._mul(context.cx);
context.cx = context.ax;
context.push(context.cx);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.cx = context.pop();
context.ax = context.pop();
context.es.word(context.bx+2) = context.ax;
@ -5181,8 +5175,7 @@ void clearendpal(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
context.cx = 768;
context.al = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
}
void clearpalette(Context &context) {
@ -5208,8 +5201,7 @@ void fadetowhite(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
context.cx = 768;
context.al = 63;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
context.al = 0;
context._stosb(3);
@ -5226,8 +5218,7 @@ void fadefromwhite(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3));
context.cx = 768;
context.al = 63;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3));
context.al = 0;
context._stosb(3);
@ -5267,13 +5258,11 @@ halfend:
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(56*3);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(56*3);
context.cx = 3*5;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(77*3);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(77*3);
context.cx = 3*2;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.data.byte(kFadedirection) = 1;
context.data.byte(kFadecount) = 31;
context.data.byte(kColourpos) = 0;
@ -5583,8 +5572,7 @@ void paltostartpal(Context &context) {
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3));
context.cx = 768/2;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
}
void endpaltostart(Context &context) {
@ -5594,8 +5582,7 @@ void endpaltostart(Context &context) {
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3));
context.cx = 768/2;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
}
void startpaltoend(Context &context) {
@ -5605,8 +5592,7 @@ void startpaltoend(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3));
context.cx = 768/2;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
}
void paltoendpal(Context &context) {
@ -5616,8 +5602,7 @@ void paltoendpal(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768);
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
context.cx = 768/2;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
}
void allpalette(Context &context) {
@ -5627,8 +5612,7 @@ void allpalette(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3));
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768);
context.cx = 768/2;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
dumpcurrent(context);
}
@ -5654,8 +5638,7 @@ void fadedownmon(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3);
context.cx = 3*8;
context.ax = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3);
context._stosb();
context._stosw();
@ -5675,8 +5658,7 @@ void fadeupmon(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3);
context.cx = 3*8;
context.ax = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3);
context._stosb();
context._stosw();
@ -5696,8 +5678,7 @@ void fadeupmonfirst(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3);
context.cx = 3*8;
context.ax = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3);
context._stosb();
context._stosw();
@ -5720,8 +5701,7 @@ void fadeupyellows(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3);
context.cx = 3*8;
context.ax = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3);
context._stosb();
context._stosw();
@ -5740,8 +5720,7 @@ void initialmoncols(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(230*3);
context.cx = 3*9;
context.ax = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3);
context._stosb();
context._stosw();
@ -6718,8 +6697,7 @@ void findallryan(Context &context) {
context.push(context.di);
context.cx = 30;
context.ax = 0x0ffff;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.di = context.pop();
context.cl = 4;
context.ds = context.data.word(kExtras);
@ -6754,8 +6732,7 @@ void findallopen(Context &context) {
context.push(context.di);
context.cx = 16;
context.ax = 0x0ffff;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.di = context.pop();
context.cl = context.data.byte(kOpenedob);
context.dl = context.data.byte(kOpenedtype);
@ -8572,8 +8549,7 @@ void transfertoex(Context &context) {
context.ds = context.data.word(kFreedat);
context.si = context.ax;
context.cx = 8;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
context.di = context.pop();
context.al = context.data.byte(kReallocation);
context.es.byte(context.di) = context.al;
@ -8653,8 +8629,7 @@ void transfercontoex(Context &context) {
context.ds = context.pop();
context.push(context.di);
context.cx = 8;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
context.di = context.pop();
context.dx = context.pop();
context.al = context.data.byte(kReallocation);
@ -8830,8 +8805,7 @@ void deleteexobject(Context &context) {
context.push(context.cx);
context.al = 255;
context.cx = 16;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.ax = context.pop();
context.cl = context.al;
context._add(context.al, context.al);
@ -8891,8 +8865,7 @@ void deleteexframe(Context &context) {
context._add(context.si, context.ax);
context.push(context.ax);
context.ds = context.es;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.bx = context.pop();
context._sub(context.data.word(kExframepos), context.bx);
context.si = context.pop();
@ -8936,8 +8909,7 @@ findlenextext:
context.push(context.bx);
context.push(context.ax);
context._sub(context.cx, context.bx);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.bx = context.pop();
context._sub(context.data.word(kExtextpos), context.bx);
context.si = context.pop();
@ -9185,8 +9157,7 @@ oberase:
context.di = context.bx;
context.al = 255;
context.cx = (32);
while(context.cx--)
context._stosb();
context._stosb(context.cx);
notthisob:
context.bx = context.pop();
context.cx = context.pop();
@ -9205,8 +9176,7 @@ void showallobs(Context &context) {
context.di = context.bx;
context.cx = 128*5;
context.al = 255;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.es = context.data.word(kSetframes);
context.data.word(kFrsegment) = context.es;
context.ax = (0);
@ -9331,8 +9301,7 @@ void showallfree(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5));
context.cx = 80*5;
context.al = 255;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.es = context.data.word(kFreeframes);
context.data.word(kFrsegment) = context.es;
context.ax = (0);
@ -9415,8 +9384,7 @@ void showallex(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5));
context.cx = 100*5;
context.al = 255;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.es = context.data.word(kExtras);
context.data.word(kFrsegment) = context.es;
context.ax = (0);
@ -10623,14 +10591,12 @@ void usemon(Context &context) {
context.di = 2970+1;
context.cx = 12;
context.al = 32;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.es = context.cs;
context.di = 2942+1;
context.cx = 12;
context.al = 32;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.es = context.cs;
context.di = 2836;
context.es.byte(context.di) = 1;
@ -11001,8 +10967,7 @@ void input(Context &context) {
context.di = 8045;
context.cx = 64;
context.al = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.data.word(kCurpos) = 0;
context.al = '>';
context.di = context.data.word(kMonadx);
@ -11240,8 +11205,7 @@ dirroot:
context.di = 2970;
context._inc(context.di);
context.cx = 12;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
monitorlogo(context);
scrollmonitor(context);
context.al = 9;
@ -11545,8 +11509,7 @@ keyok2:
context.es = context.cs;
context.di = 2970+1;
context.cx = 12;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
monitorlogo(context);
scrollmonitor(context);
context.al = 10;
@ -11666,8 +11629,7 @@ void parser(Context &context) {
context.di = 2942;
context.cx = 13;
context.al = 0;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.di = 2942;
context.al = '=';
context._stosb();
@ -17017,8 +16979,7 @@ alreadyactsave:
context.bx = context.di;
context.es = context.cs;
context.cx = 16;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
context.al = context.data.byte(kRoomssample);
context.es.byte(context.bx+13) = context.al;
context.al = context.data.byte(kMapx);
@ -17376,8 +17337,7 @@ void namestoold(Context &context) {
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
context.es = context.data.word(kBuffers);
context.cx = 17*4;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
}
void oldtonames(Context &context) {
@ -17387,8 +17347,7 @@ void oldtonames(Context &context) {
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5));
context.ds = context.data.word(kBuffers);
context.cx = 17*4;
while(context.cx--)
context._movsb();
context._movsb(context.cx);
}
void saveposition(Context &context) {
@ -17797,8 +17756,7 @@ void trysoundalloc(Context &context) {
context.di = 0;
context.cx = 16384/2;
context.ax = 0x7f7f;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.data.byte(kNeedsoundbuff) = 1;
return;
soundfail:
@ -17940,8 +17898,7 @@ notch0only:
context.di = context.data.word(kSoundbufferwrite);
context.cx = 1024;
context.ax = 0x7f7f;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context._and(context.di, 16384-1);
context.data.word(kSoundbufferwrite) = context.di;
}
@ -18013,8 +17970,7 @@ void channel0tran(Context &context) {
if (!context.flags.z())
goto lowvolumetran;
context.cx = 1024;
while(context.cx--)
context._movsw();
context._movsw(context.cx);
return;
lowvolumetran:
context.cx = 1024;
@ -18465,28 +18421,24 @@ void clearbuffers(Context &context) {
context.cx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0)/2;
context.ax = 0;
context.di = 0;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.es = context.data.word(kExtras);
context.cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2;
context.ax = 0x0ffff;
context.di = 0;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.es = context.data.word(kBuffers);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64));
context.ds = context.cs;
context.si = 534;
context.cx = (991-534);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.es = context.data.word(kBuffers);
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534);
context.ds = context.cs;
context.si = 0;
context.cx = (68-0);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
clearchanges(context);
}
@ -18496,22 +18448,19 @@ void clearchanges(Context &context) {
context.cx = (250)*2;
context.ax = 0x0ffff;
context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80));
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.ds = context.data.word(kBuffers);
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64));
context.es = context.cs;
context.di = 534;
context.cx = (991-534);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.ds = context.data.word(kBuffers);
context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534);
context.es = context.cs;
context.di = 0;
context.cx = (68-0);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.data.byte(kExpos) = 0;
context.data.word(kExframepos) = 0;
context.data.word(kExtextpos) = 0;
@ -18519,8 +18468,7 @@ void clearchanges(Context &context) {
context.cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2;
context.ax = 0x0ffff;
context.di = 0;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.es = context.cs;
context.di = 8011;
context.al = 1;
@ -18531,8 +18479,7 @@ void clearchanges(Context &context) {
context._stosb();
context.ax = 0;
context.cx = 6;
while(context.cx--)
context._stosw();
context._stosw(context.cx);
}
void clearbeforeload(Context &context) {
@ -18563,8 +18510,7 @@ void clearrest(Context &context) {
context.cx = (66*60)/2;
context.ax = 0;
context.di = (0);
while(context.cx--)
context._stosw();
context._stosw(context.cx);
context.es = context.data.word(kBackdrop);
deallocatemem(context);
context.es = context.data.word(kSetframes);
@ -20607,8 +20553,7 @@ finishmakename:
context._stosb();
return;
context.al = 255;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
}
void findobname(Context &context) {
@ -21827,8 +21772,7 @@ blimey:
context.push(context.cx);
context.push(context.si);
context.cx = (66);
while(context.cx--)
context._movsb();
context._movsb(context.cx);
context.si = context.pop();
context.cx = context.pop();
context._add(context.si, 132);
@ -22083,8 +22027,7 @@ void fillspace(Context &context) {
context.push(context.bx);
context.di = context.dx;
context.es = context.ds;
while(context.cx--)
context._stosb();
context._stosb(context.cx);
context.bx = context.pop();
context.di = context.pop();
context.dx = context.pop();