diff options
| author | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-04-13 18:37:20 -0300 |
|---|---|---|
| committer | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1994-04-13 18:37:20 -0300 |
| commit | 8ca980966ca383c120dadb2c6e6a0850d1bfff58 (patch) | |
| tree | 60822d655ea3fa23f54ab27b01838aa35e9fb3fa /opcode.c | |
| parent | 662e2fa5ccf1dfa0ebea571d6785009442ba3011 (diff) | |
| download | lua-8ca980966ca383c120dadb2c6e6a0850d1bfff58.tar.gz lua-8ca980966ca383c120dadb2c6e6a0850d1bfff58.tar.bz2 lua-8ca980966ca383c120dadb2c6e6a0850d1bfff58.zip | |
Alteracao para retirar codificacao de NOP's, substituindo
pela utilizacao de "union" com "chars" para codificar Word e float.
Observa-se que foram realizados testes antes da alteracao e constatou-se
que do bytecode anteriormente gerado, NOP representava de 10 a 13% do
total de bytes do codigo. Esta percentagem chegava ate' a 20% na caso
de descricao de metafile utilizando Lua.
Diffstat (limited to 'opcode.c')
| -rw-r--r-- | opcode.c | 98 |
1 files changed, 63 insertions, 35 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_opcode="$Id: opcode.c,v 1.2 1994/02/13 20:36:51 roberto Exp celes $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 1.3 1994/03/28 15:14:02 celes Exp celes $"; |
| 7 | 7 | ||
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
| @@ -147,8 +147,6 @@ int lua_execute (Byte *pc) | |||
| 147 | OpCode opcode; | 147 | OpCode opcode; |
| 148 | switch (opcode = (OpCode)*pc++) | 148 | switch (opcode = (OpCode)*pc++) |
| 149 | { | 149 | { |
| 150 | case NOP: break; | ||
| 151 | |||
| 152 | case PUSHNIL: tag(top++) = T_NIL; break; | 150 | case PUSHNIL: tag(top++) = T_NIL; break; |
| 153 | 151 | ||
| 154 | case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break; | 152 | case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break; |
| @@ -158,17 +156,26 @@ int lua_execute (Byte *pc) | |||
| 158 | case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break; | 156 | case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break; |
| 159 | 157 | ||
| 160 | case PUSHWORD: | 158 | case PUSHWORD: |
| 161 | tag(top) = T_NUMBER; nvalue(top++) = *((Word *)(pc)); pc += sizeof(Word); | 159 | { |
| 160 | CodeWord code; | ||
| 161 | get_word(code,pc); | ||
| 162 | tag(top) = T_NUMBER; nvalue(top++) = code.w; | ||
| 163 | } | ||
| 162 | break; | 164 | break; |
| 163 | 165 | ||
| 164 | case PUSHFLOAT: | 166 | case PUSHFLOAT: |
| 165 | tag(top) = T_NUMBER; nvalue(top++) = *((float *)(pc)); pc += sizeof(float); | 167 | { |
| 168 | CodeFloat code; | ||
| 169 | get_float(code,pc); | ||
| 170 | tag(top) = T_NUMBER; nvalue(top++) = code.f; | ||
| 171 | } | ||
| 166 | break; | 172 | break; |
| 173 | |||
| 167 | case PUSHSTRING: | 174 | case PUSHSTRING: |
| 168 | { | 175 | { |
| 169 | int w = *((Word *)(pc)); | 176 | CodeWord code; |
| 170 | pc += sizeof(Word); | 177 | get_word(code,pc); |
| 171 | tag(top) = T_STRING; svalue(top++) = lua_constant[w]; | 178 | tag(top) = T_STRING; svalue(top++) = lua_constant[code.w]; |
| 172 | } | 179 | } |
| 173 | break; | 180 | break; |
| 174 | 181 | ||
| @@ -180,7 +187,11 @@ int lua_execute (Byte *pc) | |||
| 180 | case PUSHLOCAL: *top++ = *(base + (*pc++)); break; | 187 | case PUSHLOCAL: *top++ = *(base + (*pc++)); break; |
| 181 | 188 | ||
| 182 | case PUSHGLOBAL: | 189 | case PUSHGLOBAL: |
| 183 | *top++ = s_object(*((Word *)(pc))); pc += sizeof(Word); | 190 | { |
| 191 | CodeWord code; | ||
| 192 | get_word(code,pc); | ||
| 193 | *top++ = s_object(code.w); | ||
| 194 | } | ||
| 184 | break; | 195 | break; |
| 185 | 196 | ||
| 186 | case PUSHINDEXED: | 197 | case PUSHINDEXED: |
| @@ -209,7 +220,11 @@ int lua_execute (Byte *pc) | |||
| 209 | case STORELOCAL: *(base + (*pc++)) = *(--top); break; | 220 | case STORELOCAL: *(base + (*pc++)) = *(--top); break; |
| 210 | 221 | ||
| 211 | case STOREGLOBAL: | 222 | case STOREGLOBAL: |
| 212 | s_object(*((Word *)(pc))) = *(--top); pc += sizeof(Word); | 223 | { |
| 224 | CodeWord code; | ||
| 225 | get_word(code,pc); | ||
| 226 | s_object(code.w) = *(--top); | ||
| 227 | } | ||
| 213 | break; | 228 | break; |
| 214 | 229 | ||
| 215 | case STOREINDEXED0: | 230 | case STOREINDEXED0: |
| @@ -278,9 +293,9 @@ int lua_execute (Byte *pc) | |||
| 278 | } | 293 | } |
| 279 | while (n) | 294 | while (n) |
| 280 | { | 295 | { |
| 281 | int w = *((Word *)(pc)); | 296 | CodeWord code; |
| 282 | pc += sizeof(Word); | 297 | get_word(code,pc); |
| 283 | tag(top) = T_STRING; svalue(top) = lua_constant[w]; | 298 | tag(top) = T_STRING; svalue(top) = lua_constant[code.w]; |
| 284 | *(lua_hashdefine (avalue(arr), top)) = *(top-1); | 299 | *(lua_hashdefine (avalue(arr), top)) = *(top-1); |
| 285 | top--; | 300 | top--; |
| 286 | n--; | 301 | n--; |
| @@ -438,39 +453,51 @@ int lua_execute (Byte *pc) | |||
| 438 | 453 | ||
| 439 | case ONTJMP: | 454 | case ONTJMP: |
| 440 | { | 455 | { |
| 441 | int n = *((Word *)(pc)); | 456 | CodeWord code; |
| 442 | pc += sizeof(Word); | 457 | get_word(code,pc); |
| 443 | if (tag(top-1) != T_NIL) pc += n; | 458 | if (tag(top-1) != T_NIL) pc += code.w; |
| 444 | } | 459 | } |
| 445 | break; | 460 | break; |
| 446 | 461 | ||
| 447 | case ONFJMP: | 462 | case ONFJMP: |
| 448 | { | 463 | { |
| 449 | int n = *((Word *)(pc)); | 464 | CodeWord code; |
| 450 | pc += sizeof(Word); | 465 | get_word(code,pc); |
| 451 | if (tag(top-1) == T_NIL) pc += n; | 466 | if (tag(top-1) == T_NIL) pc += code.w; |
| 452 | } | 467 | } |
| 453 | break; | 468 | break; |
| 454 | 469 | ||
| 455 | case JMP: pc += *((Word *)(pc)) + sizeof(Word); break; | 470 | case JMP: |
| 471 | { | ||
| 472 | CodeWord code; | ||
| 473 | get_word(code,pc); | ||
| 474 | pc += code.w; | ||
| 475 | } | ||
| 476 | break; | ||
| 456 | 477 | ||
| 457 | case UPJMP: pc -= *((Word *)(pc)) - sizeof(Word); break; | 478 | case UPJMP: |
| 479 | { | ||
| 480 | CodeWord code; | ||
| 481 | get_word(code,pc); | ||
| 482 | pc -= code.w; | ||
| 483 | } | ||
| 484 | break; | ||
| 458 | 485 | ||
| 459 | case IFFJMP: | 486 | case IFFJMP: |
| 460 | { | 487 | { |
| 461 | int n = *((Word *)(pc)); | 488 | CodeWord code; |
| 462 | pc += sizeof(Word); | 489 | get_word(code,pc); |
| 463 | top--; | 490 | top--; |
| 464 | if (tag(top) == T_NIL) pc += n; | 491 | if (tag(top) == T_NIL) pc += code.w; |
| 465 | } | 492 | } |
| 466 | break; | 493 | break; |
| 467 | 494 | ||
| 468 | case IFFUPJMP: | 495 | case IFFUPJMP: |
| 469 | { | 496 | { |
| 470 | int n = *((Word *)(pc)); | 497 | CodeWord code; |
| 471 | pc += sizeof(Word); | 498 | get_word(code,pc); |
| 472 | top--; | 499 | top--; |
| 473 | if (tag(top) == T_NIL) pc -= n; | 500 | if (tag(top) == T_NIL) pc -= code.w; |
| 474 | } | 501 | } |
| 475 | break; | 502 | break; |
| 476 | 503 | ||
| @@ -547,19 +574,20 @@ int lua_execute (Byte *pc) | |||
| 547 | 574 | ||
| 548 | case SETFUNCTION: | 575 | case SETFUNCTION: |
| 549 | { | 576 | { |
| 550 | int file, func; | 577 | CodeWord file, func; |
| 551 | file = *((Word *)(pc)); | 578 | get_word(file,pc); |
| 552 | pc += sizeof(Word); | 579 | get_word(func,pc); |
| 553 | func = *((Word *)(pc)); | 580 | if (lua_pushfunction (file.w, func.w)) |
| 554 | pc += sizeof(Word); | ||
| 555 | if (lua_pushfunction (file, func)) | ||
| 556 | return 1; | 581 | return 1; |
| 557 | } | 582 | } |
| 558 | break; | 583 | break; |
| 559 | 584 | ||
| 560 | case SETLINE: | 585 | case SETLINE: |
| 561 | lua_debugline = *((Word *)(pc)); | 586 | { |
| 562 | pc += sizeof(Word); | 587 | CodeWord code; |
| 588 | get_word(code,pc); | ||
| 589 | lua_debugline = code.w; | ||
| 590 | } | ||
| 563 | break; | 591 | break; |
| 564 | 592 | ||
| 565 | case RESET: | 593 | case RESET: |
