565 frame.reg[INS_A(instruction)] = RB; |
565 frame.reg[INS_A(instruction)] = RB; |
566 break; |
566 break; |
567 case OP_JMP: |
567 case OP_JMP: |
568 frame.pc+=INS_sBx(instruction); |
568 frame.pc+=INS_sBx(instruction); |
569 break; |
569 break; |
|
570 case OP_ADD: |
|
571 var RB = RK(frame, INS_B(instruction)); |
|
572 var RC = RK(frame, INS_C(instruction)); |
|
573 frame.reg[INS_A(instruction)] = RB.add(RC); |
|
574 break; |
|
575 case OP_SUB: |
|
576 var RB = frame.reg[INS_B(instruction)]; |
|
577 var RC = frame.reg[INS_C(instruction)]; |
|
578 frame.reg[INS_A(instruction)] = new LValue(this, "number", RB.value - RC.value); |
|
579 break; |
570 case OP_EQ: |
580 case OP_EQ: |
571 var A = INS_A(instruction); |
581 var A = INS_A(instruction); |
572 var RB = RK(frame, INS_B(instruction)); |
582 var RB = RK(frame, INS_B(instruction)); |
573 var RC = RK(frame, INS_C(instruction)); |
583 var RC = RK(frame, INS_C(instruction)); |
574 if(RB.equals(RC) != (A!=0)) |
584 if(RB.equals(RC) != (A!=0)) |
575 frame.pc++; |
585 frame.pc++; |
576 break; |
586 break; |
577 case OP_ADD: |
587 case OP_LT: |
|
588 var A = INS_A(instruction); |
578 var RB = RK(frame, INS_B(instruction)); |
589 var RB = RK(frame, INS_B(instruction)); |
579 var RC = RK(frame, INS_C(instruction)); |
590 var RC = RK(frame, INS_C(instruction)); |
580 frame.reg[INS_A(instruction)] = RB.add(RC); |
591 if(RB.value < RC.value != (A!=0)) |
581 break; |
|
582 case OP_SUB: |
|
583 var RB = frame.reg[INS_B(instruction)]; |
|
584 var RC = frame.reg[INS_C(instruction)]; |
|
585 frame.reg[INS_A(instruction)] = new LValue(this, "number", RB.value - RC.value); |
|
586 break; |
|
587 case OP_LT: |
|
588 var RB = RK(frame, INS_B(instruction)); |
|
589 var RC = RK(frame, INS_C(instruction)); |
|
590 if(RB.value < RC.value) |
|
591 frame.pc++; |
592 frame.pc++; |
592 break; |
593 break; |
593 default: |
594 default: |
594 throw "Unhandled opcode: "+INS_OPCODE(instruction); |
595 throw "Unhandled opcode: "+INS_OPCODE(instruction); |
595 } |
596 } |