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: |