| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
| 6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "lib/error.h" | 10 #include "lib/error.h" |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 | 199 |
| 200 | 200 |
| 201 static void EmitAssertBoolean(Register reg, | 201 static void EmitAssertBoolean(Register reg, |
| 202 intptr_t token_pos, | 202 intptr_t token_pos, |
| 203 LocationSummary* locs, | 203 LocationSummary* locs, |
| 204 FlowGraphCompiler* compiler) { | 204 FlowGraphCompiler* compiler) { |
| 205 // Check that the type of the value is allowed in conditional context. | 205 // Check that the type of the value is allowed in conditional context. |
| 206 // Call the runtime if the object is not bool::true or bool::false. | 206 // Call the runtime if the object is not bool::true or bool::false. |
| 207 ASSERT(locs->always_calls()); | 207 ASSERT(locs->always_calls()); |
| 208 Label done; | 208 Label done; |
| 209 __ CompareObject(reg, compiler->bool_true()); | 209 __ CompareObject(reg, Bool::True()); |
| 210 __ j(EQUAL, &done, Assembler::kNearJump); | 210 __ j(EQUAL, &done, Assembler::kNearJump); |
| 211 __ CompareObject(reg, compiler->bool_false()); | 211 __ CompareObject(reg, Bool::False()); |
| 212 __ j(EQUAL, &done, Assembler::kNearJump); | 212 __ j(EQUAL, &done, Assembler::kNearJump); |
| 213 | 213 |
| 214 __ pushl(reg); // Push the source object. | 214 __ pushl(reg); // Push the source object. |
| 215 compiler->GenerateCallRuntime(token_pos, | 215 compiler->GenerateCallRuntime(token_pos, |
| 216 kConditionTypeErrorRuntimeEntry, | 216 kConditionTypeErrorRuntimeEntry, |
| 217 locs); | 217 locs); |
| 218 // We should never return here. | 218 // We should never return here. |
| 219 __ int3(); | 219 __ int3(); |
| 220 __ Bind(&done); | 220 __ Bind(&done); |
| 221 } | 221 } |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 | 392 |
| 393 __ Bind(&check_identity); | 393 __ Bind(&check_identity); |
| 394 Label equality_done; | 394 Label equality_done; |
| 395 if (compiler->is_optimizing()) { | 395 if (compiler->is_optimizing()) { |
| 396 // No need to update IC data. | 396 // No need to update IC data. |
| 397 Label is_true; | 397 Label is_true; |
| 398 __ popl(EAX); | 398 __ popl(EAX); |
| 399 __ popl(EDX); | 399 __ popl(EDX); |
| 400 __ cmpl(EAX, EDX); | 400 __ cmpl(EAX, EDX); |
| 401 __ j(EQUAL, &is_true); | 401 __ j(EQUAL, &is_true); |
| 402 __ LoadObject(EAX, (kind == Token::kEQ) ? compiler->bool_false() | 402 __ LoadObject(EAX, (kind == Token::kEQ) ? Bool::False() : Bool::True()); |
| 403 : compiler->bool_true()); | |
| 404 __ jmp(&equality_done); | 403 __ jmp(&equality_done); |
| 405 __ Bind(&is_true); | 404 __ Bind(&is_true); |
| 406 __ LoadObject(EAX, (kind == Token::kEQ) ? compiler->bool_true() | 405 __ LoadObject(EAX, (kind == Token::kEQ) ? Bool::True() : Bool::False()); |
| 407 : compiler->bool_false()); | |
| 408 if (kind == Token::kNE) { | 406 if (kind == Token::kNE) { |
| 409 // Skip not-equal result conversion. | 407 // Skip not-equal result conversion. |
| 410 __ jmp(&equality_done); | 408 __ jmp(&equality_done); |
| 411 } | 409 } |
| 412 } else { | 410 } else { |
| 413 // Call stub, load IC data in register. The stub will update ICData if | 411 // Call stub, load IC data in register. The stub will update ICData if |
| 414 // necessary. | 412 // necessary. |
| 415 Register ic_data_reg = locs->temp(0).reg(); | 413 Register ic_data_reg = locs->temp(0).reg(); |
| 416 ASSERT(ic_data_reg == ECX); // Stub depends on it. | 414 ASSERT(ic_data_reg == ECX); // Stub depends on it. |
| 417 __ LoadObject(ic_data_reg, equality_ic_data); | 415 __ LoadObject(ic_data_reg, equality_ic_data); |
| 418 compiler->GenerateCall(token_pos, | 416 compiler->GenerateCall(token_pos, |
| 419 &StubCode::EqualityWithNullArgLabel(), | 417 &StubCode::EqualityWithNullArgLabel(), |
| 420 PcDescriptors::kOther, | 418 PcDescriptors::kOther, |
| 421 locs); | 419 locs); |
| 422 __ Drop(2); | 420 __ Drop(2); |
| 423 } | 421 } |
| 424 __ Bind(&check_ne); | 422 __ Bind(&check_ne); |
| 425 if (kind == Token::kNE) { | 423 if (kind == Token::kNE) { |
| 426 Label false_label, true_label, done; | 424 Label false_label, true_label, done; |
| 427 // Negate the condition: true label returns false and vice versa. | 425 // Negate the condition: true label returns false and vice versa. |
| 428 __ CompareObject(EAX, compiler->bool_true()); | 426 __ CompareObject(EAX, Bool::True()); |
| 429 __ j(EQUAL, &true_label, Assembler::kNearJump); | 427 __ j(EQUAL, &true_label, Assembler::kNearJump); |
| 430 __ Bind(&false_label); | 428 __ Bind(&false_label); |
| 431 __ LoadObject(EAX, compiler->bool_true()); | 429 __ LoadObject(EAX, Bool::True()); |
| 432 __ jmp(&done, Assembler::kNearJump); | 430 __ jmp(&done, Assembler::kNearJump); |
| 433 __ Bind(&true_label); | 431 __ Bind(&true_label); |
| 434 __ LoadObject(EAX, compiler->bool_false()); | 432 __ LoadObject(EAX, Bool::False()); |
| 435 __ Bind(&done); | 433 __ Bind(&done); |
| 436 } | 434 } |
| 437 __ Bind(&equality_done); | 435 __ Bind(&equality_done); |
| 438 } | 436 } |
| 439 | 437 |
| 440 | 438 |
| 441 static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler, | 439 static void EmitEqualityAsPolymorphicCall(FlowGraphCompiler* compiler, |
| 442 const ICData& orig_ic_data, | 440 const ICData& orig_ic_data, |
| 443 LocationSummary* locs, | 441 LocationSummary* locs, |
| 444 BranchInstr* branch, | 442 BranchInstr* branch, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 if (target.Owner() == object_store->object_class()) { | 479 if (target.Owner() == object_store->object_class()) { |
| 482 // Object.== is same as ===. | 480 // Object.== is same as ===. |
| 483 __ Drop(2); | 481 __ Drop(2); |
| 484 __ cmpl(left, right); | 482 __ cmpl(left, right); |
| 485 if (branch != NULL) { | 483 if (branch != NULL) { |
| 486 branch->EmitBranchOnCondition(compiler, cond); | 484 branch->EmitBranchOnCondition(compiler, cond); |
| 487 } else { | 485 } else { |
| 488 Register result = locs->out().reg(); | 486 Register result = locs->out().reg(); |
| 489 Label load_true; | 487 Label load_true; |
| 490 __ j(cond, &load_true, Assembler::kNearJump); | 488 __ j(cond, &load_true, Assembler::kNearJump); |
| 491 __ LoadObject(result, compiler->bool_false()); | 489 __ LoadObject(result, Bool::False()); |
| 492 __ jmp(&done); | 490 __ jmp(&done); |
| 493 __ Bind(&load_true); | 491 __ Bind(&load_true); |
| 494 __ LoadObject(result, compiler->bool_true()); | 492 __ LoadObject(result, Bool::True()); |
| 495 } | 493 } |
| 496 } else { | 494 } else { |
| 497 const int kNumberOfArguments = 2; | 495 const int kNumberOfArguments = 2; |
| 498 const Array& kNoArgumentNames = Array::Handle(); | 496 const Array& kNoArgumentNames = Array::Handle(); |
| 499 compiler->GenerateStaticCall(deopt_id, | 497 compiler->GenerateStaticCall(deopt_id, |
| 500 token_pos, | 498 token_pos, |
| 501 target, | 499 target, |
| 502 kNumberOfArguments, | 500 kNumberOfArguments, |
| 503 kNoArgumentNames, | 501 kNoArgumentNames, |
| 504 locs); | 502 locs); |
| 505 if (branch == NULL) { | 503 if (branch == NULL) { |
| 506 if (kind == Token::kNE) { | 504 if (kind == Token::kNE) { |
| 507 Label false_label; | 505 Label false_label; |
| 508 __ CompareObject(EAX, compiler->bool_true()); | 506 __ CompareObject(EAX, Bool::True()); |
| 509 __ j(EQUAL, &false_label, Assembler::kNearJump); | 507 __ j(EQUAL, &false_label, Assembler::kNearJump); |
| 510 __ LoadObject(EAX, compiler->bool_true()); | 508 __ LoadObject(EAX, Bool::True()); |
| 511 __ jmp(&done); | 509 __ jmp(&done); |
| 512 __ Bind(&false_label); | 510 __ Bind(&false_label); |
| 513 __ LoadObject(EAX, compiler->bool_false()); | 511 __ LoadObject(EAX, Bool::False()); |
| 514 __ jmp(&done); | 512 __ jmp(&done); |
| 515 } | 513 } |
| 516 } else { | 514 } else { |
| 517 if (branch->is_checked()) { | 515 if (branch->is_checked()) { |
| 518 EmitAssertBoolean(EAX, token_pos, locs, compiler); | 516 EmitAssertBoolean(EAX, token_pos, locs, compiler); |
| 519 } | 517 } |
| 520 __ CompareObject(EAX, compiler->bool_true()); | 518 __ CompareObject(EAX, Bool::True()); |
| 521 branch->EmitBranchOnCondition(compiler, cond); | 519 branch->EmitBranchOnCondition(compiler, cond); |
| 522 } | 520 } |
| 523 } | 521 } |
| 524 __ jmp(&done); | 522 __ jmp(&done); |
| 525 __ Bind(&next_test); | 523 __ Bind(&next_test); |
| 526 } | 524 } |
| 527 // Fall through leads to deoptimization | 525 // Fall through leads to deoptimization |
| 528 __ jmp(deopt); | 526 __ jmp(deopt); |
| 529 __ Bind(&done); | 527 __ Bind(&done); |
| 530 } | 528 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 __ j(EQUAL, &identity_compare); | 561 __ j(EQUAL, &identity_compare); |
| 564 } | 562 } |
| 565 } | 563 } |
| 566 __ Bind(&identity_compare); | 564 __ Bind(&identity_compare); |
| 567 __ cmpl(left, right); | 565 __ cmpl(left, right); |
| 568 if (branch == NULL) { | 566 if (branch == NULL) { |
| 569 Label done, is_equal; | 567 Label done, is_equal; |
| 570 Register result = locs.out().reg(); | 568 Register result = locs.out().reg(); |
| 571 __ j(EQUAL, &is_equal, Assembler::kNearJump); | 569 __ j(EQUAL, &is_equal, Assembler::kNearJump); |
| 572 // Not equal. | 570 // Not equal. |
| 573 __ LoadObject(result, (kind == Token::kEQ) ? compiler->bool_false() | 571 __ LoadObject(result, (kind == Token::kEQ) ? Bool::False() : Bool::True()); |
| 574 : compiler->bool_true()); | |
| 575 __ jmp(&done, Assembler::kNearJump); | 572 __ jmp(&done, Assembler::kNearJump); |
| 576 __ Bind(&is_equal); | 573 __ Bind(&is_equal); |
| 577 __ LoadObject(result, (kind == Token::kEQ) ? compiler->bool_true() | 574 __ LoadObject(result, (kind == Token::kEQ) ? Bool::True() : Bool::False()); |
| 578 : compiler->bool_false()); | |
| 579 __ Bind(&done); | 575 __ Bind(&done); |
| 580 } else { | 576 } else { |
| 581 Condition cond = TokenKindToSmiCondition(kind); | 577 Condition cond = TokenKindToSmiCondition(kind); |
| 582 branch->EmitBranchOnCondition(compiler, cond); | 578 branch->EmitBranchOnCondition(compiler, cond); |
| 583 } | 579 } |
| 584 } | 580 } |
| 585 | 581 |
| 586 | 582 |
| 587 // First test if receiver is NULL, in which case === is applied. | 583 // First test if receiver is NULL, in which case === is applied. |
| 588 // If type feedback was provided (lists of <class-id, target>), do a | 584 // If type feedback was provided (lists of <class-id, target>), do a |
| (...skipping 19 matching lines...) Expand all Loading... |
| 608 // Comparison with NULL is "===". | 604 // Comparison with NULL is "===". |
| 609 __ Bind(&identity_compare); | 605 __ Bind(&identity_compare); |
| 610 __ cmpl(left, right); | 606 __ cmpl(left, right); |
| 611 Condition cond = TokenKindToSmiCondition(kind); | 607 Condition cond = TokenKindToSmiCondition(kind); |
| 612 if (branch != NULL) { | 608 if (branch != NULL) { |
| 613 branch->EmitBranchOnCondition(compiler, cond); | 609 branch->EmitBranchOnCondition(compiler, cond); |
| 614 } else { | 610 } else { |
| 615 Register result = locs->out().reg(); | 611 Register result = locs->out().reg(); |
| 616 Label load_true; | 612 Label load_true; |
| 617 __ j(cond, &load_true, Assembler::kNearJump); | 613 __ j(cond, &load_true, Assembler::kNearJump); |
| 618 __ LoadObject(result, compiler->bool_false()); | 614 __ LoadObject(result, Bool::False()); |
| 619 __ jmp(&done); | 615 __ jmp(&done); |
| 620 __ Bind(&load_true); | 616 __ Bind(&load_true); |
| 621 __ LoadObject(result, compiler->bool_true()); | 617 __ LoadObject(result, Bool::True()); |
| 622 } | 618 } |
| 623 __ jmp(&done); | 619 __ jmp(&done); |
| 624 __ Bind(&non_null_compare); // Receiver is not null. | 620 __ Bind(&non_null_compare); // Receiver is not null. |
| 625 __ pushl(left); | 621 __ pushl(left); |
| 626 __ pushl(right); | 622 __ pushl(right); |
| 627 EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind, | 623 EmitEqualityAsPolymorphicCall(compiler, ic_data, locs, branch, kind, |
| 628 deopt_id, token_pos); | 624 deopt_id, token_pos); |
| 629 __ Bind(&done); | 625 __ Bind(&done); |
| 630 } | 626 } |
| 631 | 627 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 648 } else { | 644 } else { |
| 649 __ cmpl(left.reg(), right.reg()); | 645 __ cmpl(left.reg(), right.reg()); |
| 650 } | 646 } |
| 651 | 647 |
| 652 if (branch != NULL) { | 648 if (branch != NULL) { |
| 653 branch->EmitBranchOnCondition(compiler, true_condition); | 649 branch->EmitBranchOnCondition(compiler, true_condition); |
| 654 } else { | 650 } else { |
| 655 Register result = locs.out().reg(); | 651 Register result = locs.out().reg(); |
| 656 Label done, is_true; | 652 Label done, is_true; |
| 657 __ j(true_condition, &is_true); | 653 __ j(true_condition, &is_true); |
| 658 __ LoadObject(result, compiler->bool_false()); | 654 __ LoadObject(result, Bool::False()); |
| 659 __ jmp(&done); | 655 __ jmp(&done); |
| 660 __ Bind(&is_true); | 656 __ Bind(&is_true); |
| 661 __ LoadObject(result, compiler->bool_true()); | 657 __ LoadObject(result, Bool::True()); |
| 662 __ Bind(&done); | 658 __ Bind(&done); |
| 663 } | 659 } |
| 664 } | 660 } |
| 665 | 661 |
| 666 | 662 |
| 667 static Condition TokenKindToMintCondition(Token::Kind kind) { | 663 static Condition TokenKindToMintCondition(Token::Kind kind) { |
| 668 switch (kind) { | 664 switch (kind) { |
| 669 case Token::kEQ: return EQUAL; | 665 case Token::kEQ: return EQUAL; |
| 670 case Token::kNE: return NOT_EQUAL; | 666 case Token::kNE: return NOT_EQUAL; |
| 671 case Token::kLT: return LESS; | 667 case Token::kLT: return LESS; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 693 | 689 |
| 694 Condition true_condition = TokenKindToMintCondition(kind); | 690 Condition true_condition = TokenKindToMintCondition(kind); |
| 695 __ cmpl(temp, Immediate(-1)); | 691 __ cmpl(temp, Immediate(-1)); |
| 696 | 692 |
| 697 if (branch != NULL) { | 693 if (branch != NULL) { |
| 698 branch->EmitBranchOnCondition(compiler, true_condition); | 694 branch->EmitBranchOnCondition(compiler, true_condition); |
| 699 } else { | 695 } else { |
| 700 Register result = locs.out().reg(); | 696 Register result = locs.out().reg(); |
| 701 Label done, is_true; | 697 Label done, is_true; |
| 702 __ j(true_condition, &is_true); | 698 __ j(true_condition, &is_true); |
| 703 __ LoadObject(result, compiler->bool_false()); | 699 __ LoadObject(result, Bool::False()); |
| 704 __ jmp(&done); | 700 __ jmp(&done); |
| 705 __ Bind(&is_true); | 701 __ Bind(&is_true); |
| 706 __ LoadObject(result, compiler->bool_true()); | 702 __ LoadObject(result, Bool::True()); |
| 707 __ Bind(&done); | 703 __ Bind(&done); |
| 708 } | 704 } |
| 709 } | 705 } |
| 710 | 706 |
| 711 | 707 |
| 712 static void EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler, | 708 static void EmitUnboxedMintComparisonOp(FlowGraphCompiler* compiler, |
| 713 const LocationSummary& locs, | 709 const LocationSummary& locs, |
| 714 Token::Kind kind, | 710 Token::Kind kind, |
| 715 BranchInstr* branch) { | 711 BranchInstr* branch) { |
| 716 XmmRegister left = locs.in(0).xmm_reg(); | 712 XmmRegister left = locs.in(0).xmm_reg(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 // If upper is equal, compare lower half. | 754 // If upper is equal, compare lower half. |
| 759 __ pextrd(left_tmp, left, Immediate(0)); | 755 __ pextrd(left_tmp, left, Immediate(0)); |
| 760 __ pextrd(right_tmp, right, Immediate(0)); | 756 __ pextrd(right_tmp, right, Immediate(0)); |
| 761 __ cmpl(left_tmp, right_tmp); | 757 __ cmpl(left_tmp, right_tmp); |
| 762 if (branch != NULL) { | 758 if (branch != NULL) { |
| 763 branch->EmitBranchOnCondition(compiler, lo_cond); | 759 branch->EmitBranchOnCondition(compiler, lo_cond); |
| 764 } else { | 760 } else { |
| 765 Label done; | 761 Label done; |
| 766 __ j(lo_cond, &is_true); | 762 __ j(lo_cond, &is_true); |
| 767 __ Bind(&is_false); | 763 __ Bind(&is_false); |
| 768 __ LoadObject(result, compiler->bool_false()); | 764 __ LoadObject(result, Bool::False()); |
| 769 __ jmp(&done); | 765 __ jmp(&done); |
| 770 __ Bind(&is_true); | 766 __ Bind(&is_true); |
| 771 __ LoadObject(result, compiler->bool_true()); | 767 __ LoadObject(result, Bool::True()); |
| 772 __ Bind(&done); | 768 __ Bind(&done); |
| 773 } | 769 } |
| 774 } | 770 } |
| 775 | 771 |
| 776 | 772 |
| 777 static Condition TokenKindToDoubleCondition(Token::Kind kind) { | 773 static Condition TokenKindToDoubleCondition(Token::Kind kind) { |
| 778 switch (kind) { | 774 switch (kind) { |
| 779 case Token::kEQ: return EQUAL; | 775 case Token::kEQ: return EQUAL; |
| 780 case Token::kNE: return NOT_EQUAL; | 776 case Token::kNE: return NOT_EQUAL; |
| 781 case Token::kLT: return BELOW; | 777 case Token::kLT: return BELOW; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 EmitEqualityAsInstanceCall(compiler, | 880 EmitEqualityAsInstanceCall(compiler, |
| 885 deopt_id(), | 881 deopt_id(), |
| 886 token_pos(), | 882 token_pos(), |
| 887 Token::kEQ, // kNE reverse occurs at branch. | 883 Token::kEQ, // kNE reverse occurs at branch. |
| 888 locs(), | 884 locs(), |
| 889 *ic_data()); | 885 *ic_data()); |
| 890 if (branch->is_checked()) { | 886 if (branch->is_checked()) { |
| 891 EmitAssertBoolean(EAX, token_pos(), locs(), compiler); | 887 EmitAssertBoolean(EAX, token_pos(), locs(), compiler); |
| 892 } | 888 } |
| 893 Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL; | 889 Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL; |
| 894 __ CompareObject(EAX, compiler->bool_true()); | 890 __ CompareObject(EAX, Bool::True()); |
| 895 branch->EmitBranchOnCondition(compiler, branch_condition); | 891 branch->EmitBranchOnCondition(compiler, branch_condition); |
| 896 } | 892 } |
| 897 | 893 |
| 898 | 894 |
| 899 LocationSummary* RelationalOpInstr::MakeLocationSummary() const { | 895 LocationSummary* RelationalOpInstr::MakeLocationSummary() const { |
| 900 const intptr_t kNumInputs = 2; | 896 const intptr_t kNumInputs = 2; |
| 901 const intptr_t kNumTemps = 0; | 897 const intptr_t kNumTemps = 0; |
| 902 if (operands_class_id() == kMintCid) { | 898 if (operands_class_id() == kMintCid) { |
| 903 const intptr_t kNumTemps = 2; | 899 const intptr_t kNumTemps = 2; |
| 904 LocationSummary* locs = | 900 LocationSummary* locs = |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 } | 1020 } |
| 1025 if (operands_class_id() == kMintCid) { | 1021 if (operands_class_id() == kMintCid) { |
| 1026 EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), branch); | 1022 EmitUnboxedMintComparisonOp(compiler, *locs(), kind(), branch); |
| 1027 return; | 1023 return; |
| 1028 } | 1024 } |
| 1029 if (operands_class_id() == kDoubleCid) { | 1025 if (operands_class_id() == kDoubleCid) { |
| 1030 EmitDoubleComparisonOp(compiler, *locs(), kind(), branch); | 1026 EmitDoubleComparisonOp(compiler, *locs(), kind(), branch); |
| 1031 return; | 1027 return; |
| 1032 } | 1028 } |
| 1033 EmitNativeCode(compiler); | 1029 EmitNativeCode(compiler); |
| 1034 __ CompareObject(EAX, compiler->bool_true()); | 1030 __ CompareObject(EAX, Bool::True()); |
| 1035 branch->EmitBranchOnCondition(compiler, EQUAL); | 1031 branch->EmitBranchOnCondition(compiler, EQUAL); |
| 1036 } | 1032 } |
| 1037 | 1033 |
| 1038 | 1034 |
| 1039 LocationSummary* NativeCallInstr::MakeLocationSummary() const { | 1035 LocationSummary* NativeCallInstr::MakeLocationSummary() const { |
| 1040 const intptr_t kNumInputs = 0; | 1036 const intptr_t kNumInputs = 0; |
| 1041 const intptr_t kNumTemps = 3; | 1037 const intptr_t kNumTemps = 3; |
| 1042 LocationSummary* locs = | 1038 LocationSummary* locs = |
| 1043 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 1039 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); |
| 1044 locs->set_temp(0, Location::RegisterLocation(EAX)); | 1040 locs->set_temp(0, Location::RegisterLocation(EAX)); |
| (...skipping 1772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2817 __ pcmpeqq(XMM0, XMM0); // Generate all 1's. | 2813 __ pcmpeqq(XMM0, XMM0); // Generate all 1's. |
| 2818 __ pxor(value, XMM0); | 2814 __ pxor(value, XMM0); |
| 2819 } | 2815 } |
| 2820 | 2816 |
| 2821 | 2817 |
| 2822 } // namespace dart | 2818 } // namespace dart |
| 2823 | 2819 |
| 2824 #undef __ | 2820 #undef __ |
| 2825 | 2821 |
| 2826 #endif // defined TARGET_ARCH_X64 | 2822 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |