| 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(), |
| 603 Variable *T_Lo = makeReg(IceType_i32); | 603 *T_Hi2 = I32Reg(); |
| 604 Variable *T_Hi = makeReg(IceType_i32); | |
| 605 Variable *T_Hi2 = makeReg(IceType_i32); | |
| 606 _addu(T_Lo, Src0LoR, Src1LoR); | 604 _addu(T_Lo, Src0LoR, Src1LoR); |
| 607 _mov(DestLo, T_Lo); | 605 _mov(DestLo, T_Lo); |
| 608 _sltu(T_Carry, T_Lo, Src0LoR); | 606 _sltu(T_Carry, T_Lo, Src0LoR); |
| 609 _addu(T_Hi, T_Carry, Src0HiR); | 607 _addu(T_Hi, T_Carry, Src0HiR); |
| 610 _addu(T_Hi2, Src1HiR, T_Hi); | 608 _addu(T_Hi2, Src1HiR, T_Hi); |
| 611 _mov(DestHi, T_Hi2); | 609 _mov(DestHi, T_Hi2); |
| 612 return; | 610 return; |
| 613 } | 611 } |
| 614 case InstArithmetic::And: { | 612 case InstArithmetic::And: { |
| 615 Variable *T_Lo = makeReg(IceType_i32); | 613 auto *T_Lo = I32Reg(), *T_Hi = I32Reg(); |
| 616 Variable *T_Hi = makeReg(IceType_i32); | |
| 617 _and(T_Lo, Src0LoR, Src1LoR); | 614 _and(T_Lo, Src0LoR, Src1LoR); |
| 618 _mov(DestLo, T_Lo); | 615 _mov(DestLo, T_Lo); |
| 619 _and(T_Hi, Src0HiR, Src1HiR); | 616 _and(T_Hi, Src0HiR, Src1HiR); |
| 620 _mov(DestHi, T_Hi); | 617 _mov(DestHi, T_Hi); |
| 621 return; | 618 return; |
| 622 } | 619 } |
| 623 case InstArithmetic::Sub: { | 620 case InstArithmetic::Sub: { |
| 624 Variable *T_Borrow = makeReg(IceType_i32); | 621 auto *T_Borrow = I32Reg(), *T_Lo = I32Reg(), *T_Hi = I32Reg(), |
| 625 Variable *T_Lo = makeReg(IceType_i32); | 622 *T_Hi2 = I32Reg(); |
| 626 Variable *T_Hi = makeReg(IceType_i32); | |
| 627 Variable *T_Hi2 = makeReg(IceType_i32); | |
| 628 _subu(T_Lo, Src0LoR, Src1LoR); | 623 _subu(T_Lo, Src0LoR, Src1LoR); |
| 629 _mov(DestLo, T_Lo); | 624 _mov(DestLo, T_Lo); |
| 630 _sltu(T_Borrow, Src0LoR, Src1LoR); | 625 _sltu(T_Borrow, Src0LoR, Src1LoR); |
| 631 _addu(T_Hi, T_Borrow, Src1HiR); | 626 _addu(T_Hi, T_Borrow, Src1HiR); |
| 632 _subu(T_Hi2, Src0HiR, T_Hi); | 627 _subu(T_Hi2, Src0HiR, T_Hi); |
| 633 _mov(DestHi, T_Hi2); | 628 _mov(DestHi, T_Hi2); |
| 634 return; | 629 return; |
| 635 } | 630 } |
| 636 case InstArithmetic::Or: { | 631 case InstArithmetic::Or: { |
| 637 Variable *T_Lo = makeReg(IceType_i32); | 632 auto *T_Lo = I32Reg(), *T_Hi = I32Reg(); |
| 638 Variable *T_Hi = makeReg(IceType_i32); | |
| 639 _or(T_Lo, Src0LoR, Src1LoR); | 633 _or(T_Lo, Src0LoR, Src1LoR); |
| 640 _mov(DestLo, T_Lo); | 634 _mov(DestLo, T_Lo); |
| 641 _or(T_Hi, Src0HiR, Src1HiR); | 635 _or(T_Hi, Src0HiR, Src1HiR); |
| 642 _mov(DestHi, T_Hi); | 636 _mov(DestHi, T_Hi); |
| 643 return; | 637 return; |
| 644 } | 638 } |
| 645 case InstArithmetic::Xor: { | 639 case InstArithmetic::Xor: { |
| 646 Variable *T_Lo = makeReg(IceType_i32); | 640 auto *T_Lo = I32Reg(), *T_Hi = I32Reg(); |
| 647 Variable *T_Hi = makeReg(IceType_i32); | |
| 648 _xor(T_Lo, Src0LoR, Src1LoR); | 641 _xor(T_Lo, Src0LoR, Src1LoR); |
| 649 _mov(DestLo, T_Lo); | 642 _mov(DestLo, T_Lo); |
| 650 _xor(T_Hi, Src0HiR, Src1HiR); | 643 _xor(T_Hi, Src0HiR, Src1HiR); |
| 651 _mov(DestHi, T_Hi); | 644 _mov(DestHi, T_Hi); |
| 652 return; | 645 return; |
| 653 } | 646 } |
| 654 default: | 647 default: |
| 655 UnimplementedLoweringError(this, Instr); | 648 UnimplementedLoweringError(this, Instr); |
| 656 return; | 649 return; |
| 657 } | 650 } |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 Variable *Dest = Instr->getDest(); | 751 Variable *Dest = Instr->getDest(); |
| 759 Operand *Src0 = Instr->getSrc(0); | 752 Operand *Src0 = Instr->getSrc(0); |
| 760 assert(Dest->getType() == Src0->getType()); | 753 assert(Dest->getType() == Src0->getType()); |
| 761 if (Dest->getType() == IceType_i64) { | 754 if (Dest->getType() == IceType_i64) { |
| 762 Src0 = legalizeUndef(Src0); | 755 Src0 = legalizeUndef(Src0); |
| 763 Operand *Src0Lo = legalize(loOperand(Src0), Legal_Reg); | 756 Operand *Src0Lo = legalize(loOperand(Src0), Legal_Reg); |
| 764 Operand *Src0Hi = legalize(hiOperand(Src0), Legal_Reg); | 757 Operand *Src0Hi = legalize(hiOperand(Src0), Legal_Reg); |
| 765 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); | 758 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| 766 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); | 759 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| 767 // Variable *T_Lo = nullptr, *T_Hi = nullptr; | 760 // Variable *T_Lo = nullptr, *T_Hi = nullptr; |
| 768 Variable *T_Lo = makeReg(IceType_i32); | 761 auto *T_Lo = I32Reg(), *T_Hi = I32Reg(); |
| 769 Variable *T_Hi = makeReg(IceType_i32); | |
| 770 _mov(T_Lo, Src0Lo); | 762 _mov(T_Lo, Src0Lo); |
| 771 _mov(DestLo, T_Lo); | 763 _mov(DestLo, T_Lo); |
| 772 _mov(T_Hi, Src0Hi); | 764 _mov(T_Hi, Src0Hi); |
| 773 _mov(DestHi, T_Hi); | 765 _mov(DestHi, T_Hi); |
| 774 } else { | 766 } else { |
| 775 Operand *SrcR; | 767 Operand *SrcR; |
| 776 if (Dest->hasReg()) { | 768 if (Dest->hasReg()) { |
| 777 // If Dest already has a physical register, then legalize the Src operand | 769 // If Dest already has a physical register, then legalize the Src operand |
| 778 // into a Variable with the same register assignment. This especially | 770 // into a Variable with the same register assignment. This especially |
| 779 // helps allow the use of Flex operands. | 771 // helps allow the use of Flex operands. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 815 return; | 807 return; |
| 816 case IceType_void: | 808 case IceType_void: |
| 817 break; | 809 break; |
| 818 case IceType_i1: | 810 case IceType_i1: |
| 819 case IceType_i8: | 811 case IceType_i8: |
| 820 case IceType_i16: | 812 case IceType_i16: |
| 821 case IceType_i32: | 813 case IceType_i32: |
| 822 ReturnReg = makeReg(Dest->getType(), RegMIPS32::Reg_V0); | 814 ReturnReg = makeReg(Dest->getType(), RegMIPS32::Reg_V0); |
| 823 break; | 815 break; |
| 824 case IceType_i64: | 816 case IceType_i64: |
| 825 ReturnReg = makeReg(IceType_i32, RegMIPS32::Reg_V0); | 817 ReturnReg = I32Reg(RegMIPS32::Reg_V0); |
| 826 ReturnRegHi = makeReg(IceType_i32, RegMIPS32::Reg_V1); | 818 ReturnRegHi = I32Reg(RegMIPS32::Reg_V1); |
| 827 break; | 819 break; |
| 828 case IceType_f32: | 820 case IceType_f32: |
| 829 case IceType_f64: | 821 case IceType_f64: |
| 830 UnimplementedLoweringError(this, Instr); | 822 UnimplementedLoweringError(this, Instr); |
| 831 return; | 823 return; |
| 832 case IceType_v4i1: | 824 case IceType_v4i1: |
| 833 case IceType_v8i1: | 825 case IceType_v8i1: |
| 834 case IceType_v16i1: | 826 case IceType_v16i1: |
| 835 case IceType_v16i8: | 827 case IceType_v16i8: |
| 836 case IceType_v8i16: | 828 case IceType_v8i16: |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1300 Str << "\t.set\t" | 1292 Str << "\t.set\t" |
| 1301 << "nomips16\n"; | 1293 << "nomips16\n"; |
| 1302 } | 1294 } |
| 1303 | 1295 |
| 1304 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 1296 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 1305 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 1297 llvm::SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 1306 llvm::SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 1298 llvm::SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 1307 | 1299 |
| 1308 } // end of namespace MIPS32 | 1300 } // end of namespace MIPS32 |
| 1309 } // end of namespace Ice | 1301 } // end of namespace Ice |
| OLD | NEW |