diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-08-20 17:03:05 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-08-20 17:03:05 -0300 |
commit | 6c283b2f4f8398322e7a9a62ec8e131852b4e015 (patch) | |
tree | 608d5b61b14dfdb91cc5cf72637e876337cffcb8 /lvm.c | |
parent | 576bded5137babb9c669ccff5aedf19ed65a7598 (diff) | |
download | lua-6c283b2f4f8398322e7a9a62ec8e131852b4e015.tar.gz lua-6c283b2f4f8398322e7a9a62ec8e131852b4e015.tar.bz2 lua-6c283b2f4f8398322e7a9a62ec8e131852b4e015.zip |
new simetric format for ABC instructions, to avoid exchanging operands
for `commutative' operators
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 54 |
1 files changed, 22 insertions, 32 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.251 2002/08/07 19:22:39 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.252 2002/08/12 17:23:12 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 | */ |
@@ -318,7 +318,8 @@ void luaV_concat (lua_State *L, int total, int last) { | |||
318 | } | 318 | } |
319 | 319 | ||
320 | 320 | ||
321 | static void Arith (lua_State *L, StkId ra, StkId rb, StkId rc, TMS op) { | 321 | static void Arith (lua_State *L, StkId ra, |
322 | const TObject *rb, const TObject *rc, TMS op) { | ||
322 | TObject tempb, tempc; | 323 | TObject tempb, tempc; |
323 | const TObject *b, *c; | 324 | const TObject *b, *c; |
324 | if ((b = luaV_tonumber(rb, &tempb)) != NULL && | 325 | if ((b = luaV_tonumber(rb, &tempb)) != NULL && |
@@ -356,10 +357,9 @@ static void Arith (lua_State *L, StkId ra, StkId rb, StkId rc, TMS op) { | |||
356 | 357 | ||
357 | #define RA(i) (base+GETARG_A(i)) | 358 | #define RA(i) (base+GETARG_A(i)) |
358 | #define RB(i) (base+GETARG_B(i)) | 359 | #define RB(i) (base+GETARG_B(i)) |
360 | #define RKB(i) ((GETARG_B(i) < MAXSTACK) ? RB(i) : k+GETARG_B(i)-MAXSTACK) | ||
359 | #define RC(i) (base+GETARG_C(i)) | 361 | #define RC(i) (base+GETARG_C(i)) |
360 | #define RKC(i) ((GETARG_C(i) < MAXSTACK) ? \ | 362 | #define RKC(i) ((GETARG_C(i) < MAXSTACK) ? RC(i) : k+GETARG_C(i)-MAXSTACK) |
361 | base+GETARG_C(i) : \ | ||
362 | k+GETARG_C(i)-MAXSTACK) | ||
363 | #define KBx(i) (k+GETARG_Bx(i)) | 363 | #define KBx(i) (k+GETARG_Bx(i)) |
364 | 364 | ||
365 | 365 | ||
@@ -423,7 +423,7 @@ StkId luaV_execute (lua_State *L) { | |||
423 | break; | 423 | break; |
424 | } | 424 | } |
425 | case OP_GETGLOBAL: { | 425 | case OP_GETGLOBAL: { |
426 | StkId rb = KBx(i); | 426 | TObject *rb = KBx(i); |
427 | const TObject *v; | 427 | const TObject *v; |
428 | lua_assert(ttisstring(rb) && ttistable(&cl->g)); | 428 | lua_assert(ttisstring(rb) && ttistable(&cl->g)); |
429 | v = luaH_getstr(hvalue(&cl->g), tsvalue(rb)); | 429 | v = luaH_getstr(hvalue(&cl->g), tsvalue(rb)); |
@@ -456,7 +456,7 @@ StkId luaV_execute (lua_State *L) { | |||
456 | break; | 456 | break; |
457 | } | 457 | } |
458 | case OP_SETTABLE: { | 458 | case OP_SETTABLE: { |
459 | luaV_settable(L, RB(i), RKC(i), ra); | 459 | luaV_settable(L, ra, RKB(i), RKC(i)); |
460 | break; | 460 | break; |
461 | } | 461 | } |
462 | case OP_NEWTABLE: { | 462 | case OP_NEWTABLE: { |
@@ -482,8 +482,8 @@ StkId luaV_execute (lua_State *L) { | |||
482 | break; | 482 | break; |
483 | } | 483 | } |
484 | case OP_ADD: { | 484 | case OP_ADD: { |
485 | StkId rb = RB(i); | 485 | TObject *rb = RKB(i); |
486 | StkId rc = RKC(i); | 486 | TObject *rc = RKC(i); |
487 | if (ttisnumber(rb) && ttisnumber(rc)) { | 487 | if (ttisnumber(rb) && ttisnumber(rc)) { |
488 | setnvalue(ra, nvalue(rb) + nvalue(rc)); | 488 | setnvalue(ra, nvalue(rb) + nvalue(rc)); |
489 | } | 489 | } |
@@ -492,8 +492,8 @@ StkId luaV_execute (lua_State *L) { | |||
492 | break; | 492 | break; |
493 | } | 493 | } |
494 | case OP_SUB: { | 494 | case OP_SUB: { |
495 | StkId rb = RB(i); | 495 | TObject *rb = RKB(i); |
496 | StkId rc = RKC(i); | 496 | TObject *rc = RKC(i); |
497 | if (ttisnumber(rb) && ttisnumber(rc)) { | 497 | if (ttisnumber(rb) && ttisnumber(rc)) { |
498 | setnvalue(ra, nvalue(rb) - nvalue(rc)); | 498 | setnvalue(ra, nvalue(rb) - nvalue(rc)); |
499 | } | 499 | } |
@@ -502,8 +502,8 @@ StkId luaV_execute (lua_State *L) { | |||
502 | break; | 502 | break; |
503 | } | 503 | } |
504 | case OP_MUL: { | 504 | case OP_MUL: { |
505 | StkId rb = RB(i); | 505 | TObject *rb = RKB(i); |
506 | StkId rc = RKC(i); | 506 | TObject *rc = RKC(i); |
507 | if (ttisnumber(rb) && ttisnumber(rc)) { | 507 | if (ttisnumber(rb) && ttisnumber(rc)) { |
508 | setnvalue(ra, nvalue(rb) * nvalue(rc)); | 508 | setnvalue(ra, nvalue(rb) * nvalue(rc)); |
509 | } | 509 | } |
@@ -512,8 +512,8 @@ StkId luaV_execute (lua_State *L) { | |||
512 | break; | 512 | break; |
513 | } | 513 | } |
514 | case OP_DIV: { | 514 | case OP_DIV: { |
515 | StkId rb = RB(i); | 515 | TObject *rb = RKB(i); |
516 | StkId rc = RKC(i); | 516 | TObject *rc = RKC(i); |
517 | if (ttisnumber(rb) && ttisnumber(rc)) { | 517 | if (ttisnumber(rb) && ttisnumber(rc)) { |
518 | setnvalue(ra, nvalue(rb) / nvalue(rc)); | 518 | setnvalue(ra, nvalue(rb) / nvalue(rc)); |
519 | } | 519 | } |
@@ -522,7 +522,7 @@ StkId luaV_execute (lua_State *L) { | |||
522 | break; | 522 | break; |
523 | } | 523 | } |
524 | case OP_POW: { | 524 | case OP_POW: { |
525 | Arith(L, ra, RB(i), RKC(i), TM_POW); | 525 | Arith(L, ra, RKB(i), RKC(i), TM_POW); |
526 | break; | 526 | break; |
527 | } | 527 | } |
528 | case OP_UNM: { | 528 | case OP_UNM: { |
@@ -556,35 +556,25 @@ StkId luaV_execute (lua_State *L) { | |||
556 | break; | 556 | break; |
557 | } | 557 | } |
558 | case OP_EQ: { /* skip next instruction if test fails */ | 558 | case OP_EQ: { /* skip next instruction if test fails */ |
559 | if (equalobj(L, ra, RKC(i)) != GETARG_B(i)) pc++; | 559 | if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; |
560 | else dojump(pc, GETARG_sBx(*pc) + 1); | 560 | else dojump(pc, GETARG_sBx(*pc) + 1); |
561 | break; | 561 | break; |
562 | } | 562 | } |
563 | case OP_LT: { | 563 | case OP_LT: { |
564 | if (luaV_lessthan(L, ra, RKC(i)) != GETARG_B(i)) pc++; | 564 | if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; |
565 | else dojump(pc, GETARG_sBx(*pc) + 1); | 565 | else dojump(pc, GETARG_sBx(*pc) + 1); |
566 | break; | 566 | break; |
567 | } | 567 | } |
568 | case OP_LE: { | 568 | case OP_LE: { |
569 | if (luaV_lessequal(L, ra, RKC(i)) != GETARG_B(i)) pc++; | 569 | if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; |
570 | else dojump(pc, GETARG_sBx(*pc) + 1); | ||
571 | break; | ||
572 | } | ||
573 | case OP_GT: { | ||
574 | if (luaV_lessthan(L, RKC(i), ra) != GETARG_B(i)) pc++; | ||
575 | else dojump(pc, GETARG_sBx(*pc) + 1); | ||
576 | break; | ||
577 | } | ||
578 | case OP_GE: { | ||
579 | if (luaV_lessequal(L, RKC(i), ra) != GETARG_B(i)) pc++; | ||
580 | else dojump(pc, GETARG_sBx(*pc) + 1); | 570 | else dojump(pc, GETARG_sBx(*pc) + 1); |
581 | break; | 571 | break; |
582 | } | 572 | } |
583 | case OP_TEST: { | 573 | case OP_TEST: { |
584 | StkId rc = RKC(i); | 574 | TObject *rb = RB(i); |
585 | if (l_isfalse(rc) == GETARG_B(i)) pc++; | 575 | if (l_isfalse(rb) == GETARG_C(i)) pc++; |
586 | else { | 576 | else { |
587 | setobj(ra, rc); | 577 | setobj(ra, rb); |
588 | dojump(pc, GETARG_sBx(*pc) + 1); | 578 | dojump(pc, GETARG_sBx(*pc) + 1); |
589 | } | 579 | } |
590 | break; | 580 | break; |