diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-19 15:40:32 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-09-19 15:40:32 -0300 |
| commit | dfe03c7abea6a00925a56239dfaac5be2770396e (patch) | |
| tree | 0e8e3cd14d37594f29cb20781af668da3a219758 /lvm.c | |
| parent | 8cd67ac676fd7ff6c085e1ad6675ba6af0cb1fc3 (diff) | |
| download | lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.gz lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.bz2 lua-dfe03c7abea6a00925a56239dfaac5be2770396e.zip | |
small optimizations (bit scrubbing)
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 187 |
1 files changed, 72 insertions, 115 deletions
| @@ -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); |
