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 2614 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2625 } | 2625 } |
2626 case InstCast::Uitofp: { | 2626 case InstCast::Uitofp: { |
2627 if (llvm::isa<Variable64On32>(Dest)) { | 2627 if (llvm::isa<Variable64On32>(Dest)) { |
2628 llvm::report_fatal_error("i64-to-fp should have been prelowered."); | 2628 llvm::report_fatal_error("i64-to-fp should have been prelowered."); |
2629 return; | 2629 return; |
2630 } | 2630 } |
2631 UnimplementedLoweringError(this, Instr); | 2631 UnimplementedLoweringError(this, Instr); |
2632 break; | 2632 break; |
2633 } | 2633 } |
2634 case InstCast::Bitcast: { | 2634 case InstCast::Bitcast: { |
| 2635 Operand *Src0 = Instr->getSrc(0); |
| 2636 if (DestTy == Src0->getType()) { |
| 2637 auto *Assign = InstAssign::create(Func, Dest, Src0); |
| 2638 lowerAssign(Assign); |
| 2639 return; |
| 2640 } |
2635 switch (DestTy) { | 2641 switch (DestTy) { |
2636 case IceType_NUM: | 2642 case IceType_NUM: |
2637 case IceType_void: | 2643 case IceType_void: |
2638 llvm::report_fatal_error("Unexpected bitcast."); | 2644 llvm::report_fatal_error("Unexpected bitcast."); |
2639 case IceType_i1: | 2645 case IceType_i1: |
2640 UnimplementedLoweringError(this, Instr); | 2646 UnimplementedLoweringError(this, Instr); |
2641 break; | 2647 break; |
2642 case IceType_i8: | 2648 case IceType_i8: |
2643 assert(Src0->getType() == IceType_v8i1); | 2649 assert(Src0->getType() == IceType_v8i1); |
2644 llvm::report_fatal_error( | 2650 llvm::report_fatal_error( |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3029 assert(SrcTy == IceType_i32 || SrcTy == IceType_i64); | 3035 assert(SrcTy == IceType_i32 || SrcTy == IceType_i64); |
3030 switch (SrcTy) { | 3036 switch (SrcTy) { |
3031 case IceType_i32: { | 3037 case IceType_i32: { |
3032 auto *T = I32Reg(); | 3038 auto *T = I32Reg(); |
3033 auto *SrcR = legalizeToReg(Src); | 3039 auto *SrcR = legalizeToReg(Src); |
3034 _clz(T, SrcR); | 3040 _clz(T, SrcR); |
3035 _mov(Dest, T); | 3041 _mov(Dest, T); |
3036 break; | 3042 break; |
3037 } | 3043 } |
3038 case IceType_i64: { | 3044 case IceType_i64: { |
3039 UnimplementedLoweringError(this, Instr); | 3045 auto *T1 = I32Reg(); |
| 3046 auto *T2 = I32Reg(); |
| 3047 auto *T3 = I32Reg(); |
| 3048 auto *T4 = I32Reg(); |
| 3049 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| 3050 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| 3051 Variable *SrcHiR = legalizeToReg(hiOperand(Src)); |
| 3052 Variable *SrcLoR = legalizeToReg(loOperand(Src)); |
| 3053 _clz(T1, SrcHiR); |
| 3054 _clz(T2, SrcLoR); |
| 3055 _addiu(T3, T2, 32); |
| 3056 _movn(T3, T1, SrcHiR); |
| 3057 _addiu(T4, getZero(), 0); |
| 3058 _mov(DestHi, T4); |
| 3059 _mov(DestLo, T3); |
3040 break; | 3060 break; |
3041 } | 3061 } |
3042 default: | 3062 default: |
3043 llvm::report_fatal_error("Control flow should never have reached here."); | 3063 llvm::report_fatal_error("Control flow should never have reached here."); |
3044 } | 3064 } |
3045 break; | 3065 break; |
3046 } | 3066 } |
3047 case Intrinsics::Cttz: { | 3067 case Intrinsics::Cttz: { |
3048 auto *Src = Instr->getArg(0); | 3068 auto *Src = Instr->getArg(0); |
3049 const Type SrcTy = Src->getType(); | 3069 const Type SrcTy = Src->getType(); |
(...skipping 10 matching lines...) Expand all Loading... |
3060 _addiu(T1, SrcR, -1); | 3080 _addiu(T1, SrcR, -1); |
3061 _not(T2, SrcR); | 3081 _not(T2, SrcR); |
3062 _and(T3, T2, T1); | 3082 _and(T3, T2, T1); |
3063 _clz(T4, T3); | 3083 _clz(T4, T3); |
3064 _addiu(T5, getZero(), 32); | 3084 _addiu(T5, getZero(), 32); |
3065 _subu(T6, T5, T4); | 3085 _subu(T6, T5, T4); |
3066 _mov(Dest, T6); | 3086 _mov(Dest, T6); |
3067 break; | 3087 break; |
3068 } | 3088 } |
3069 case IceType_i64: { | 3089 case IceType_i64: { |
3070 UnimplementedLoweringError(this, Instr); | 3090 auto *THi1 = I32Reg(); |
| 3091 auto *THi2 = I32Reg(); |
| 3092 auto *THi3 = I32Reg(); |
| 3093 auto *THi4 = I32Reg(); |
| 3094 auto *THi5 = I32Reg(); |
| 3095 auto *THi6 = I32Reg(); |
| 3096 auto *TLo1 = I32Reg(); |
| 3097 auto *TLo2 = I32Reg(); |
| 3098 auto *TLo3 = I32Reg(); |
| 3099 auto *TLo4 = I32Reg(); |
| 3100 auto *TLo5 = I32Reg(); |
| 3101 auto *TLo6 = I32Reg(); |
| 3102 auto *TResHi = I32Reg(); |
| 3103 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| 3104 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| 3105 Variable *SrcHiR = legalizeToReg(hiOperand(Src)); |
| 3106 Variable *SrcLoR = legalizeToReg(loOperand(Src)); |
| 3107 _addiu(THi1, SrcHiR, -1); |
| 3108 _not(THi2, SrcHiR); |
| 3109 _and(THi3, THi2, THi1); |
| 3110 _clz(THi4, THi3); |
| 3111 _addiu(THi5, getZero(), 64); |
| 3112 _subu(THi6, THi5, THi4); |
| 3113 _addiu(TLo1, SrcLoR, -1); |
| 3114 _not(TLo2, SrcLoR); |
| 3115 _and(TLo3, TLo2, TLo1); |
| 3116 _clz(TLo4, TLo3); |
| 3117 _addiu(TLo5, getZero(), 32); |
| 3118 _subu(TLo6, TLo5, TLo4); |
| 3119 _movn(THi6, TLo6, SrcLoR); |
| 3120 _addiu(TResHi, getZero(), 0); |
| 3121 _mov(DestHi, TResHi); |
| 3122 _mov(DestLo, THi6); |
3071 break; | 3123 break; |
3072 } | 3124 } |
3073 default: | 3125 default: |
3074 llvm::report_fatal_error("Control flow should never have reached here."); | 3126 llvm::report_fatal_error("Control flow should never have reached here."); |
3075 } | 3127 } |
3076 return; | 3128 return; |
3077 } | 3129 } |
3078 case Intrinsics::Fabs: { | 3130 case Intrinsics::Fabs: { |
3079 if (isScalarFloatingType(DestTy)) { | 3131 if (isScalarFloatingType(DestTy)) { |
3080 Variable *T = makeReg(DestTy); | 3132 Variable *T = makeReg(DestTy); |
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3980 Str << "\t.set\t" | 4032 Str << "\t.set\t" |
3981 << "nomips16\n"; | 4033 << "nomips16\n"; |
3982 } | 4034 } |
3983 | 4035 |
3984 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 4036 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
3985 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 4037 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
3986 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 4038 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
3987 | 4039 |
3988 } // end of namespace MIPS32 | 4040 } // end of namespace MIPS32 |
3989 } // end of namespace Ice | 4041 } // end of namespace Ice |
OLD | NEW |