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 |