OLD | NEW |
1 // | 1 // |
2 // The Subzero Code Generator | 2 // The Subzero Code Generator |
3 // | 3 // |
4 // This file is distributed under the University of Illinois Open Source | 4 // This file is distributed under the University of Illinois Open Source |
5 // License. See LICENSE.TXT for details. | 5 // License. See LICENSE.TXT for details. |
6 // | 6 // |
7 //===----------------------------------------------------------------------===// | 7 //===----------------------------------------------------------------------===// |
8 /// | 8 /// |
9 /// \file | 9 /// \file |
10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost | 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost |
(...skipping 2535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2546 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1); | 2546 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1); |
2547 return; | 2547 return; |
2548 } | 2548 } |
2549 if (isVectorType(Dest->getType())) { | 2549 if (isVectorType(Dest->getType())) { |
2550 llvm::report_fatal_error("Arithmetic: Destination type is vector"); | 2550 llvm::report_fatal_error("Arithmetic: Destination type is vector"); |
2551 return; | 2551 return; |
2552 } | 2552 } |
2553 | 2553 |
2554 Variable *T = makeReg(Dest->getType()); | 2554 Variable *T = makeReg(Dest->getType()); |
2555 Variable *Src0R = legalizeToReg(Src0); | 2555 Variable *Src0R = legalizeToReg(Src0); |
2556 Variable *Src1R = legalizeToReg(Src1); | 2556 Variable *Src1R = nullptr; |
| 2557 uint32_t Value = 0; |
| 2558 bool IsSrc1Imm16 = false; |
| 2559 |
| 2560 switch (Instr->getOp()) { |
| 2561 case InstArithmetic::Add: |
| 2562 case InstArithmetic::And: |
| 2563 case InstArithmetic::Or: |
| 2564 case InstArithmetic::Xor: |
| 2565 case InstArithmetic::Sub: |
| 2566 case InstArithmetic::Shl: |
| 2567 case InstArithmetic::Lshr: |
| 2568 case InstArithmetic::Ashr: { |
| 2569 auto *Const32 = llvm::dyn_cast<ConstantInteger32>(Src1); |
| 2570 if (Const32 != nullptr && isInt<16>(int32_t(Const32->getValue()))) { |
| 2571 IsSrc1Imm16 = true; |
| 2572 Value = Const32->getValue(); |
| 2573 } else { |
| 2574 Src1R = legalizeToReg(Src1); |
| 2575 } |
| 2576 break; |
| 2577 } |
| 2578 default: |
| 2579 Src1R = legalizeToReg(Src1); |
| 2580 break; |
| 2581 } |
2557 constexpr uint32_t DivideByZeroTrapCode = 7; | 2582 constexpr uint32_t DivideByZeroTrapCode = 7; |
2558 | 2583 |
2559 switch (Instr->getOp()) { | 2584 switch (Instr->getOp()) { |
2560 case InstArithmetic::_num: | 2585 case InstArithmetic::_num: |
2561 break; | 2586 break; |
2562 case InstArithmetic::Add: | 2587 case InstArithmetic::Add: |
2563 _addu(T, Src0R, Src1R); | 2588 if (IsSrc1Imm16) { |
| 2589 _addiu(T, Src0R, Value); |
| 2590 } else { |
| 2591 _addu(T, Src0R, Src1R); |
| 2592 } |
2564 _mov(Dest, T); | 2593 _mov(Dest, T); |
2565 return; | 2594 return; |
2566 case InstArithmetic::And: | 2595 case InstArithmetic::And: |
2567 _and(T, Src0R, Src1R); | 2596 if (IsSrc1Imm16) { |
| 2597 _andi(T, Src0R, Value); |
| 2598 } else { |
| 2599 _and(T, Src0R, Src1R); |
| 2600 } |
2568 _mov(Dest, T); | 2601 _mov(Dest, T); |
2569 return; | 2602 return; |
2570 case InstArithmetic::Or: | 2603 case InstArithmetic::Or: |
2571 _or(T, Src0R, Src1R); | 2604 if (IsSrc1Imm16) { |
| 2605 _ori(T, Src0R, Value); |
| 2606 } else { |
| 2607 _or(T, Src0R, Src1R); |
| 2608 } |
2572 _mov(Dest, T); | 2609 _mov(Dest, T); |
2573 return; | 2610 return; |
2574 case InstArithmetic::Xor: | 2611 case InstArithmetic::Xor: |
2575 _xor(T, Src0R, Src1R); | 2612 if (IsSrc1Imm16) { |
| 2613 _xori(T, Src0R, Value); |
| 2614 } else { |
| 2615 _xor(T, Src0R, Src1R); |
| 2616 } |
2576 _mov(Dest, T); | 2617 _mov(Dest, T); |
2577 return; | 2618 return; |
2578 case InstArithmetic::Sub: | 2619 case InstArithmetic::Sub: |
2579 _subu(T, Src0R, Src1R); | 2620 if (IsSrc1Imm16) { |
| 2621 _addiu(T, Src0R, -Value); |
| 2622 } else { |
| 2623 _subu(T, Src0R, Src1R); |
| 2624 } |
2580 _mov(Dest, T); | 2625 _mov(Dest, T); |
2581 return; | 2626 return; |
2582 case InstArithmetic::Mul: { | 2627 case InstArithmetic::Mul: { |
2583 _mul(T, Src0R, Src1R); | 2628 _mul(T, Src0R, Src1R); |
2584 _mov(Dest, T); | 2629 _mov(Dest, T); |
2585 return; | 2630 return; |
2586 } | 2631 } |
2587 case InstArithmetic::Shl: { | 2632 case InstArithmetic::Shl: { |
2588 _sllv(T, Src0R, Src1R); | 2633 if (IsSrc1Imm16) { |
| 2634 _sll(T, Src0R, Value); |
| 2635 } else { |
| 2636 _sllv(T, Src0R, Src1R); |
| 2637 } |
2589 _mov(Dest, T); | 2638 _mov(Dest, T); |
2590 return; | 2639 return; |
2591 } | 2640 } |
2592 case InstArithmetic::Lshr: { | 2641 case InstArithmetic::Lshr: { |
2593 auto *T0R = Src0R; | 2642 auto *T0R = Src0R; |
2594 auto *T1R = Src1R; | 2643 auto *T1R = Src1R; |
2595 if (Dest->getType() != IceType_i32) { | 2644 if (Dest->getType() != IceType_i32) { |
2596 T0R = makeReg(IceType_i32); | 2645 T0R = makeReg(IceType_i32); |
2597 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R)); | 2646 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R)); |
2598 T1R = makeReg(IceType_i32); | 2647 if (!IsSrc1Imm16) { |
2599 lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R)); | 2648 T1R = makeReg(IceType_i32); |
| 2649 lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R)); |
| 2650 } |
2600 } | 2651 } |
2601 _srlv(T, T0R, T1R); | 2652 if (IsSrc1Imm16) { |
| 2653 _srl(T, T0R, Value); |
| 2654 } else { |
| 2655 _srlv(T, T0R, T1R); |
| 2656 } |
2602 _mov(Dest, T); | 2657 _mov(Dest, T); |
2603 return; | 2658 return; |
2604 } | 2659 } |
2605 case InstArithmetic::Ashr: { | 2660 case InstArithmetic::Ashr: { |
2606 _srav(T, Src0R, Src1R); | 2661 if (IsSrc1Imm16) { |
| 2662 _sra(T, Src0R, Value); |
| 2663 } else { |
| 2664 _srav(T, Src0R, Src1R); |
| 2665 } |
2607 _mov(Dest, T); | 2666 _mov(Dest, T); |
2608 return; | 2667 return; |
2609 } | 2668 } |
2610 case InstArithmetic::Udiv: { | 2669 case InstArithmetic::Udiv: { |
2611 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); | 2670 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); |
2612 auto *T0R = Src0R; | 2671 auto *T0R = Src0R; |
2613 auto *T1R = Src1R; | 2672 auto *T1R = Src1R; |
2614 if (Dest->getType() != IceType_i32) { | 2673 if (Dest->getType() != IceType_i32) { |
2615 T0R = makeReg(IceType_i32); | 2674 T0R = makeReg(IceType_i32); |
2616 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R)); | 2675 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R)); |
(...skipping 2752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5369 Str << "\t.set\t" | 5428 Str << "\t.set\t" |
5370 << "noat\n"; | 5429 << "noat\n"; |
5371 } | 5430 } |
5372 | 5431 |
5373 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 5432 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
5374 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 5433 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
5375 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 5434 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
5376 | 5435 |
5377 } // end of namespace MIPS32 | 5436 } // end of namespace MIPS32 |
5378 } // end of namespace Ice | 5437 } // end of namespace Ice |
OLD | NEW |