aboutsummaryrefslogtreecommitdiff
path: root/opcode.c
diff options
context:
space:
mode:
authorWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-13 18:37:20 -0300
committerWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-13 18:37:20 -0300
commit8ca980966ca383c120dadb2c6e6a0850d1bfff58 (patch)
tree60822d655ea3fa23f54ab27b01838aa35e9fb3fa /opcode.c
parent662e2fa5ccf1dfa0ebea571d6785009442ba3011 (diff)
downloadlua-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.c98
1 files changed, 63 insertions, 35 deletions
diff --git a/opcode.c b/opcode.c
index 5fc75b5c..aaf38b51 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 1.2 1994/02/13 20:36:51 roberto Exp celes $"; 6char *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: