Changeset 33340
- Timestamp:
- 05/12/08 23:04:08 (6 months ago)
- Location:
- branches/squirrelfish/JavaScriptCore
- Files:
-
- 5 modified
-
ChangeLog (modified) (1 diff)
-
VM/CodeGenerator.cpp (modified) (1 diff)
-
VM/CodeGenerator.h (modified) (1 diff)
-
VM/Machine.cpp (modified) (7 diffs)
-
kjs/nodes.cpp (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/squirrelfish/JavaScriptCore/ChangeLog
r33339 r33340 1 2008-05-04 Maciej Stachowiak <mjs@apple.com> 2 3 Reviewed by Geoff. 4 5 - document some more opcodes (and fix argument names) 6 7 Added docs for eq, neq, stricteq, nstriceq, less and lesseq. 8 9 * VM/CodeGenerator.cpp: 10 (KJS::CodeGenerator::emitEqual): 11 (KJS::CodeGenerator::emitNotEqual): 12 (KJS::CodeGenerator::emitStrictEqual): 13 (KJS::CodeGenerator::emitNotStrictEqual): 14 (KJS::CodeGenerator::emitLess): 15 (KJS::CodeGenerator::emitLessEq): 16 * VM/CodeGenerator.h: 17 * VM/Machine.cpp: 18 (KJS::Machine::privateExecute): 19 * kjs/nodes.cpp: 20 (KJS::LessNode::emitCode): 21 (KJS::GreaterNode::emitCode): 22 (KJS::LessEqNode::emitCode): 23 (KJS::GreaterEqNode::emitCode): 24 (KJS::EqualNode::emitCode): 25 (KJS::NotEqualNode::emitCode): 26 (KJS::StrictEqualNode::emitCode): 27 (KJS::NotStrictEqualNode::emitCode): 28 (KJS::CaseBlockNode::emitCodeForBlock): 29 1 30 2008-05-04 Geoffrey Garen <ggaren@apple.com> 2 31 -
branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.cpp
r33339 r33340 431 431 } 432 432 433 RegisterID* CodeGenerator::emitEqual(RegisterID* r0, RegisterID* r1, RegisterID* r2)433 RegisterID* CodeGenerator::emitEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2) 434 434 { 435 435 instructions().append(machine().getOpcode(op_eq)); 436 instructions().append( r0->index());437 instructions().append( r1->index());438 instructions().append( r2->index());439 return r0;440 } 441 442 RegisterID* CodeGenerator::emitNotEqual(RegisterID* r0, RegisterID* r1, RegisterID* r2)436 instructions().append(dst->index()); 437 instructions().append(src1->index()); 438 instructions().append(src2->index()); 439 return dst; 440 } 441 442 RegisterID* CodeGenerator::emitNotEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2) 443 443 { 444 444 instructions().append(machine().getOpcode(op_neq)); 445 instructions().append( r0->index());446 instructions().append( r1->index());447 instructions().append( r2->index());448 return r0;449 } 450 451 RegisterID* CodeGenerator::emitStrictEqual(RegisterID* r0, RegisterID* r1, RegisterID* r2)445 instructions().append(dst->index()); 446 instructions().append(src1->index()); 447 instructions().append(src2->index()); 448 return dst; 449 } 450 451 RegisterID* CodeGenerator::emitStrictEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2) 452 452 { 453 453 instructions().append(machine().getOpcode(op_stricteq)); 454 instructions().append( r0->index());455 instructions().append( r1->index());456 instructions().append( r2->index());457 return r0;458 } 459 460 RegisterID* CodeGenerator::emitNotStrictEqual(RegisterID* r0, RegisterID* r1, RegisterID* r2)454 instructions().append(dst->index()); 455 instructions().append(src1->index()); 456 instructions().append(src2->index()); 457 return dst; 458 } 459 460 RegisterID* CodeGenerator::emitNotStrictEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2) 461 461 { 462 462 instructions().append(machine().getOpcode(op_nstricteq)); 463 instructions().append( r0->index());464 instructions().append( r1->index());465 instructions().append( r2->index());466 return r0;467 } 468 469 RegisterID* CodeGenerator::emitLess(RegisterID* r0, RegisterID* r1, RegisterID* r2)463 instructions().append(dst->index()); 464 instructions().append(src1->index()); 465 instructions().append(src2->index()); 466 return dst; 467 } 468 469 RegisterID* CodeGenerator::emitLess(RegisterID* dst, RegisterID* src1, RegisterID* src2) 470 470 { 471 471 instructions().append(machine().getOpcode(op_less)); 472 instructions().append( r0->index());473 instructions().append( r1->index());474 instructions().append( r2->index());475 return r0;476 } 477 478 RegisterID* CodeGenerator::emitLessEq(RegisterID* r0, RegisterID* r1, RegisterID* r2)472 instructions().append(dst->index()); 473 instructions().append(src1->index()); 474 instructions().append(src2->index()); 475 return dst; 476 } 477 478 RegisterID* CodeGenerator::emitLessEq(RegisterID* dst, RegisterID* src1, RegisterID* src2) 479 479 { 480 480 instructions().append(machine().getOpcode(op_lesseq)); 481 instructions().append( r0->index());482 instructions().append( r1->index());483 instructions().append( r2->index());484 return r0;481 instructions().append(dst->index()); 482 instructions().append(src1->index()); 483 instructions().append(src2->index()); 484 return dst; 485 485 } 486 486 -
branches/squirrelfish/JavaScriptCore/VM/CodeGenerator.h
r33335 r33340 156 156 157 157 RegisterID* emitNot(RegisterID* dst, RegisterID* src); 158 RegisterID* emitEqual(RegisterID* , RegisterID*, RegisterID*);159 RegisterID* emitNotEqual(RegisterID* , RegisterID*, RegisterID*);160 RegisterID* emitStrictEqual(RegisterID* , RegisterID*, RegisterID*);161 RegisterID* emitNotStrictEqual(RegisterID* , RegisterID*, RegisterID*);162 RegisterID* emitLess(RegisterID* , RegisterID*, RegisterID*);163 RegisterID* emitLessEq(RegisterID* , RegisterID*, RegisterID*);158 RegisterID* emitEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2); 159 RegisterID* emitNotEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2); 160 RegisterID* emitStrictEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2); 161 RegisterID* emitNotStrictEqual(RegisterID* dst, RegisterID* src1, RegisterID* src2); 162 RegisterID* emitLess(RegisterID* dst, RegisterID* src1, RegisterID* src2); 163 RegisterID* emitLessEq(RegisterID* dst, RegisterID* src1, RegisterID* src2); 164 164 165 165 RegisterID* emitToJSNumber(RegisterID* dst, RegisterID* src); -
branches/squirrelfish/JavaScriptCore/VM/Machine.cpp
r33339 r33340 822 822 } 823 823 BEGIN_OPCODE(op_eq) { 824 int r0 = (++vPC)->u.operand; 825 int r1 = (++vPC)->u.operand; 826 int r2 = (++vPC)->u.operand; 827 r[r0].u.jsValue = jsBoolean(equal(exec, r[r1].u.jsValue, r[r2].u.jsValue)); 824 /* eq dst(r) src1(r) src2(r) 825 826 Checks whether register src1 and register src2 are equal, 827 as with the ECMAScript '==' operator, and puts the result 828 as a boolean in register dst. 829 */ 830 int dst = (++vPC)->u.operand; 831 int src1 = (++vPC)->u.operand; 832 int src2 = (++vPC)->u.operand; 833 r[dst].u.jsValue = jsBoolean(equal(exec, r[src1].u.jsValue, r[src2].u.jsValue)); 828 834 829 835 ++vPC; … … 831 837 } 832 838 BEGIN_OPCODE(op_neq) { 833 int r0 = (++vPC)->u.operand; 834 int r1 = (++vPC)->u.operand; 835 int r2 = (++vPC)->u.operand; 836 r[r0].u.jsValue = jsBoolean(!equal(exec, r[r1].u.jsValue, r[r2].u.jsValue)); 839 /* neq dst(r) src1(r) src2(r) 840 841 Checks whether register src1 and register src2 are not 842 equal, as with the ECMAScript '!=' operator, and puts the 843 result as a boolean in register dst. 844 */ 845 int dst = (++vPC)->u.operand; 846 int src1 = (++vPC)->u.operand; 847 int src2 = (++vPC)->u.operand; 848 r[dst].u.jsValue = jsBoolean(!equal(exec, r[src1].u.jsValue, r[src2].u.jsValue)); 837 849 838 850 ++vPC; … … 840 852 } 841 853 BEGIN_OPCODE(op_stricteq) { 842 int r0 = (++vPC)->u.operand; 843 int r1 = (++vPC)->u.operand; 844 int r2 = (++vPC)->u.operand; 845 r[r0].u.jsValue = jsBoolean(strictEqual(exec, r[r1].u.jsValue, r[r2].u.jsValue)); 854 /* stricteq dst(r) src1(r) src2(r) 855 856 Checks whether register src1 and register src2 are strictly 857 equal, as with the ECMAScript '===' operator, and puts the 858 result as a boolean in register dst. 859 */ 860 int dst = (++vPC)->u.operand; 861 int src1 = (++vPC)->u.operand; 862 int src2 = (++vPC)->u.operand; 863 r[dst].u.jsValue = jsBoolean(strictEqual(exec, r[src1].u.jsValue, r[src2].u.jsValue)); 846 864 847 865 ++vPC; … … 849 867 } 850 868 BEGIN_OPCODE(op_nstricteq) { 851 int r0 = (++vPC)->u.operand; 852 int r1 = (++vPC)->u.operand; 853 int r2 = (++vPC)->u.operand; 854 r[r0].u.jsValue = jsBoolean(!strictEqual(exec, r[r1].u.jsValue, r[r2].u.jsValue)); 869 /* nstricteq dst(r) src1(r) src2(r) 870 871 Checks whether register src1 and register src2 are not 872 strictly equal, as with the ECMAScript '!==' operator, and 873 puts the result as a boolean in register dst. 874 */ 875 int dst = (++vPC)->u.operand; 876 int src1 = (++vPC)->u.operand; 877 int src2 = (++vPC)->u.operand; 878 r[dst].u.jsValue = jsBoolean(!strictEqual(exec, r[src1].u.jsValue, r[src2].u.jsValue)); 855 879 856 880 ++vPC; … … 858 882 } 859 883 BEGIN_OPCODE(op_less) { 860 int r0 = (++vPC)->u.operand; 861 int r1 = (++vPC)->u.operand; 862 int r2 = (++vPC)->u.operand; 863 r[r0].u.jsValue = jsBoolean(jsLess(exec, r[r1].u.jsValue, r[r2].u.jsValue)); 884 /* less dst(r) src1(r) src2(r) 885 886 Checks whether register src1 is less than register src2, as 887 with the ECMAScript '<' operator, and puts the result as 888 a boolean in register dst. 889 */ 890 int dst = (++vPC)->u.operand; 891 int src1 = (++vPC)->u.operand; 892 int src2 = (++vPC)->u.operand; 893 r[dst].u.jsValue = jsBoolean(jsLess(exec, r[src1].u.jsValue, r[src2].u.jsValue)); 864 894 865 895 ++vPC; … … 867 897 } 868 898 BEGIN_OPCODE(op_lesseq) { 869 int r0 = (++vPC)->u.operand; 870 int r1 = (++vPC)->u.operand; 871 int r2 = (++vPC)->u.operand; 872 r[r0].u.jsValue = jsBoolean(jsLessEq(exec, r[r1].u.jsValue, r[r2].u.jsValue)); 899 /* lesseq dst(r) src1(r) src2(r) 900 901 Checks whether register src1 is less than or equal to 902 register src2, as with the ECMAScript '<=' operator, and 903 puts the result as a boolean in register dst. 904 */ 905 int dst = (++vPC)->u.operand; 906 int src1 = (++vPC)->u.operand; 907 int src2 = (++vPC)->u.operand; 908 r[dst].u.jsValue = jsBoolean(jsLessEq(exec, r[src1].u.jsValue, r[src2].u.jsValue)); 873 909 874 910 ++vPC; … … 1295 1331 } 1296 1332 BEGIN_OPCODE(op_get_by_id) { 1297 /* get_ prop_id dst(r) base(r) property(id)1333 /* get_by_id dst(r) base(r) property(id) 1298 1334 1299 1335 Converts register base to Object, gets the property -
branches/squirrelfish/JavaScriptCore/kjs/nodes.cpp
r33337 r33340 3340 3340 RegisterID* LessNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3341 3341 { 3342 RefPtr<RegisterID> r0= generator.emitNode(m_expr1.get());3343 RegisterID* r1= generator.emitNode(m_expr2.get());3344 return generator.emitLess(generator.finalDestination(dst, r0.get()), r0.get(), r1);3342 RefPtr<RegisterID> src1 = generator.emitNode(m_expr1.get()); 3343 RegisterID* src2 = generator.emitNode(m_expr2.get()); 3344 return generator.emitLess(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3345 3345 } 3346 3346 … … 3409 3409 RegisterID* GreaterNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3410 3410 { 3411 RefPtr<RegisterID> r0= generator.emitNode(m_expr2.get());3412 RegisterID* r1= generator.emitNode(m_expr1.get());3413 return generator.emitLess(generator.finalDestination(dst, r0.get()), r0.get(), r1);3411 RefPtr<RegisterID> src1 = generator.emitNode(m_expr2.get()); 3412 RegisterID* src2 = generator.emitNode(m_expr1.get()); 3413 return generator.emitLess(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3414 3414 } 3415 3415 … … 3442 3442 RegisterID* LessEqNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3443 3443 { 3444 RefPtr<RegisterID> r0= generator.emitNode(m_expr1.get());3445 RegisterID* r1= generator.emitNode(m_expr2.get());3446 return generator.emitLessEq(generator.finalDestination(dst, r0.get()), r0.get(), r1);3444 RefPtr<RegisterID> src1 = generator.emitNode(m_expr1.get()); 3445 RegisterID* src2 = generator.emitNode(m_expr2.get()); 3446 return generator.emitLessEq(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3447 3447 } 3448 3448 … … 3475 3475 RegisterID* GreaterEqNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3476 3476 { 3477 RefPtr<RegisterID> r0= generator.emitNode(m_expr2.get());3478 RegisterID* r1= generator.emitNode(m_expr1.get());3479 return generator.emitLessEq(generator.finalDestination(dst, r0.get()), r0.get(), r1);3477 RefPtr<RegisterID> src1 = generator.emitNode(m_expr2.get()); 3478 RegisterID* src2 = generator.emitNode(m_expr1.get()); 3479 return generator.emitLessEq(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3480 3480 } 3481 3481 … … 3612 3612 RegisterID* EqualNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3613 3613 { 3614 RefPtr<RegisterID> r0= generator.emitNode(m_expr1.get());3615 RegisterID* r1= generator.emitNode(m_expr2.get());3616 return generator.emitEqual(generator.finalDestination(dst, r0.get()), r0.get(), r1);3614 RefPtr<RegisterID> src1 = generator.emitNode(m_expr1.get()); 3615 RegisterID* src2 = generator.emitNode(m_expr2.get()); 3616 return generator.emitEqual(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3617 3617 } 3618 3618 … … 3646 3646 RegisterID* NotEqualNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3647 3647 { 3648 RefPtr<RegisterID> r0= generator.emitNode(m_expr1.get());3649 RegisterID* r1= generator.emitNode(m_expr2.get());3650 return generator.emitNotEqual(generator.finalDestination(dst, r0.get()), r0.get(), r1);3648 RefPtr<RegisterID> src1 = generator.emitNode(m_expr1.get()); 3649 RegisterID* src2 = generator.emitNode(m_expr2.get()); 3650 return generator.emitNotEqual(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3651 3651 } 3652 3652 … … 3680 3680 RegisterID* StrictEqualNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3681 3681 { 3682 RefPtr<RegisterID> r0= generator.emitNode(m_expr1.get());3683 RegisterID* r1= generator.emitNode(m_expr2.get());3684 return generator.emitStrictEqual(generator.finalDestination(dst, r0.get()), r0.get(), r1);3682 RefPtr<RegisterID> src1 = generator.emitNode(m_expr1.get()); 3683 RegisterID* src2 = generator.emitNode(m_expr2.get()); 3684 return generator.emitStrictEqual(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3685 3685 } 3686 3686 … … 3714 3714 RegisterID* NotStrictEqualNode::emitCode(CodeGenerator& generator, RegisterID* dst) 3715 3715 { 3716 RefPtr<RegisterID> r0= generator.emitNode(m_expr1.get());3717 RegisterID* r1= generator.emitNode(m_expr2.get());3718 return generator.emitNotStrictEqual(generator.finalDestination(dst, r0.get()), r0.get(), r1);3716 RefPtr<RegisterID> src1 = generator.emitNode(m_expr1.get()); 3717 RegisterID* src2 = generator.emitNode(m_expr2.get()); 3718 return generator.emitNotStrictEqual(generator.finalDestination(dst, src1.get()), src1.get(), src2); 3719 3719 } 3720 3720 … … 5399 5399 // Setup jumps 5400 5400 for (ClauseListNode* list = m_list1.get(); list; list = list->getNext()) { 5401 RegisterID* r0= generator.emitNode(list->getClause()->expr());5402 generator.emitStrictEqual( r0, r0, switchExpression);5401 RegisterID* clauseVal = generator.emitNode(list->getClause()->expr()); 5402 generator.emitStrictEqual(clauseVal, clauseVal, switchExpression); 5403 5403 labelVector.append(generator.newLabel()); 5404 generator.emitJumpIfTrue( r0, labelVector[labelVector.size() - 1].get());5404 generator.emitJumpIfTrue(clauseVal, labelVector[labelVector.size() - 1].get()); 5405 5405 } 5406 5406 5407 5407 for (ClauseListNode* list = m_list2.get(); list; list = list->getNext()) { 5408 RegisterID* r0= generator.emitNode(list->getClause()->expr());5409 generator.emitStrictEqual( r0, r0, switchExpression);5408 RegisterID* clauseVal = generator.emitNode(list->getClause()->expr()); 5409 generator.emitStrictEqual(clauseVal, clauseVal, switchExpression); 5410 5410 labelVector.append(generator.newLabel()); 5411 generator.emitJumpIfTrue( r0, labelVector[labelVector.size() - 1].get());5411 generator.emitJumpIfTrue(clauseVal, labelVector[labelVector.size() - 1].get()); 5412 5412 } 5413 5413