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); |