| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 | 6 |
| 7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
| 8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
| 9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/ppc/macro-assembler-ppc.h" | 10 #include "src/ppc/macro-assembler-ppc.h" |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 MemOperand operand = i.MemoryOperand(&mode); \ | 376 MemOperand operand = i.MemoryOperand(&mode); \ |
| 377 if (mode == kMode_MRI) { \ | 377 if (mode == kMode_MRI) { \ |
| 378 __ asm_instr(result, operand); \ | 378 __ asm_instr(result, operand); \ |
| 379 } else { \ | 379 } else { \ |
| 380 __ asm_instrx(result, operand); \ | 380 __ asm_instrx(result, operand); \ |
| 381 } \ | 381 } \ |
| 382 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ | 382 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 383 } while (0) | 383 } while (0) |
| 384 | 384 |
| 385 | 385 |
| 386 #define ASSEMBLE_STORE_FLOAT(asm_instr, asm_instrx) \ | 386 #define ASSEMBLE_STORE_FLOAT32() \ |
| 387 do { \ |
| 388 size_t index = 0; \ |
| 389 AddressingMode mode = kMode_None; \ |
| 390 MemOperand operand = i.MemoryOperand(&mode, &index); \ |
| 391 DoubleRegister value = i.InputDoubleRegister(index); \ |
| 392 __ frsp(kScratchDoubleReg, value); \ |
| 393 if (mode == kMode_MRI) { \ |
| 394 __ stfs(kScratchDoubleReg, operand); \ |
| 395 } else { \ |
| 396 __ stfsx(kScratchDoubleReg, operand); \ |
| 397 } \ |
| 398 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 399 } while (0) |
| 400 |
| 401 |
| 402 #define ASSEMBLE_STORE_DOUBLE() \ |
| 387 do { \ | 403 do { \ |
| 388 size_t index = 0; \ | 404 size_t index = 0; \ |
| 389 AddressingMode mode = kMode_None; \ | 405 AddressingMode mode = kMode_None; \ |
| 390 MemOperand operand = i.MemoryOperand(&mode, &index); \ | 406 MemOperand operand = i.MemoryOperand(&mode, &index); \ |
| 391 DoubleRegister value = i.InputDoubleRegister(index); \ | 407 DoubleRegister value = i.InputDoubleRegister(index); \ |
| 392 if (mode == kMode_MRI) { \ | 408 if (mode == kMode_MRI) { \ |
| 393 __ asm_instr(value, operand); \ | 409 __ stfd(value, operand); \ |
| 394 } else { \ | 410 } else { \ |
| 395 __ asm_instrx(value, operand); \ | 411 __ stfdx(value, operand); \ |
| 396 } \ | 412 } \ |
| 397 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ | 413 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 398 } while (0) | 414 } while (0) |
| 399 | 415 |
| 400 | 416 |
| 401 #define ASSEMBLE_STORE_INTEGER(asm_instr, asm_instrx) \ | 417 #define ASSEMBLE_STORE_INTEGER(asm_instr, asm_instrx) \ |
| 402 do { \ | 418 do { \ |
| 403 size_t index = 0; \ | 419 size_t index = 0; \ |
| 404 AddressingMode mode = kMode_None; \ | 420 AddressingMode mode = kMode_None; \ |
| 405 MemOperand operand = i.MemoryOperand(&mode, &index); \ | 421 MemOperand operand = i.MemoryOperand(&mode, &index); \ |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 __ asm_instr(result, operand); \ | 477 __ asm_instr(result, operand); \ |
| 462 } else { \ | 478 } else { \ |
| 463 __ asm_instrx(result, operand); \ | 479 __ asm_instrx(result, operand); \ |
| 464 } \ | 480 } \ |
| 465 __ bind(ool->exit()); \ | 481 __ bind(ool->exit()); \ |
| 466 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ | 482 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 467 } while (0) | 483 } while (0) |
| 468 | 484 |
| 469 | 485 |
| 470 // TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits. | 486 // TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits. |
| 471 #define ASSEMBLE_CHECKED_STORE_FLOAT(asm_instr, asm_instrx) \ | 487 #define ASSEMBLE_CHECKED_STORE_FLOAT32() \ |
| 472 do { \ | 488 do { \ |
| 473 Label done; \ | 489 Label done; \ |
| 474 size_t index = 0; \ | 490 size_t index = 0; \ |
| 475 AddressingMode mode = kMode_None; \ | 491 AddressingMode mode = kMode_None; \ |
| 476 MemOperand operand = i.MemoryOperand(&mode, index); \ | 492 MemOperand operand = i.MemoryOperand(&mode, index); \ |
| 477 DCHECK_EQ(kMode_MRR, mode); \ | 493 DCHECK_EQ(kMode_MRR, mode); \ |
| 478 Register offset = operand.rb(); \ | 494 Register offset = operand.rb(); \ |
| 479 __ extsw(offset, offset); \ | 495 __ extsw(offset, offset); \ |
| 480 if (HasRegisterInput(instr, 2)) { \ | 496 if (HasRegisterInput(instr, 2)) { \ |
| 481 __ cmplw(offset, i.InputRegister(2)); \ | 497 __ cmplw(offset, i.InputRegister(2)); \ |
| 482 } else { \ | 498 } else { \ |
| 483 __ cmplwi(offset, i.InputImmediate(2)); \ | 499 __ cmplwi(offset, i.InputImmediate(2)); \ |
| 484 } \ | 500 } \ |
| 485 __ bge(&done); \ | 501 __ bge(&done); \ |
| 486 DoubleRegister value = i.InputDoubleRegister(3); \ | 502 DoubleRegister value = i.InputDoubleRegister(3); \ |
| 487 if (mode == kMode_MRI) { \ | 503 __ frsp(kScratchDoubleReg, value); \ |
| 488 __ asm_instr(value, operand); \ | 504 if (mode == kMode_MRI) { \ |
| 489 } else { \ | 505 __ stfs(kScratchDoubleReg, operand); \ |
| 490 __ asm_instrx(value, operand); \ | 506 } else { \ |
| 491 } \ | 507 __ stfsx(kScratchDoubleReg, operand); \ |
| 492 __ bind(&done); \ | 508 } \ |
| 493 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ | 509 __ bind(&done); \ |
| 510 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 494 } while (0) | 511 } while (0) |
| 495 | 512 |
| 496 | 513 |
| 514 // TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits. |
| 515 #define ASSEMBLE_CHECKED_STORE_DOUBLE() \ |
| 516 do { \ |
| 517 Label done; \ |
| 518 size_t index = 0; \ |
| 519 AddressingMode mode = kMode_None; \ |
| 520 MemOperand operand = i.MemoryOperand(&mode, index); \ |
| 521 DCHECK_EQ(kMode_MRR, mode); \ |
| 522 Register offset = operand.rb(); \ |
| 523 __ extsw(offset, offset); \ |
| 524 if (HasRegisterInput(instr, 2)) { \ |
| 525 __ cmplw(offset, i.InputRegister(2)); \ |
| 526 } else { \ |
| 527 __ cmplwi(offset, i.InputImmediate(2)); \ |
| 528 } \ |
| 529 __ bge(&done); \ |
| 530 DoubleRegister value = i.InputDoubleRegister(3); \ |
| 531 if (mode == kMode_MRI) { \ |
| 532 __ stfd(value, operand); \ |
| 533 } else { \ |
| 534 __ stfdx(value, operand); \ |
| 535 } \ |
| 536 __ bind(&done); \ |
| 537 DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ |
| 538 } while (0) |
| 539 |
| 540 |
| 497 // TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits. | 541 // TODO(mbrandy): fix paths that produce garbage in offset's upper 32-bits. |
| 498 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr, asm_instrx) \ | 542 #define ASSEMBLE_CHECKED_STORE_INTEGER(asm_instr, asm_instrx) \ |
| 499 do { \ | 543 do { \ |
| 500 Label done; \ | 544 Label done; \ |
| 501 size_t index = 0; \ | 545 size_t index = 0; \ |
| 502 AddressingMode mode = kMode_None; \ | 546 AddressingMode mode = kMode_None; \ |
| 503 MemOperand operand = i.MemoryOperand(&mode, index); \ | 547 MemOperand operand = i.MemoryOperand(&mode, index); \ |
| 504 DCHECK_EQ(kMode_MRR, mode); \ | 548 DCHECK_EQ(kMode_MRR, mode); \ |
| 505 Register offset = operand.rb(); \ | 549 Register offset = operand.rb(); \ |
| 506 __ extsw(offset, offset); \ | 550 __ extsw(offset, offset); \ |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 break; | 644 break; |
| 601 case kArchStackPointer: | 645 case kArchStackPointer: |
| 602 __ mr(i.OutputRegister(), sp); | 646 __ mr(i.OutputRegister(), sp); |
| 603 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 647 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 604 break; | 648 break; |
| 605 case kArchTruncateDoubleToI: | 649 case kArchTruncateDoubleToI: |
| 606 // TODO(mbrandy): move slow call to stub out of line. | 650 // TODO(mbrandy): move slow call to stub out of line. |
| 607 __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0)); | 651 __ TruncateDoubleToI(i.OutputRegister(), i.InputDoubleRegister(0)); |
| 608 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 652 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 609 break; | 653 break; |
| 610 case kPPC_And32: | 654 case kPPC_And: |
| 611 case kPPC_And64: | |
| 612 if (HasRegisterInput(instr, 1)) { | 655 if (HasRegisterInput(instr, 1)) { |
| 613 __ and_(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 656 __ and_(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 614 i.OutputRCBit()); | 657 i.OutputRCBit()); |
| 615 } else { | 658 } else { |
| 616 __ andi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); | 659 __ andi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); |
| 617 } | 660 } |
| 618 break; | 661 break; |
| 619 case kPPC_AndComplement32: | 662 case kPPC_AndComplement: |
| 620 case kPPC_AndComplement64: | |
| 621 __ andc(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 663 __ andc(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 622 i.OutputRCBit()); | 664 i.OutputRCBit()); |
| 623 break; | 665 break; |
| 624 case kPPC_Or32: | 666 case kPPC_Or: |
| 625 case kPPC_Or64: | |
| 626 if (HasRegisterInput(instr, 1)) { | 667 if (HasRegisterInput(instr, 1)) { |
| 627 __ orx(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 668 __ orx(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 628 i.OutputRCBit()); | 669 i.OutputRCBit()); |
| 629 } else { | 670 } else { |
| 630 __ ori(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); | 671 __ ori(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); |
| 631 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 672 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 632 } | 673 } |
| 633 break; | 674 break; |
| 634 case kPPC_OrComplement32: | 675 case kPPC_OrComplement: |
| 635 case kPPC_OrComplement64: | |
| 636 __ orc(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 676 __ orc(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 637 i.OutputRCBit()); | 677 i.OutputRCBit()); |
| 638 break; | 678 break; |
| 639 case kPPC_Xor32: | 679 case kPPC_Xor: |
| 640 case kPPC_Xor64: | |
| 641 if (HasRegisterInput(instr, 1)) { | 680 if (HasRegisterInput(instr, 1)) { |
| 642 __ xor_(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 681 __ xor_(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 643 i.OutputRCBit()); | 682 i.OutputRCBit()); |
| 644 } else { | 683 } else { |
| 645 __ xori(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); | 684 __ xori(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); |
| 646 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 685 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 647 } | 686 } |
| 648 break; | 687 break; |
| 649 case kPPC_ShiftLeft32: | 688 case kPPC_ShiftLeft32: |
| 650 ASSEMBLE_BINOP_RC(slw, slwi); | 689 ASSEMBLE_BINOP_RC(slw, slwi); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 685 if (HasRegisterInput(instr, 1)) { | 724 if (HasRegisterInput(instr, 1)) { |
| 686 __ subfic(kScratchReg, i.InputRegister(1), Operand(64)); | 725 __ subfic(kScratchReg, i.InputRegister(1), Operand(64)); |
| 687 __ rotld(i.OutputRegister(), i.InputRegister(0), kScratchReg, | 726 __ rotld(i.OutputRegister(), i.InputRegister(0), kScratchReg, |
| 688 i.OutputRCBit()); | 727 i.OutputRCBit()); |
| 689 } else { | 728 } else { |
| 690 int sh = i.InputInt32(1); | 729 int sh = i.InputInt32(1); |
| 691 __ rotrdi(i.OutputRegister(), i.InputRegister(0), sh, i.OutputRCBit()); | 730 __ rotrdi(i.OutputRegister(), i.InputRegister(0), sh, i.OutputRCBit()); |
| 692 } | 731 } |
| 693 break; | 732 break; |
| 694 #endif | 733 #endif |
| 695 case kPPC_Not32: | 734 case kPPC_Not: |
| 696 case kPPC_Not64: | |
| 697 __ notx(i.OutputRegister(), i.InputRegister(0), i.OutputRCBit()); | 735 __ notx(i.OutputRegister(), i.InputRegister(0), i.OutputRCBit()); |
| 698 break; | 736 break; |
| 699 case kPPC_RotLeftAndMask32: | 737 case kPPC_RotLeftAndMask32: |
| 700 __ rlwinm(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), | 738 __ rlwinm(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), |
| 701 31 - i.InputInt32(2), 31 - i.InputInt32(3), i.OutputRCBit()); | 739 31 - i.InputInt32(2), 31 - i.InputInt32(3), i.OutputRCBit()); |
| 702 break; | 740 break; |
| 703 #if V8_TARGET_ARCH_PPC64 | 741 #if V8_TARGET_ARCH_PPC64 |
| 704 case kPPC_RotLeftAndClear64: | 742 case kPPC_RotLeftAndClear64: |
| 705 __ rldic(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), | 743 __ rldic(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), |
| 706 63 - i.InputInt32(2), i.OutputRCBit()); | 744 63 - i.InputInt32(2), i.OutputRCBit()); |
| 707 break; | 745 break; |
| 708 case kPPC_RotLeftAndClearLeft64: | 746 case kPPC_RotLeftAndClearLeft64: |
| 709 __ rldicl(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), | 747 __ rldicl(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), |
| 710 63 - i.InputInt32(2), i.OutputRCBit()); | 748 63 - i.InputInt32(2), i.OutputRCBit()); |
| 711 break; | 749 break; |
| 712 case kPPC_RotLeftAndClearRight64: | 750 case kPPC_RotLeftAndClearRight64: |
| 713 __ rldicr(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), | 751 __ rldicr(i.OutputRegister(), i.InputRegister(0), i.InputInt32(1), |
| 714 63 - i.InputInt32(2), i.OutputRCBit()); | 752 63 - i.InputInt32(2), i.OutputRCBit()); |
| 715 break; | 753 break; |
| 716 #endif | 754 #endif |
| 717 case kPPC_Add32: | 755 case kPPC_Add: |
| 718 case kPPC_Add64: | |
| 719 if (HasRegisterInput(instr, 1)) { | 756 if (HasRegisterInput(instr, 1)) { |
| 720 __ add(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 757 __ add(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 721 LeaveOE, i.OutputRCBit()); | 758 LeaveOE, i.OutputRCBit()); |
| 722 } else { | 759 } else { |
| 723 __ addi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); | 760 __ addi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); |
| 724 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 761 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 725 } | 762 } |
| 726 break; | 763 break; |
| 727 case kPPC_AddWithOverflow32: | 764 case kPPC_AddWithOverflow32: |
| 728 ASSEMBLE_ADD_WITH_OVERFLOW(); | 765 ASSEMBLE_ADD_WITH_OVERFLOW(); |
| 729 break; | 766 break; |
| 730 case kPPC_AddFloat64: | 767 case kPPC_AddDouble: |
| 731 ASSEMBLE_FLOAT_BINOP_RC(fadd); | 768 ASSEMBLE_FLOAT_BINOP_RC(fadd); |
| 732 break; | 769 break; |
| 733 case kPPC_Sub32: | 770 case kPPC_Sub: |
| 734 case kPPC_Sub64: | |
| 735 if (HasRegisterInput(instr, 1)) { | 771 if (HasRegisterInput(instr, 1)) { |
| 736 __ sub(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 772 __ sub(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 737 LeaveOE, i.OutputRCBit()); | 773 LeaveOE, i.OutputRCBit()); |
| 738 } else { | 774 } else { |
| 739 __ subi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); | 775 __ subi(i.OutputRegister(), i.InputRegister(0), i.InputImmediate(1)); |
| 740 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 776 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 741 } | 777 } |
| 742 break; | 778 break; |
| 743 case kPPC_SubWithOverflow32: | 779 case kPPC_SubWithOverflow32: |
| 744 ASSEMBLE_SUB_WITH_OVERFLOW(); | 780 ASSEMBLE_SUB_WITH_OVERFLOW(); |
| 745 break; | 781 break; |
| 746 case kPPC_SubFloat64: | 782 case kPPC_SubDouble: |
| 747 ASSEMBLE_FLOAT_BINOP_RC(fsub); | 783 ASSEMBLE_FLOAT_BINOP_RC(fsub); |
| 748 break; | 784 break; |
| 749 case kPPC_Mul32: | 785 case kPPC_Mul32: |
| 750 __ mullw(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 786 __ mullw(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 751 LeaveOE, i.OutputRCBit()); | 787 LeaveOE, i.OutputRCBit()); |
| 752 break; | 788 break; |
| 753 #if V8_TARGET_ARCH_PPC64 | 789 #if V8_TARGET_ARCH_PPC64 |
| 754 case kPPC_Mul64: | 790 case kPPC_Mul64: |
| 755 __ mulld(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 791 __ mulld(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 756 LeaveOE, i.OutputRCBit()); | 792 LeaveOE, i.OutputRCBit()); |
| 757 break; | 793 break; |
| 758 #endif | 794 #endif |
| 759 case kPPC_MulHigh32: | 795 case kPPC_MulHigh32: |
| 760 __ mulhw(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 796 __ mulhw(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 761 i.OutputRCBit()); | 797 i.OutputRCBit()); |
| 762 break; | 798 break; |
| 763 case kPPC_MulHighU32: | 799 case kPPC_MulHighU32: |
| 764 __ mulhwu(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), | 800 __ mulhwu(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1), |
| 765 i.OutputRCBit()); | 801 i.OutputRCBit()); |
| 766 break; | 802 break; |
| 767 case kPPC_MulFloat64: | 803 case kPPC_MulDouble: |
| 768 ASSEMBLE_FLOAT_BINOP_RC(fmul); | 804 ASSEMBLE_FLOAT_BINOP_RC(fmul); |
| 769 break; | 805 break; |
| 770 case kPPC_Div32: | 806 case kPPC_Div32: |
| 771 __ divw(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); | 807 __ divw(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); |
| 772 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 808 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 773 break; | 809 break; |
| 774 #if V8_TARGET_ARCH_PPC64 | 810 #if V8_TARGET_ARCH_PPC64 |
| 775 case kPPC_Div64: | 811 case kPPC_Div64: |
| 776 __ divd(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); | 812 __ divd(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); |
| 777 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 813 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 778 break; | 814 break; |
| 779 #endif | 815 #endif |
| 780 case kPPC_DivU32: | 816 case kPPC_DivU32: |
| 781 __ divwu(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); | 817 __ divwu(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); |
| 782 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 818 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 783 break; | 819 break; |
| 784 #if V8_TARGET_ARCH_PPC64 | 820 #if V8_TARGET_ARCH_PPC64 |
| 785 case kPPC_DivU64: | 821 case kPPC_DivU64: |
| 786 __ divdu(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); | 822 __ divdu(i.OutputRegister(), i.InputRegister(0), i.InputRegister(1)); |
| 787 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 823 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 788 break; | 824 break; |
| 789 #endif | 825 #endif |
| 790 case kPPC_DivFloat64: | 826 case kPPC_DivDouble: |
| 791 ASSEMBLE_FLOAT_BINOP_RC(fdiv); | 827 ASSEMBLE_FLOAT_BINOP_RC(fdiv); |
| 792 break; | 828 break; |
| 793 case kPPC_Mod32: | 829 case kPPC_Mod32: |
| 794 ASSEMBLE_MODULO(divw, mullw); | 830 ASSEMBLE_MODULO(divw, mullw); |
| 795 break; | 831 break; |
| 796 #if V8_TARGET_ARCH_PPC64 | 832 #if V8_TARGET_ARCH_PPC64 |
| 797 case kPPC_Mod64: | 833 case kPPC_Mod64: |
| 798 ASSEMBLE_MODULO(divd, mulld); | 834 ASSEMBLE_MODULO(divd, mulld); |
| 799 break; | 835 break; |
| 800 #endif | 836 #endif |
| 801 case kPPC_ModU32: | 837 case kPPC_ModU32: |
| 802 ASSEMBLE_MODULO(divwu, mullw); | 838 ASSEMBLE_MODULO(divwu, mullw); |
| 803 break; | 839 break; |
| 804 #if V8_TARGET_ARCH_PPC64 | 840 #if V8_TARGET_ARCH_PPC64 |
| 805 case kPPC_ModU64: | 841 case kPPC_ModU64: |
| 806 ASSEMBLE_MODULO(divdu, mulld); | 842 ASSEMBLE_MODULO(divdu, mulld); |
| 807 break; | 843 break; |
| 808 #endif | 844 #endif |
| 809 case kPPC_ModFloat64: | 845 case kPPC_ModDouble: |
| 810 // TODO(bmeurer): We should really get rid of this special instruction, | 846 // TODO(bmeurer): We should really get rid of this special instruction, |
| 811 // and generate a CallAddress instruction instead. | 847 // and generate a CallAddress instruction instead. |
| 812 ASSEMBLE_FLOAT_MODULO(); | 848 ASSEMBLE_FLOAT_MODULO(); |
| 813 break; | 849 break; |
| 814 case kPPC_Neg32: | 850 case kPPC_Neg: |
| 815 case kPPC_Neg64: | |
| 816 __ neg(i.OutputRegister(), i.InputRegister(0), LeaveOE, i.OutputRCBit()); | 851 __ neg(i.OutputRegister(), i.InputRegister(0), LeaveOE, i.OutputRCBit()); |
| 817 break; | 852 break; |
| 818 case kPPC_MaxFloat64: | 853 case kPPC_MaxDouble: |
| 819 ASSEMBLE_FLOAT_MAX(kScratchDoubleReg); | 854 ASSEMBLE_FLOAT_MAX(kScratchDoubleReg); |
| 820 break; | 855 break; |
| 821 case kPPC_MinFloat64: | 856 case kPPC_MinDouble: |
| 822 ASSEMBLE_FLOAT_MIN(kScratchDoubleReg); | 857 ASSEMBLE_FLOAT_MIN(kScratchDoubleReg); |
| 823 break; | 858 break; |
| 824 case kPPC_SqrtFloat64: | 859 case kPPC_SqrtDouble: |
| 825 ASSEMBLE_FLOAT_UNOP_RC(fsqrt); | 860 ASSEMBLE_FLOAT_UNOP_RC(fsqrt); |
| 826 break; | 861 break; |
| 827 case kPPC_FloorFloat64: | 862 case kPPC_FloorDouble: |
| 828 ASSEMBLE_FLOAT_UNOP_RC(frim); | 863 ASSEMBLE_FLOAT_UNOP_RC(frim); |
| 829 break; | 864 break; |
| 830 case kPPC_CeilFloat64: | 865 case kPPC_CeilDouble: |
| 831 ASSEMBLE_FLOAT_UNOP_RC(frip); | 866 ASSEMBLE_FLOAT_UNOP_RC(frip); |
| 832 break; | 867 break; |
| 833 case kPPC_TruncateFloat64: | 868 case kPPC_TruncateDouble: |
| 834 ASSEMBLE_FLOAT_UNOP_RC(friz); | 869 ASSEMBLE_FLOAT_UNOP_RC(friz); |
| 835 break; | 870 break; |
| 836 case kPPC_RoundFloat64: | 871 case kPPC_RoundDouble: |
| 837 ASSEMBLE_FLOAT_UNOP_RC(frin); | 872 ASSEMBLE_FLOAT_UNOP_RC(frin); |
| 838 break; | 873 break; |
| 839 case kPPC_NegFloat64: | 874 case kPPC_NegDouble: |
| 840 ASSEMBLE_FLOAT_UNOP_RC(fneg); | 875 ASSEMBLE_FLOAT_UNOP_RC(fneg); |
| 841 break; | 876 break; |
| 842 case kPPC_Cntlz32: | 877 case kPPC_Cntlz32: |
| 843 __ cntlzw_(i.OutputRegister(), i.InputRegister(0)); | 878 __ cntlzw_(i.OutputRegister(), i.InputRegister(0)); |
| 844 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 879 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 845 break; | 880 break; |
| 846 case kPPC_Cmp32: | 881 case kPPC_Cmp32: |
| 847 ASSEMBLE_COMPARE(cmpw, cmplw); | 882 ASSEMBLE_COMPARE(cmpw, cmplw); |
| 848 break; | 883 break; |
| 849 #if V8_TARGET_ARCH_PPC64 | 884 #if V8_TARGET_ARCH_PPC64 |
| 850 case kPPC_Cmp64: | 885 case kPPC_Cmp64: |
| 851 ASSEMBLE_COMPARE(cmp, cmpl); | 886 ASSEMBLE_COMPARE(cmp, cmpl); |
| 852 break; | 887 break; |
| 853 #endif | 888 #endif |
| 854 case kPPC_CmpFloat64: | 889 case kPPC_CmpDouble: |
| 855 ASSEMBLE_FLOAT_COMPARE(fcmpu); | 890 ASSEMBLE_FLOAT_COMPARE(fcmpu); |
| 856 break; | 891 break; |
| 857 case kPPC_Tst32: | 892 case kPPC_Tst32: |
| 858 if (HasRegisterInput(instr, 1)) { | 893 if (HasRegisterInput(instr, 1)) { |
| 859 __ and_(r0, i.InputRegister(0), i.InputRegister(1), i.OutputRCBit()); | 894 __ and_(r0, i.InputRegister(0), i.InputRegister(1), i.OutputRCBit()); |
| 860 } else { | 895 } else { |
| 861 __ andi(r0, i.InputRegister(0), i.InputImmediate(1)); | 896 __ andi(r0, i.InputRegister(0), i.InputImmediate(1)); |
| 862 } | 897 } |
| 863 #if V8_TARGET_ARCH_PPC64 | 898 #if V8_TARGET_ARCH_PPC64 |
| 864 __ extsw(r0, r0, i.OutputRCBit()); | 899 __ extsw(r0, r0, i.OutputRCBit()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 896 // Zero extend | 931 // Zero extend |
| 897 __ clrldi(i.OutputRegister(), i.InputRegister(0), Operand(32)); | 932 __ clrldi(i.OutputRegister(), i.InputRegister(0), Operand(32)); |
| 898 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 933 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 899 break; | 934 break; |
| 900 case kPPC_Int64ToInt32: | 935 case kPPC_Int64ToInt32: |
| 901 // TODO(mbrandy): sign extend? | 936 // TODO(mbrandy): sign extend? |
| 902 __ Move(i.OutputRegister(), i.InputRegister(0)); | 937 __ Move(i.OutputRegister(), i.InputRegister(0)); |
| 903 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 938 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 904 break; | 939 break; |
| 905 #endif | 940 #endif |
| 906 case kPPC_Int32ToFloat64: | 941 case kPPC_Int32ToDouble: |
| 907 __ ConvertIntToDouble(i.InputRegister(0), i.OutputDoubleRegister()); | 942 __ ConvertIntToDouble(i.InputRegister(0), i.OutputDoubleRegister()); |
| 908 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 943 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 909 break; | 944 break; |
| 910 case kPPC_Uint32ToFloat64: | 945 case kPPC_Uint32ToDouble: |
| 911 __ ConvertUnsignedIntToDouble(i.InputRegister(0), | 946 __ ConvertUnsignedIntToDouble(i.InputRegister(0), |
| 912 i.OutputDoubleRegister()); | 947 i.OutputDoubleRegister()); |
| 913 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 948 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 914 break; | 949 break; |
| 915 case kPPC_Float64ToInt32: | 950 case kPPC_DoubleToInt32: |
| 916 case kPPC_Float64ToUint32: | 951 case kPPC_DoubleToUint32: |
| 917 __ ConvertDoubleToInt64(i.InputDoubleRegister(0), | 952 __ ConvertDoubleToInt64(i.InputDoubleRegister(0), |
| 918 #if !V8_TARGET_ARCH_PPC64 | 953 #if !V8_TARGET_ARCH_PPC64 |
| 919 kScratchReg, | 954 kScratchReg, |
| 920 #endif | 955 #endif |
| 921 i.OutputRegister(), kScratchDoubleReg); | 956 i.OutputRegister(), kScratchDoubleReg); |
| 922 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 957 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 923 break; | 958 break; |
| 924 case kPPC_Float64ToFloat32: | 959 case kPPC_DoubleToFloat32: |
| 925 ASSEMBLE_FLOAT_UNOP_RC(frsp); | 960 ASSEMBLE_FLOAT_UNOP_RC(frsp); |
| 926 break; | 961 break; |
| 927 case kPPC_Float32ToFloat64: | 962 case kPPC_Float32ToDouble: |
| 928 // Nothing to do. | 963 // Nothing to do. |
| 929 __ Move(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); | 964 __ Move(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); |
| 930 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 965 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 931 break; | 966 break; |
| 932 case kPPC_Float64ExtractLowWord32: | 967 case kPPC_DoubleExtractLowWord32: |
| 933 __ MovDoubleLowToInt(i.OutputRegister(), i.InputDoubleRegister(0)); | 968 __ MovDoubleLowToInt(i.OutputRegister(), i.InputDoubleRegister(0)); |
| 934 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 969 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 935 break; | 970 break; |
| 936 case kPPC_Float64ExtractHighWord32: | 971 case kPPC_DoubleExtractHighWord32: |
| 937 __ MovDoubleHighToInt(i.OutputRegister(), i.InputDoubleRegister(0)); | 972 __ MovDoubleHighToInt(i.OutputRegister(), i.InputDoubleRegister(0)); |
| 938 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 973 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 939 break; | 974 break; |
| 940 case kPPC_Float64InsertLowWord32: | 975 case kPPC_DoubleInsertLowWord32: |
| 941 __ InsertDoubleLow(i.OutputDoubleRegister(), i.InputRegister(1), r0); | 976 __ InsertDoubleLow(i.OutputDoubleRegister(), i.InputRegister(1), r0); |
| 942 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 977 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 943 break; | 978 break; |
| 944 case kPPC_Float64InsertHighWord32: | 979 case kPPC_DoubleInsertHighWord32: |
| 945 __ InsertDoubleHigh(i.OutputDoubleRegister(), i.InputRegister(1), r0); | 980 __ InsertDoubleHigh(i.OutputDoubleRegister(), i.InputRegister(1), r0); |
| 946 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 981 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 947 break; | 982 break; |
| 948 case kPPC_Float64Construct: | 983 case kPPC_DoubleConstruct: |
| 949 #if V8_TARGET_ARCH_PPC64 | 984 #if V8_TARGET_ARCH_PPC64 |
| 950 __ MovInt64ComponentsToDouble(i.OutputDoubleRegister(), | 985 __ MovInt64ComponentsToDouble(i.OutputDoubleRegister(), |
| 951 i.InputRegister(0), i.InputRegister(1), r0); | 986 i.InputRegister(0), i.InputRegister(1), r0); |
| 952 #else | 987 #else |
| 953 __ MovInt64ToDouble(i.OutputDoubleRegister(), i.InputRegister(0), | 988 __ MovInt64ToDouble(i.OutputDoubleRegister(), i.InputRegister(0), |
| 954 i.InputRegister(1)); | 989 i.InputRegister(1)); |
| 955 #endif | 990 #endif |
| 956 DCHECK_EQ(LeaveRC, i.OutputRCBit()); | 991 DCHECK_EQ(LeaveRC, i.OutputRCBit()); |
| 957 break; | 992 break; |
| 958 case kPPC_LoadWordU8: | 993 case kPPC_LoadWordU8: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 972 ASSEMBLE_LOAD_INTEGER(lwa, lwax); | 1007 ASSEMBLE_LOAD_INTEGER(lwa, lwax); |
| 973 break; | 1008 break; |
| 974 #if V8_TARGET_ARCH_PPC64 | 1009 #if V8_TARGET_ARCH_PPC64 |
| 975 case kPPC_LoadWord64: | 1010 case kPPC_LoadWord64: |
| 976 ASSEMBLE_LOAD_INTEGER(ld, ldx); | 1011 ASSEMBLE_LOAD_INTEGER(ld, ldx); |
| 977 break; | 1012 break; |
| 978 #endif | 1013 #endif |
| 979 case kPPC_LoadFloat32: | 1014 case kPPC_LoadFloat32: |
| 980 ASSEMBLE_LOAD_FLOAT(lfs, lfsx); | 1015 ASSEMBLE_LOAD_FLOAT(lfs, lfsx); |
| 981 break; | 1016 break; |
| 982 case kPPC_LoadFloat64: | 1017 case kPPC_LoadDouble: |
| 983 ASSEMBLE_LOAD_FLOAT(lfd, lfdx); | 1018 ASSEMBLE_LOAD_FLOAT(lfd, lfdx); |
| 984 break; | 1019 break; |
| 985 case kPPC_StoreWord8: | 1020 case kPPC_StoreWord8: |
| 986 ASSEMBLE_STORE_INTEGER(stb, stbx); | 1021 ASSEMBLE_STORE_INTEGER(stb, stbx); |
| 987 break; | 1022 break; |
| 988 case kPPC_StoreWord16: | 1023 case kPPC_StoreWord16: |
| 989 ASSEMBLE_STORE_INTEGER(sth, sthx); | 1024 ASSEMBLE_STORE_INTEGER(sth, sthx); |
| 990 break; | 1025 break; |
| 991 case kPPC_StoreWord32: | 1026 case kPPC_StoreWord32: |
| 992 ASSEMBLE_STORE_INTEGER(stw, stwx); | 1027 ASSEMBLE_STORE_INTEGER(stw, stwx); |
| 993 break; | 1028 break; |
| 994 #if V8_TARGET_ARCH_PPC64 | 1029 #if V8_TARGET_ARCH_PPC64 |
| 995 case kPPC_StoreWord64: | 1030 case kPPC_StoreWord64: |
| 996 ASSEMBLE_STORE_INTEGER(std, stdx); | 1031 ASSEMBLE_STORE_INTEGER(std, stdx); |
| 997 break; | 1032 break; |
| 998 #endif | 1033 #endif |
| 999 case kPPC_StoreFloat32: | 1034 case kPPC_StoreFloat32: |
| 1000 ASSEMBLE_STORE_FLOAT(stfs, stfsx); | 1035 ASSEMBLE_STORE_FLOAT32(); |
| 1001 break; | 1036 break; |
| 1002 case kPPC_StoreFloat64: | 1037 case kPPC_StoreDouble: |
| 1003 ASSEMBLE_STORE_FLOAT(stfd, stfdx); | 1038 ASSEMBLE_STORE_DOUBLE(); |
| 1004 break; | 1039 break; |
| 1005 case kPPC_StoreWriteBarrier: | 1040 case kPPC_StoreWriteBarrier: |
| 1006 ASSEMBLE_STORE_WRITE_BARRIER(); | 1041 ASSEMBLE_STORE_WRITE_BARRIER(); |
| 1007 break; | 1042 break; |
| 1008 case kCheckedLoadInt8: | 1043 case kCheckedLoadInt8: |
| 1009 ASSEMBLE_CHECKED_LOAD_INTEGER(lbz, lbzx); | 1044 ASSEMBLE_CHECKED_LOAD_INTEGER(lbz, lbzx); |
| 1010 __ extsb(i.OutputRegister(), i.OutputRegister()); | 1045 __ extsb(i.OutputRegister(), i.OutputRegister()); |
| 1011 break; | 1046 break; |
| 1012 case kCheckedLoadUint8: | 1047 case kCheckedLoadUint8: |
| 1013 ASSEMBLE_CHECKED_LOAD_INTEGER(lbz, lbzx); | 1048 ASSEMBLE_CHECKED_LOAD_INTEGER(lbz, lbzx); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1030 case kCheckedStoreWord8: | 1065 case kCheckedStoreWord8: |
| 1031 ASSEMBLE_CHECKED_STORE_INTEGER(stb, stbx); | 1066 ASSEMBLE_CHECKED_STORE_INTEGER(stb, stbx); |
| 1032 break; | 1067 break; |
| 1033 case kCheckedStoreWord16: | 1068 case kCheckedStoreWord16: |
| 1034 ASSEMBLE_CHECKED_STORE_INTEGER(sth, sthx); | 1069 ASSEMBLE_CHECKED_STORE_INTEGER(sth, sthx); |
| 1035 break; | 1070 break; |
| 1036 case kCheckedStoreWord32: | 1071 case kCheckedStoreWord32: |
| 1037 ASSEMBLE_CHECKED_STORE_INTEGER(stw, stwx); | 1072 ASSEMBLE_CHECKED_STORE_INTEGER(stw, stwx); |
| 1038 break; | 1073 break; |
| 1039 case kCheckedStoreFloat32: | 1074 case kCheckedStoreFloat32: |
| 1040 ASSEMBLE_CHECKED_STORE_FLOAT(stfs, stfsx); | 1075 ASSEMBLE_CHECKED_STORE_FLOAT32(); |
| 1041 break; | 1076 break; |
| 1042 case kCheckedStoreFloat64: | 1077 case kCheckedStoreFloat64: |
| 1043 ASSEMBLE_CHECKED_STORE_FLOAT(stfd, stfdx); | 1078 ASSEMBLE_CHECKED_STORE_DOUBLE(); |
| 1044 break; | 1079 break; |
| 1045 default: | 1080 default: |
| 1046 UNREACHABLE(); | 1081 UNREACHABLE(); |
| 1047 break; | 1082 break; |
| 1048 } | 1083 } |
| 1049 } | 1084 } |
| 1050 | 1085 |
| 1051 | 1086 |
| 1052 // Assembles branches after an instruction. | 1087 // Assembles branches after an instruction. |
| 1053 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { | 1088 void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { |
| 1054 PPCOperandConverter i(this, instr); | 1089 PPCOperandConverter i(this, instr); |
| 1055 Label* tlabel = branch->true_label; | 1090 Label* tlabel = branch->true_label; |
| 1056 Label* flabel = branch->false_label; | 1091 Label* flabel = branch->false_label; |
| 1057 ArchOpcode op = instr->arch_opcode(); | 1092 ArchOpcode op = instr->arch_opcode(); |
| 1058 FlagsCondition condition = branch->condition; | 1093 FlagsCondition condition = branch->condition; |
| 1059 CRegister cr = cr0; | 1094 CRegister cr = cr0; |
| 1060 | 1095 |
| 1061 // Overflow checked for add/sub only. | 1096 // Overflow checked for add/sub only. |
| 1062 DCHECK((condition != kOverflow && condition != kNotOverflow) || | 1097 DCHECK((condition != kOverflow && condition != kNotOverflow) || |
| 1063 (op == kPPC_AddWithOverflow32 || op == kPPC_SubWithOverflow32)); | 1098 (op == kPPC_AddWithOverflow32 || op == kPPC_SubWithOverflow32)); |
| 1064 | 1099 |
| 1065 Condition cond = FlagsConditionToCondition(condition); | 1100 Condition cond = FlagsConditionToCondition(condition); |
| 1066 if (op == kPPC_CmpFloat64) { | 1101 if (op == kPPC_CmpDouble) { |
| 1067 // check for unordered if necessary | 1102 // check for unordered if necessary |
| 1068 if (cond == le) { | 1103 if (cond == le) { |
| 1069 __ bunordered(flabel, cr); | 1104 __ bunordered(flabel, cr); |
| 1070 // Unnecessary for eq/lt since only FU bit will be set. | 1105 // Unnecessary for eq/lt since only FU bit will be set. |
| 1071 } else if (cond == gt) { | 1106 } else if (cond == gt) { |
| 1072 __ bunordered(tlabel, cr); | 1107 __ bunordered(tlabel, cr); |
| 1073 // Unnecessary for ne/ge since only FU bit will be set. | 1108 // Unnecessary for ne/ge since only FU bit will be set. |
| 1074 } | 1109 } |
| 1075 } | 1110 } |
| 1076 __ b(cond, tlabel, cr); | 1111 __ b(cond, tlabel, cr); |
| 1077 if (!branch->fallthru) __ b(flabel); // no fallthru to flabel. | 1112 if (!branch->fallthru) __ b(flabel); // no fallthru to flabel. |
| 1078 } | 1113 } |
| 1079 | 1114 |
| 1080 | 1115 |
| 1081 void CodeGenerator::AssembleArchJump(RpoNumber target) { | 1116 void CodeGenerator::AssembleArchJump(RpoNumber target) { |
| 1082 if (!IsNextInAssemblyOrder(target)) __ b(GetLabel(target)); | 1117 if (!IsNextInAssemblyOrder(target)) __ b(GetLabel(target)); |
| 1083 } | 1118 } |
| 1084 | 1119 |
| 1085 | 1120 |
| 1086 // Assembles boolean materializations after an instruction. | 1121 // Assembles boolean materializations after an instruction. |
| 1087 void CodeGenerator::AssembleArchBoolean(Instruction* instr, | 1122 void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
| 1088 FlagsCondition condition) { | 1123 FlagsCondition condition) { |
| 1089 PPCOperandConverter i(this, instr); | 1124 PPCOperandConverter i(this, instr); |
| 1090 Label done; | 1125 Label done; |
| 1091 ArchOpcode op = instr->arch_opcode(); | 1126 ArchOpcode op = instr->arch_opcode(); |
| 1092 bool check_unordered = (op == kPPC_CmpFloat64); | 1127 bool check_unordered = (op == kPPC_CmpDouble); |
| 1093 CRegister cr = cr0; | 1128 CRegister cr = cr0; |
| 1094 | 1129 |
| 1095 // Overflow checked for add/sub only. | 1130 // Overflow checked for add/sub only. |
| 1096 DCHECK((condition != kOverflow && condition != kNotOverflow) || | 1131 DCHECK((condition != kOverflow && condition != kNotOverflow) || |
| 1097 (op == kPPC_AddWithOverflow32 || op == kPPC_SubWithOverflow32)); | 1132 (op == kPPC_AddWithOverflow32 || op == kPPC_SubWithOverflow32)); |
| 1098 | 1133 |
| 1099 // Materialize a full 32-bit 1 or 0 value. The result register is always the | 1134 // Materialize a full 32-bit 1 or 0 value. The result register is always the |
| 1100 // last output of the instruction. | 1135 // last output of the instruction. |
| 1101 DCHECK_NE(0u, instr->OutputCount()); | 1136 DCHECK_NE(0u, instr->OutputCount()); |
| 1102 Register reg = i.OutputRegister(instr->OutputCount() - 1); | 1137 Register reg = i.OutputRegister(instr->OutputCount() - 1); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1452 } | 1487 } |
| 1453 } | 1488 } |
| 1454 MarkLazyDeoptSite(); | 1489 MarkLazyDeoptSite(); |
| 1455 } | 1490 } |
| 1456 | 1491 |
| 1457 #undef __ | 1492 #undef __ |
| 1458 | 1493 |
| 1459 } // namespace compiler | 1494 } // namespace compiler |
| 1460 } // namespace internal | 1495 } // namespace internal |
| 1461 } // namespace v8 | 1496 } // namespace v8 |
| OLD | NEW |