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