Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceTargetLoweringMIPS32.cpp - MIPS32 lowering ----------===// | 1 //===- subzero/src/IceTargetLoweringMIPS32.cpp - MIPS32 lowering ----------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 592 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); | 592 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); |
| 593 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); | 593 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); |
| 594 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); | 594 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); |
| 595 Variable *Src1HiR = legalizeToReg(hiOperand(Src1)); | 595 Variable *Src1HiR = legalizeToReg(hiOperand(Src1)); |
| 596 | 596 |
| 597 switch (Op) { | 597 switch (Op) { |
| 598 case InstArithmetic::_num: | 598 case InstArithmetic::_num: |
| 599 llvm::report_fatal_error("Unknown arithmetic operator"); | 599 llvm::report_fatal_error("Unknown arithmetic operator"); |
| 600 return; | 600 return; |
| 601 case InstArithmetic::Add: { | 601 case InstArithmetic::Add: { |
| 602 Variable *T_Carry = makeReg(IceType_i32); | 602 auto *T_Carry=I32Reg(), *T_Lo=I32Reg(), *T_Hi=I32Reg(), *T_Hi2=I32Reg(); |
| 603 Variable *T_Lo = makeReg(IceType_i32); | |
| 604 Variable *T_Hi = makeReg(IceType_i32); | |
| 605 Variable *T_Hi2 = makeReg(IceType_i32); | |
| 606 _addu(T_Lo, Src0LoR, Src1LoR); | 603 _addu(T_Lo, Src0LoR, Src1LoR); |
| 607 _mov(DestLo, T_Lo); | 604 _mov(DestLo, T_Lo); |
| 608 _sltu(T_Carry, T_Lo, Src0LoR); | 605 _sltu(T_Carry, T_Lo, Src0LoR); |
| 609 _addu(T_Hi, T_Carry, Src0HiR); | 606 _addu(T_Hi, T_Carry, Src0HiR); |
| 610 _addu(T_Hi2, Src1HiR, T_Hi); | 607 _addu(T_Hi2, Src1HiR, T_Hi); |
| 611 _mov(DestHi, T_Hi2); | 608 _mov(DestHi, T_Hi2); |
| 612 return; | 609 return; |
| 613 } | 610 } |
| 614 case InstArithmetic::And: { | 611 case InstArithmetic::And: { |
| 615 Variable *T_Lo = makeReg(IceType_i32); | 612 auto *T_Lo=I32Reg(), *T_Hi=I32Reg(); |
| 616 Variable *T_Hi = makeReg(IceType_i32); | |
| 617 _and(T_Lo, Src0LoR, Src1LoR); | 613 _and(T_Lo, Src0LoR, Src1LoR); |
| 618 _mov(DestLo, T_Lo); | 614 _mov(DestLo, T_Lo); |
| 619 _and(T_Hi, Src0HiR, Src1HiR); | 615 _and(T_Hi, Src0HiR, Src1HiR); |
| 620 _mov(DestHi, T_Hi); | 616 _mov(DestHi, T_Hi); |
| 621 return; | 617 return; |
| 622 } | 618 } |
| 623 case InstArithmetic::Sub: { | 619 case InstArithmetic::Sub: { |
| 624 Variable *T_Borrow = makeReg(IceType_i32); | 620 auto *T_Borrow=I32Reg(), *T_Lo=I32Reg(), *T_Hi=I32Reg(), *T_Hi2=I32Reg(); |
| 625 Variable *T_Lo = makeReg(IceType_i32); | |
| 626 Variable *T_Hi = makeReg(IceType_i32); | |
| 627 Variable *T_Hi2 = makeReg(IceType_i32); | |
| 628 _subu(T_Lo, Src0LoR, Src1LoR); | 621 _subu(T_Lo, Src0LoR, Src1LoR); |
| 629 _mov(DestLo, T_Lo); | 622 _mov(DestLo, T_Lo); |
| 630 _sltu(T_Borrow, Src0LoR, Src1LoR); | 623 _sltu(T_Borrow, Src0LoR, Src1LoR); |
| 631 _addu(T_Hi, T_Borrow, Src1HiR); | 624 _addu(T_Hi, T_Borrow, Src1HiR); |
| 632 _subu(T_Hi2, Src0HiR, T_Hi); | 625 _subu(T_Hi2, Src0HiR, T_Hi); |
| 633 _mov(DestHi, T_Hi2); | 626 _mov(DestHi, T_Hi2); |
| 634 return; | 627 return; |
| 635 } | 628 } |
| 636 case InstArithmetic::Or: { | 629 case InstArithmetic::Or: { |
| 637 Variable *T_Lo = makeReg(IceType_i32); | 630 auto *T_Lo=I32Reg(), *T_Hi=I32Reg(); |
| 638 Variable *T_Hi = makeReg(IceType_i32); | |
| 639 _or(T_Lo, Src0LoR, Src1LoR); | 631 _or(T_Lo, Src0LoR, Src1LoR); |
| 640 _mov(DestLo, T_Lo); | 632 _mov(DestLo, T_Lo); |
| 641 _or(T_Hi, Src0HiR, Src1HiR); | 633 _or(T_Hi, Src0HiR, Src1HiR); |
| 642 _mov(DestHi, T_Hi); | 634 _mov(DestHi, T_Hi); |
| 643 return; | 635 return; |
| 644 } | 636 } |
| 645 case InstArithmetic::Xor: { | 637 case InstArithmetic::Xor: { |
| 646 Variable *T_Lo = makeReg(IceType_i32); | 638 auto *T_Lo=I32Reg(), *T_Hi=I32Reg(); |
| 647 Variable *T_Hi = makeReg(IceType_i32); | |
| 648 _xor(T_Lo, Src0LoR, Src1LoR); | 639 _xor(T_Lo, Src0LoR, Src1LoR); |
| 649 _mov(DestLo, T_Lo); | 640 _mov(DestLo, T_Lo); |
| 650 _xor(T_Hi, Src0HiR, Src1HiR); | 641 _xor(T_Hi, Src0HiR, Src1HiR); |
| 651 _mov(DestHi, T_Hi); | 642 _mov(DestHi, T_Hi); |
| 652 return; | 643 return; |
| 653 } | 644 } |
| 654 default: | 645 default: |
| 655 UnimplementedLoweringError(this, Instr); | 646 UnimplementedLoweringError(this, Instr); |
| 656 return; | 647 return; |
| 657 } | 648 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 758 Variable *Dest = Instr->getDest(); | 749 Variable *Dest = Instr->getDest(); |
| 759 Operand *Src0 = Instr->getSrc(0); | 750 Operand *Src0 = Instr->getSrc(0); |
| 760 assert(Dest->getType() == Src0->getType()); | 751 assert(Dest->getType() == Src0->getType()); |
| 761 if (Dest->getType() == IceType_i64) { | 752 if (Dest->getType() == IceType_i64) { |
| 762 Src0 = legalizeUndef(Src0); | 753 Src0 = legalizeUndef(Src0); |
| 763 Operand *Src0Lo = legalize(loOperand(Src0), Legal_Reg); | 754 Operand *Src0Lo = legalize(loOperand(Src0), Legal_Reg); |
| 764 Operand *Src0Hi = legalize(hiOperand(Src0), Legal_Reg); | 755 Operand *Src0Hi = legalize(hiOperand(Src0), Legal_Reg); |
| 765 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); | 756 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| 766 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); | 757 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| 767 // Variable *T_Lo = nullptr, *T_Hi = nullptr; | 758 // Variable *T_Lo = nullptr, *T_Hi = nullptr; |
| 768 Variable *T_Lo = makeReg(IceType_i32); | 759 auto *T_Lo=I32Reg(), *T_Hi=I32Reg(); |
| 769 Variable *T_Hi = makeReg(IceType_i32); | |
| 770 _mov(T_Lo, Src0Lo); | 760 _mov(T_Lo, Src0Lo); |
| 771 _mov(DestLo, T_Lo); | 761 _mov(DestLo, T_Lo); |
| 772 _mov(T_Hi, Src0Hi); | 762 _mov(T_Hi, Src0Hi); |
| 773 _mov(DestHi, T_Hi); | 763 _mov(DestHi, T_Hi); |
| 774 } else { | 764 } else { |
| 775 Operand *SrcR; | 765 Operand *SrcR; |
| 776 if (Dest->hasReg()) { | 766 if (Dest->hasReg()) { |
| 777 // If Dest already has a physical register, then legalize the Src operand | 767 // If Dest already has a physical register, then legalize the Src operand |
| 778 // into a Variable with the same register assignment. This especially | 768 // into a Variable with the same register assignment. This especially |
| 779 // helps allow the use of Flex operands. | 769 // helps allow the use of Flex operands. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 815 return; | 805 return; |
| 816 case IceType_void: | 806 case IceType_void: |
| 817 break; | 807 break; |
| 818 case IceType_i1: | 808 case IceType_i1: |
| 819 case IceType_i8: | 809 case IceType_i8: |
| 820 case IceType_i16: | 810 case IceType_i16: |
| 821 case IceType_i32: | 811 case IceType_i32: |
| 822 ReturnReg = makeReg(Dest->getType(), RegMIPS32::Reg_V0); | 812 ReturnReg = makeReg(Dest->getType(), RegMIPS32::Reg_V0); |
| 823 break; | 813 break; |
| 824 case IceType_i64: | 814 case IceType_i64: |
| 825 ReturnReg = makeReg(IceType_i32, RegMIPS32::Reg_V0); | 815 ReturnReg = makeReg(IceType_i32, RegMIPS32::Reg_V0); |
|
Jim Stichnoth
2016/02/17 03:29:45
Optional: I32Reg could take an optional argument R
rkotlerimgtec
2016/02/17 04:27:29
Done.
| |
| 826 ReturnRegHi = makeReg(IceType_i32, RegMIPS32::Reg_V1); | 816 ReturnRegHi = makeReg(IceType_i32, RegMIPS32::Reg_V1); |
| 827 break; | 817 break; |
| 828 case IceType_f32: | 818 case IceType_f32: |
| 829 case IceType_f64: | 819 case IceType_f64: |
| 830 UnimplementedLoweringError(this, Instr); | 820 UnimplementedLoweringError(this, Instr); |
| 831 return; | 821 return; |
| 832 case IceType_v4i1: | 822 case IceType_v4i1: |
| 833 case IceType_v8i1: | 823 case IceType_v8i1: |
| 834 case IceType_v16i1: | 824 case IceType_v16i1: |
| 835 case IceType_v16i8: | 825 case IceType_v16i8: |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1300 Str << "\t.set\t" | 1290 Str << "\t.set\t" |
| 1301 << "nomips16\n"; | 1291 << "nomips16\n"; |
| 1302 } | 1292 } |
| 1303 | 1293 |
| 1304 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 1294 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 1305 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 1295 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 1306 llvm::SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 1296 llvm::SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 1307 | 1297 |
| 1308 } // end of namespace MIPS32 | 1298 } // end of namespace MIPS32 |
| 1309 } // end of namespace Ice | 1299 } // end of namespace Ice |
| OLD | NEW |