aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-19 15:40:32 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-09-19 15:40:32 -0300
commitdfe03c7abea6a00925a56239dfaac5be2770396e (patch)
tree0e8e3cd14d37594f29cb20781af668da3a219758 /lvm.c
parent8cd67ac676fd7ff6c085e1ad6675ba6af0cb1fc3 (diff)
downloadlua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.gz
lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.bz2
lua-dfe03c7abea6a00925a56239dfaac5be2770396e.zip
small optimizations (bit scrubbing)
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c187
1 files changed, 72 insertions, 115 deletions
diff --git a/lvm.c b/lvm.c
index 8993056b..b4818ea9 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: $ 2** $Id: lvm.c,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -22,7 +22,9 @@
22#include "lvm.h" 22#include "lvm.h"
23 23
24 24
25#define get_word(w,pc) {w=*pc+(*(pc+1)<<8); pc+=2;} 25#define get_prevword(pc) (*(pc-2)+(*(pc-1)<<8))
26#define get_word(pc) (pc+=2, get_prevword(pc))
27#define skip_word(pc) {pc+=2;}
26 28
27 29
28/* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ 30/* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */
@@ -159,15 +161,13 @@ void luaV_getglobal (Word n)
159 TObject *value = &luaG_global[n].object; 161 TObject *value = &luaG_global[n].object;
160 TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL); 162 TObject *im = luaT_getimbyObj(value, IM_GETGLOBAL);
161 if (ttype(im) == LUA_T_NIL) { /* default behavior */ 163 if (ttype(im) == LUA_T_NIL) { /* default behavior */
162 *luaD_stack.top = *value; 164 *luaD_stack.top++ = *value;
163 luaD_stack.top++;
164 } 165 }
165 else { 166 else {
166 ttype(luaD_stack.top) = LUA_T_STRING; 167 ttype(luaD_stack.top) = LUA_T_STRING;
167 tsvalue(luaD_stack.top) = luaG_global[n].varname; 168 tsvalue(luaD_stack.top) = luaG_global[n].varname;
168 luaD_stack.top++; 169 luaD_stack.top++;
169 *luaD_stack.top = *value; 170 *luaD_stack.top++ = *value;
170 luaD_stack.top++;
171 luaD_callTM(im, 2, 1); 171 luaD_callTM(im, 2, 1);
172 } 172 }
173} 173}
@@ -184,10 +184,8 @@ void luaV_setglobal (Word n)
184 TObject newvalue = *(luaD_stack.top-1); 184 TObject newvalue = *(luaD_stack.top-1);
185 ttype(luaD_stack.top-1) = LUA_T_STRING; 185 ttype(luaD_stack.top-1) = LUA_T_STRING;
186 tsvalue(luaD_stack.top-1) = luaG_global[n].varname; 186 tsvalue(luaD_stack.top-1) = luaG_global[n].varname;
187 *luaD_stack.top = *oldvalue; 187 *luaD_stack.top++ = *oldvalue;
188 luaD_stack.top++; 188 *luaD_stack.top++ = newvalue;
189 *luaD_stack.top = newvalue;
190 luaD_stack.top++;
191 luaD_callTM(im, 3, 0); 189 luaD_callTM(im, 3, 0);
192 } 190 }
193} 191}
@@ -266,8 +264,7 @@ static void adjust_varargs (StkId first_extra_arg)
266 luaV_pack(first_extra_arg, 264 luaV_pack(first_extra_arg,
267 (luaD_stack.top-luaD_stack.stack)-first_extra_arg, &arg); 265 (luaD_stack.top-luaD_stack.stack)-first_extra_arg, &arg);
268 luaD_adjusttop(first_extra_arg); 266 luaD_adjusttop(first_extra_arg);
269 *luaD_stack.top = arg; 267 *luaD_stack.top++ = arg;
270 luaD_stack.top++;
271} 268}
272 269
273 270
@@ -289,8 +286,7 @@ StkId luaV_execute (Closure *cl, StkId base)
289 switch (opcode = (OpCode)*pc++) { 286 switch (opcode = (OpCode)*pc++) {
290 287
291 case PUSHNIL: 288 case PUSHNIL:
292 ttype(luaD_stack.top) = LUA_T_NIL; 289 ttype(luaD_stack.top++) = LUA_T_NIL;
293 luaD_stack.top++;
294 break; 290 break;
295 291
296 case PUSHNILS: { 292 case PUSHNILS: {
@@ -312,72 +308,55 @@ StkId luaV_execute (Closure *cl, StkId base)
312 luaD_stack.top++; 308 luaD_stack.top++;
313 break; 309 break;
314 310
315 case PUSHWORD: { 311 case PUSHWORD:
316 Word w;
317 get_word(w,pc);
318 ttype(luaD_stack.top) = LUA_T_NUMBER; 312 ttype(luaD_stack.top) = LUA_T_NUMBER;
319 nvalue(luaD_stack.top) = w; 313 nvalue(luaD_stack.top) = get_word(pc);
320 luaD_stack.top++; 314 luaD_stack.top++;
321 break; 315 break;
322 }
323 316
324 case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: 317 case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2:
325 case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: 318 case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5:
326 case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: 319 case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8:
327 case PUSHLOCAL9: 320 case PUSHLOCAL9:
328 *luaD_stack.top = *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0)); 321 *luaD_stack.top++ =
329 luaD_stack.top++; 322 *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0));
330 break; 323 break;
331 324
332 case PUSHLOCAL: 325 case PUSHLOCAL:
333 *luaD_stack.top = *((luaD_stack.stack+base) + (*pc++)); 326 *luaD_stack.top++ = *((luaD_stack.stack+base) + (*pc++));
334 luaD_stack.top++;
335 break; 327 break;
336 328
337 case PUSHGLOBAL: { 329 case PUSHGLOBAL:
338 Word w; 330 luaV_getglobal(get_word(pc));
339 get_word(w,pc);
340 luaV_getglobal(w);
341 break; 331 break;
342 }
343 332
344 case PUSHTABLE: 333 case GETTABLE:
345 luaV_gettable(); 334 luaV_gettable();
346 break; 335 break;
347 336
348 case PUSHSELF: { 337 case PUSHSELF: {
349 TObject receiver = *(luaD_stack.top-1); 338 TObject receiver = *(luaD_stack.top-1);
350 Word w; 339 *luaD_stack.top++ = func->consts[get_word(pc)];
351 get_word(w,pc);
352 *luaD_stack.top = func->consts[w];
353 luaD_stack.top++;
354 luaV_gettable(); 340 luaV_gettable();
355 *luaD_stack.top = receiver; 341 *luaD_stack.top++ = receiver;
356 luaD_stack.top++;
357 break; 342 break;
358 } 343 }
359 344
360 case PUSHCONSTANTB: { 345 case PUSHCONSTANTB:
361 *luaD_stack.top = func->consts[*pc++]; 346 *luaD_stack.top++ = func->consts[*pc++];
362 luaD_stack.top++;
363 break; 347 break;
364 }
365 348
366 case PUSHCONSTANT: { 349 case PUSHCONSTANT:
367 Word w; 350 *luaD_stack.top++ = func->consts[get_word(pc)];
368 get_word(w,pc);
369 *luaD_stack.top = func->consts[w];
370 luaD_stack.top++;
371 break; 351 break;
372 }
373 352
374 case PUSHUPVALUE0: 353 case PUSHUPVALUE0:
375 case PUSHUPVALUE: { 354 *luaD_stack.top++ = cl->consts[1];
376 int i = (opcode == PUSHUPVALUE0) ? 0 : *pc++; 355 break;
377 *luaD_stack.top = cl->consts[i+1]; 356
378 luaD_stack.top++; 357 case PUSHUPVALUE:
358 *luaD_stack.top++ = cl->consts[(*pc++)+1];
379 break; 359 break;
380 }
381 360
382 case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: 361 case SETLOCAL0: case SETLOCAL1: case SETLOCAL2:
383 case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: 362 case SETLOCAL3: case SETLOCAL4: case SETLOCAL5:
@@ -390,36 +369,28 @@ StkId luaV_execute (Closure *cl, StkId base)
390 case SETLOCAL: 369 case SETLOCAL:
391 *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break; 370 *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break;
392 371
393 case SETGLOBAL: { 372 case SETGLOBAL:
394 Word w; 373 luaV_setglobal(get_word(pc));
395 get_word(w,pc);
396 luaV_setglobal(w);
397 break; 374 break;
398 }
399 375
400 case SETTABLE0: 376 case SETTABLE0:
401 luaV_settable(luaD_stack.top-3, 1); 377 luaV_settable(luaD_stack.top-3, 1);
402 break; 378 break;
403 379
404 case SETTABLE: { 380 case SETTABLE:
405 int n = *pc++; 381 luaV_settable(luaD_stack.top-3-(*pc++), 2);
406 luaV_settable(luaD_stack.top-3-n, 2);
407 break; 382 break;
408 }
409 383
410 case SETLIST0: 384 case SETLIST0:
411 case SETLIST: { 385 case SETLIST: {
412 int m, n; 386 int m = (opcode == SETLIST0) ? 0 : *(pc++) * LFIELDS_PER_FLUSH;
413 TObject *arr; 387 int n = *(pc++);
414 if (opcode == SETLIST0) m = 0; 388 TObject *arr = luaD_stack.top-n-1;
415 else m = *(pc++) * LFIELDS_PER_FLUSH; 389 for (; n; n--) {
416 n = *(pc++); 390 ttype(luaD_stack.top) = LUA_T_NUMBER;
417 arr = luaD_stack.top-n-1; 391 nvalue(luaD_stack.top) = n+m;
418 while (n) {
419 ttype(luaD_stack.top) = LUA_T_NUMBER; nvalue(luaD_stack.top) = n+m;
420 *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); 392 *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1);
421 luaD_stack.top--; 393 luaD_stack.top--;
422 n--;
423 } 394 }
424 break; 395 break;
425 } 396 }
@@ -447,19 +418,16 @@ StkId luaV_execute (Closure *cl, StkId base)
447 adjust_varargs(base + *(pc++)); 418 adjust_varargs(base + *(pc++));
448 break; 419 break;
449 420
450 case CREATEARRAY: { 421 case CREATEARRAY:
451 Word size;
452 luaC_checkGC(); 422 luaC_checkGC();
453 get_word(size,pc); 423 avalue(luaD_stack.top) = luaH_new(get_word(pc));
454 avalue(luaD_stack.top) = luaH_new(size);
455 ttype(luaD_stack.top) = LUA_T_ARRAY; 424 ttype(luaD_stack.top) = LUA_T_ARRAY;
456 luaD_stack.top++; 425 luaD_stack.top++;
457 break; 426 break;
458 }
459 427
460 case EQOP: case NEQOP: { 428 case EQOP: case NEQOP: {
461 int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); 429 int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1);
462 --luaD_stack.top; 430 luaD_stack.top--;
463 if (opcode == NEQOP) res = !res; 431 if (opcode == NEQOP) res = !res;
464 ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; 432 ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL;
465 nvalue(luaD_stack.top-1) = 1; 433 nvalue(luaD_stack.top-1) = 1;
@@ -563,51 +531,43 @@ StkId luaV_execute (Closure *cl, StkId base)
563 nvalue(luaD_stack.top-1) = 1; 531 nvalue(luaD_stack.top-1) = 1;
564 break; 532 break;
565 533
566 case ONTJMP: { 534 case ONTJMP:
567 Word w; 535 skip_word(pc);
568 get_word(w,pc); 536 if (ttype(luaD_stack.top-1) != LUA_T_NIL)
569 if (ttype(luaD_stack.top-1) != LUA_T_NIL) pc += w; 537 pc += get_prevword(pc);
570 else luaD_stack.top--; 538 else
571 } 539 luaD_stack.top--;
572 break; 540 break;
573 541
574 case ONFJMP: { 542 case ONFJMP:
575 Word w; 543 skip_word(pc);
576 get_word(w,pc); 544 if (ttype(luaD_stack.top-1) == LUA_T_NIL)
577 if (ttype(luaD_stack.top-1) == LUA_T_NIL) pc += w; 545 pc += get_prevword(pc);
578 else luaD_stack.top--; 546 else
547 luaD_stack.top--;
579 break; 548 break;
580 }
581 549
582 case JMP: { 550 case JMP:
583 Word w; 551 skip_word(pc);
584 get_word(w,pc); 552 pc += get_prevword(pc);
585 pc += w;
586 break; 553 break;
587 }
588 554
589 case UPJMP: { 555 case UPJMP:
590 Word w; 556 skip_word(pc);
591 get_word(w,pc); 557 pc -= get_prevword(pc);
592 pc -= w;
593 break; 558 break;
594 }
595 559
596 case IFFJMP: { 560 case IFFJMP:
597 Word w; 561 skip_word(pc);
598 get_word(w,pc); 562 if (ttype(--luaD_stack.top) == LUA_T_NIL)
599 luaD_stack.top--; 563 pc += get_prevword(pc);
600 if (ttype(luaD_stack.top) == LUA_T_NIL) pc += w;
601 break; 564 break;
602 }
603 565
604 case IFFUPJMP: { 566 case IFFUPJMP:
605 Word w; 567 skip_word(pc);
606 get_word(w,pc); 568 if (ttype(--luaD_stack.top) == LUA_T_NIL)
607 luaD_stack.top--; 569 pc -= get_prevword(pc);
608 if (ttype(luaD_stack.top) == LUA_T_NIL) pc -= w;
609 break; 570 break;
610 }
611 571
612 case CLOSURE: 572 case CLOSURE:
613 luaV_closure(); 573 luaV_closure();
@@ -615,10 +575,8 @@ StkId luaV_execute (Closure *cl, StkId base)
615 break; 575 break;
616 576
617 case CALLFUNC: { 577 case CALLFUNC: {
618 int nParams = *pc++; 578 StkId newBase = (luaD_stack.top-luaD_stack.stack)-(*pc++);
619 int nResults = *pc++; 579 luaD_call(newBase, *pc++);
620 StkId newBase = (luaD_stack.top-luaD_stack.stack)-nParams;
621 luaD_call(newBase, nResults);
622 break; 580 break;
623 } 581 }
624 582
@@ -631,8 +589,7 @@ StkId luaV_execute (Closure *cl, StkId base)
631 return (base + ((opcode==RETCODE) ? *pc : 0)); 589 return (base + ((opcode==RETCODE) ? *pc : 0));
632 590
633 case SETLINE: { 591 case SETLINE: {
634 Word line; 592 int line = get_word(pc);
635 get_word(line,pc);
636 if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) { 593 if ((luaD_stack.stack+base-1)->ttype != LUA_T_LINE) {
637 /* open space for LINE value */ 594 /* open space for LINE value */
638 luaD_openstack((luaD_stack.top-luaD_stack.stack)-base); 595 luaD_openstack((luaD_stack.top-luaD_stack.stack)-base);