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...) 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...) 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...) 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...) 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 |