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 /lua.stx | |
| parent | 8cd67ac676fd7ff6c085e1ad6675ba6af0cb1fc3 (diff) | |
| download | lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.gz lua-dfe03c7abea6a00925a56239dfaac5be2770396e.tar.bz2 lua-dfe03c7abea6a00925a56239dfaac5be2770396e.zip | |
small optimizations (bit scrubbing)
Diffstat (limited to 'lua.stx')
| -rw-r--r-- | lua.stx | 126 |
1 files changed, 67 insertions, 59 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | %{ | 1 | %{ |
| 2 | /* | 2 | /* |
| 3 | ** $Id: $ | 3 | ** $Id: lua.stx,v 1.1 1997/09/16 19:33:21 roberto Exp roberto $ |
| 4 | ** Syntax analizer and code generator | 4 | ** Syntax analizer and code generator |
| 5 | ** See Copyright Notice in lua.h | 5 | ** See Copyright Notice in lua.h |
| 6 | */ | 6 | */ |
| @@ -111,6 +111,27 @@ static void code_opcode (OpCode op, int delta) | |||
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | 113 | ||
| 114 | static void code_push (OpCode op) | ||
| 115 | { | ||
| 116 | code_opcode(op, 1); | ||
| 117 | } | ||
| 118 | |||
| 119 | |||
| 120 | static void code_pop (OpCode op) | ||
| 121 | { | ||
| 122 | code_opcode(op, -1); | ||
| 123 | } | ||
| 124 | |||
| 125 | /* binary operations get 2 arguments and leave one, so they pop one */ | ||
| 126 | #define code_binop(op) code_pop(op) | ||
| 127 | |||
| 128 | |||
| 129 | #define code_neutralop(op) code_byte(op) | ||
| 130 | |||
| 131 | /* unary operations get 1 argument and leave one, so they are neutral */ | ||
| 132 | #define code_unop(op) code_neutralop(op) | ||
| 133 | |||
| 134 | |||
| 114 | static void code_word_at (int pc, int n) | 135 | static void code_word_at (int pc, int n) |
| 115 | { | 136 | { |
| 116 | Word w = n; | 137 | Word w = n; |
| @@ -129,11 +150,11 @@ static void code_word (int n) | |||
| 129 | static void code_constant (int c) | 150 | static void code_constant (int c) |
| 130 | { | 151 | { |
| 131 | if (c <= 255) { | 152 | if (c <= 255) { |
| 132 | code_opcode(PUSHCONSTANTB, 1); | 153 | code_push(PUSHCONSTANTB); |
| 133 | code_byte(c); | 154 | code_byte(c); |
| 134 | } | 155 | } |
| 135 | else { | 156 | else { |
| 136 | code_opcode(PUSHCONSTANT, 1); | 157 | code_push(PUSHCONSTANT); |
| 137 | code_word(c); | 158 | code_word(c); |
| 138 | } | 159 | } |
| 139 | } | 160 | } |
| @@ -197,13 +218,13 @@ static void code_number (real f) | |||
| 197 | Word i; | 218 | Word i; |
| 198 | if (f >= 0 && f <= (real)MAX_WORD && (real)(i=(Word)f) == f) { | 219 | if (f >= 0 && f <= (real)MAX_WORD && (real)(i=(Word)f) == f) { |
| 199 | /* f has an (short) integer value */ | 220 | /* f has an (short) integer value */ |
| 200 | if (i <= 2) code_opcode(PUSH0 + i, 1); | 221 | if (i <= 2) code_push(PUSH0 + i); |
| 201 | else if (i <= 255) { | 222 | else if (i <= 255) { |
| 202 | code_opcode(PUSHBYTE, 1); | 223 | code_push(PUSHBYTE); |
| 203 | code_byte(i); | 224 | code_byte(i); |
| 204 | } | 225 | } |
| 205 | else { | 226 | else { |
| 206 | code_opcode(PUSHWORD, 1); | 227 | code_push(PUSHWORD); |
| 207 | code_word(i); | 228 | code_word(i); |
| 208 | } | 229 | } |
| 209 | } | 230 | } |
| @@ -324,9 +345,9 @@ static void pushupvalue (TaggedString *n) | |||
| 324 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); | 345 | luaY_syntaxerror("cannot access an upvalue in current scope", n->str); |
| 325 | i = indexupvalue(n); | 346 | i = indexupvalue(n); |
| 326 | if (i == 0) | 347 | if (i == 0) |
| 327 | code_opcode(PUSHUPVALUE0, 1); | 348 | code_push(PUSHUPVALUE0); |
| 328 | else { | 349 | else { |
| 329 | code_opcode(PUSHUPVALUE, 1); | 350 | code_push(PUSHUPVALUE); |
| 330 | code_byte(i); | 351 | code_byte(i); |
| 331 | } | 352 | } |
| 332 | } | 353 | } |
| @@ -336,7 +357,7 @@ void luaY_codedebugline (int line) | |||
| 336 | { | 357 | { |
| 337 | static int lastline = 0; | 358 | static int lastline = 0; |
| 338 | if (lua_debug && line != lastline) { | 359 | if (lua_debug && line != lastline) { |
| 339 | code_opcode(SETLINE, 0); | 360 | code_neutralop(SETLINE); |
| 340 | code_word(line); | 361 | code_word(line); |
| 341 | lastline = line; | 362 | lastline = line; |
| 342 | } | 363 | } |
| @@ -351,7 +372,7 @@ static void adjuststack (int n) | |||
| 351 | } | 372 | } |
| 352 | else if (n < 0) { | 373 | else if (n < 0) { |
| 353 | if (n == -1) | 374 | if (n == -1) |
| 354 | code_opcode(PUSHNIL, 1); | 375 | code_push(PUSHNIL); |
| 355 | else { | 376 | else { |
| 356 | code_opcode(PUSHNILS, -n); | 377 | code_opcode(PUSHNILS, -n); |
| 357 | code_byte(-n); | 378 | code_byte(-n); |
| @@ -406,20 +427,20 @@ static void code_args (int dots) | |||
| 406 | static void lua_pushvar (vardesc number) | 427 | static void lua_pushvar (vardesc number) |
| 407 | { | 428 | { |
| 408 | if (number > 0) { /* global var */ | 429 | if (number > 0) { /* global var */ |
| 409 | code_opcode(PUSHGLOBAL, 1); | 430 | code_push(PUSHGLOBAL); |
| 410 | code_word(number-1); | 431 | code_word(number-1); |
| 411 | } | 432 | } |
| 412 | else if (number < 0) { /* local var */ | 433 | else if (number < 0) { /* local var */ |
| 413 | number = (-number) - 1; | 434 | number = (-number) - 1; |
| 414 | if (number < 10) | 435 | if (number < 10) |
| 415 | code_opcode(PUSHLOCAL0 + number, 1); | 436 | code_push(PUSHLOCAL0 + number); |
| 416 | else { | 437 | else { |
| 417 | code_opcode(PUSHLOCAL, 1); | 438 | code_push(PUSHLOCAL); |
| 418 | code_byte(number); | 439 | code_byte(number); |
| 419 | } | 440 | } |
| 420 | } | 441 | } |
| 421 | else { | 442 | else { |
| 422 | code_opcode(PUSHTABLE, -1); | 443 | code_pop(GETTABLE); |
| 423 | } | 444 | } |
| 424 | } | 445 | } |
| 425 | 446 | ||
| @@ -429,15 +450,15 @@ static void storevar (vardesc number) | |||
| 429 | if (number == 0) /* indexed var */ | 450 | if (number == 0) /* indexed var */ |
| 430 | code_opcode(SETTABLE0, -3); | 451 | code_opcode(SETTABLE0, -3); |
| 431 | else if (number > 0) { /* global var */ | 452 | else if (number > 0) { /* global var */ |
| 432 | code_opcode(SETGLOBAL, -1); | 453 | code_pop(SETGLOBAL); |
| 433 | code_word(number-1); | 454 | code_word(number-1); |
| 434 | } | 455 | } |
| 435 | else { /* number < 0 - local var */ | 456 | else { /* number < 0 - local var */ |
| 436 | number = (-number) - 1; | 457 | number = (-number) - 1; |
| 437 | if (number < 10) | 458 | if (number < 10) |
| 438 | code_opcode(SETLOCAL0 + number, -1); | 459 | code_pop(SETLOCAL0 + number); |
| 439 | else { | 460 | else { |
| 440 | code_opcode(SETLOCAL, -1); | 461 | code_pop(SETLOCAL); |
| 441 | code_byte(number); | 462 | code_byte(number); |
| 442 | } | 463 | } |
| 443 | } | 464 | } |
| @@ -453,7 +474,7 @@ static int lua_codestore (int i, int left) | |||
| 453 | return left; | 474 | return left; |
| 454 | } | 475 | } |
| 455 | else { /* indexed var with values in between*/ | 476 | else { /* indexed var with values in between*/ |
| 456 | code_opcode(SETTABLE, -1); | 477 | code_pop(SETTABLE); |
| 457 | code_byte(left+i); /* number of elements between table/index and value */ | 478 | code_byte(left+i); /* number of elements between table/index and value */ |
| 458 | return left+2; /* table/index are not poped, since they are not on top */ | 479 | return left+2; /* table/index are not poped, since they are not on top */ |
| 459 | } | 480 | } |
| @@ -485,7 +506,7 @@ static void code_shortcircuit (int pc, Byte jmp) | |||
| 485 | 506 | ||
| 486 | static void codereturn (void) | 507 | static void codereturn (void) |
| 487 | { | 508 | { |
| 488 | code_opcode(RETCODE, 0); | 509 | code_neutralop(RETCODE); |
| 489 | code_byte(currState->nlocalvar); | 510 | code_byte(currState->nlocalvar); |
| 490 | currState->stacksize = currState->nlocalvar; | 511 | currState->stacksize = currState->nlocalvar; |
| 491 | } | 512 | } |
| @@ -542,7 +563,7 @@ static void init_func (void) | |||
| 542 | static TProtoFunc *close_func (void) | 563 | static TProtoFunc *close_func (void) |
| 543 | { | 564 | { |
| 544 | TProtoFunc *f = currState->f; | 565 | TProtoFunc *f = currState->f; |
| 545 | code_opcode(ENDCODE, 0); | 566 | code_neutralop(ENDCODE); |
| 546 | f->code[0] = currState->maxstacksize; | 567 | f->code[0] = currState->maxstacksize; |
| 547 | f->code = luaM_reallocvector(f->code, currState->pc, Byte); | 568 | f->code = luaM_reallocvector(f->code, currState->pc, Byte); |
| 548 | f->consts = luaM_reallocvector(f->consts, f->nconsts, TObject); | 569 | f->consts = luaM_reallocvector(f->consts, f->nconsts, TObject); |
| @@ -624,8 +645,7 @@ chunk : statlist ret | |||
| 624 | ; | 645 | ; |
| 625 | 646 | ||
| 626 | statlist : /* empty */ | 647 | statlist : /* empty */ |
| 627 | | statlist stat sc { if (currState->stacksize != currState->nlocalvar) | 648 | | statlist stat sc |
| 628 | { luaY_error("contagem"); exit(1); }} | ||
| 629 | ; | 649 | ; |
| 630 | 650 | ||
| 631 | sc : /* empty */ | ';' ; | 651 | sc : /* empty */ | ';' ; |
| @@ -707,7 +727,7 @@ ret : /* empty */ | |||
| 707 | PrepJump : /* empty */ | 727 | PrepJump : /* empty */ |
| 708 | { | 728 | { |
| 709 | $$ = currState->pc; | 729 | $$ = currState->pc; |
| 710 | code_opcode(0, 0); /* open space */ | 730 | code_byte(0); /* open space */ |
| 711 | code_word(0); | 731 | code_word(0); |
| 712 | } | 732 | } |
| 713 | ; | 733 | ; |
| @@ -718,47 +738,35 @@ PrepJumpPop : PrepJump { $$ = $1; deltastack(-1); /* pop condition */ } | |||
| 718 | expr1 : expr { adjust_functioncall($1, 1); } | 738 | expr1 : expr { adjust_functioncall($1, 1); } |
| 719 | ; | 739 | ; |
| 720 | 740 | ||
| 721 | expr : '(' expr ')' { $$ = $2; } | 741 | expr : '(' expr ')' { $$ = $2; } |
| 722 | | expr1 EQ expr1 { code_opcode(EQOP, -1); $$ = 0; } | 742 | | expr1 EQ expr1 { code_binop(EQOP); $$ = 0; } |
| 723 | | expr1 '<' expr1 { code_opcode(LTOP, -1); $$ = 0; } | 743 | | expr1 '<' expr1 { code_binop(LTOP); $$ = 0; } |
| 724 | | expr1 '>' expr1 { code_opcode(GTOP, -1); $$ = 0; } | 744 | | expr1 '>' expr1 { code_binop(GTOP); $$ = 0; } |
| 725 | | expr1 NE expr1 { code_opcode(NEQOP, -1); $$ = 0; } | 745 | | expr1 NE expr1 { code_binop(NEQOP); $$ = 0; } |
| 726 | | expr1 LE expr1 { code_opcode(LEOP, -1); $$ = 0; } | 746 | | expr1 LE expr1 { code_binop(LEOP); $$ = 0; } |
| 727 | | expr1 GE expr1 { code_opcode(GEOP, -1); $$ = 0; } | 747 | | expr1 GE expr1 { code_binop(GEOP); $$ = 0; } |
| 728 | | expr1 '+' expr1 { code_opcode(ADDOP, -1); $$ = 0; } | 748 | | expr1 '+' expr1 { code_binop(ADDOP); $$ = 0; } |
| 729 | | expr1 '-' expr1 { code_opcode(SUBOP, -1); $$ = 0; } | 749 | | expr1 '-' expr1 { code_binop(SUBOP); $$ = 0; } |
| 730 | | expr1 '*' expr1 { code_opcode(MULTOP, -1); $$ = 0; } | 750 | | expr1 '*' expr1 { code_binop(MULTOP); $$ = 0; } |
| 731 | | expr1 '/' expr1 { code_opcode(DIVOP, -1); $$ = 0; } | 751 | | expr1 '/' expr1 { code_binop(DIVOP); $$ = 0; } |
| 732 | | expr1 '^' expr1 { code_opcode(POWOP, -1); $$ = 0; } | 752 | | expr1 '^' expr1 { code_binop(POWOP); $$ = 0; } |
| 733 | | expr1 CONC expr1 { code_opcode(CONCOP, -1); $$ = 0; } | 753 | | expr1 CONC expr1 { code_binop(CONCOP); $$ = 0; } |
| 734 | | '-' expr1 %prec UNARY { code_opcode(MINUSOP, 0); $$ = 0;} | 754 | | '-' expr1 %prec UNARY { code_unop(MINUSOP); $$ = 0;} |
| 755 | | NOT expr1 { code_unop(NOTOP); $$ = 0;} | ||
| 735 | | table { $$ = 0; } | 756 | | table { $$ = 0; } |
| 736 | | varexp { $$ = 0;} | 757 | | varexp { $$ = 0;} |
| 737 | | NUMBER { code_number($1); $$ = 0; } | 758 | | NUMBER { code_number($1); $$ = 0; } |
| 738 | | STRING | 759 | | STRING { code_string($1); $$ = 0; } |
| 739 | { | 760 | | NIL {code_push(PUSHNIL); $$ = 0; } |
| 740 | code_string($1); | 761 | | functioncall { $$ = $1; } |
| 741 | $$ = 0; | 762 | | expr1 AND PrepJumpPop expr1 { code_shortcircuit($3, ONFJMP); $$ = 0; } |
| 742 | } | 763 | | expr1 OR PrepJumpPop expr1 { code_shortcircuit($3, ONTJMP); $$ = 0; } |
| 743 | | NIL {code_opcode(PUSHNIL, 1); $$ = 0; } | ||
| 744 | | functioncall { $$ = $1; } | ||
| 745 | | NOT expr1 { code_opcode(NOTOP, 0); $$ = 0;} | ||
| 746 | | expr1 AND PrepJumpPop expr1 | ||
| 747 | { | ||
| 748 | code_shortcircuit($3, ONFJMP); | ||
| 749 | $$ = 0; | ||
| 750 | } | ||
| 751 | | expr1 OR PrepJumpPop expr1 | ||
| 752 | { | ||
| 753 | code_shortcircuit($3, ONTJMP); | ||
| 754 | $$ = 0; | ||
| 755 | } | ||
| 756 | | FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; } | 764 | | FUNCTION { init_func(); } body { func_onstack($3); $$ = 0; } |
| 757 | ; | 765 | ; |
| 758 | 766 | ||
| 759 | table : | 767 | table : |
| 760 | { | 768 | { |
| 761 | code_opcode(CREATEARRAY, 1); | 769 | code_push(CREATEARRAY); |
| 762 | $<vInt>$ = currState->pc; code_word(0); | 770 | $<vInt>$ = currState->pc; code_word(0); |
| 763 | } | 771 | } |
| 764 | '{' fieldlist '}' | 772 | '{' fieldlist '}' |
| @@ -779,7 +787,7 @@ functioncall : funcvalue funcParams | |||
| 779 | funcvalue : varexp { $$ = 0; } | 787 | funcvalue : varexp { $$ = 0; } |
| 780 | | varexp ':' NAME | 788 | | varexp ':' NAME |
| 781 | { | 789 | { |
| 782 | code_opcode(PUSHSELF, 1); | 790 | code_push(PUSHSELF); |
| 783 | code_word(string_constant($3)); | 791 | code_word(string_constant($3)); |
| 784 | $$ = 1; | 792 | $$ = 1; |
| 785 | } | 793 | } |
