Chromium Code Reviews| 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 2998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3009 return; | 3009 return; |
| 3010 } | 3010 } |
| 3011 case Intrinsics::AtomicRMW: | 3011 case Intrinsics::AtomicRMW: |
| 3012 UnimplementedLoweringError(this, Instr); | 3012 UnimplementedLoweringError(this, Instr); |
| 3013 return; | 3013 return; |
| 3014 case Intrinsics::AtomicStore: { | 3014 case Intrinsics::AtomicStore: { |
| 3015 UnimplementedLoweringError(this, Instr); | 3015 UnimplementedLoweringError(this, Instr); |
| 3016 return; | 3016 return; |
| 3017 } | 3017 } |
| 3018 case Intrinsics::Bswap: { | 3018 case Intrinsics::Bswap: { |
| 3019 UnimplementedLoweringError(this, Instr); | 3019 auto *Src = Instr->getArg(0); |
| 3020 const Type SrcTy = Src->getType(); | |
| 3021 assert(SrcTy == IceType_i16 || SrcTy == IceType_i32 || | |
| 3022 SrcTy == IceType_i64); | |
| 3023 switch (SrcTy) { | |
| 3024 case IceType_i16: { | |
| 3025 auto *T1 = I32Reg(); | |
| 3026 auto *T2 = I32Reg(); | |
| 3027 auto *T3 = I32Reg(); | |
| 3028 auto *T4 = I32Reg(); | |
| 3029 auto *SrcR = legalizeToReg(Src); | |
| 3030 _sll(T1, SrcR, 8); | |
| 3031 _lui(T2, Ctx->getConstantInt32(255)); | |
| 3032 _and(T1, T1, T2); | |
| 3033 _sll(T3, SrcR, 24); | |
| 3034 _or(T1, T3, T1); | |
| 3035 _srl(T4, T1, 16); | |
| 3036 _mov(Dest, T4); | |
| 3037 break; | |
|
Jim Stichnoth
2016/09/27 04:20:32
Can this "break" be changed to "return"? That wou
obucinac
2016/09/27 14:22:01
Done.
| |
| 3038 } | |
| 3039 case IceType_i32: { | |
| 3040 auto *T1 = I32Reg(); | |
| 3041 auto *T2 = I32Reg(); | |
| 3042 auto *T3 = I32Reg(); | |
| 3043 auto *T4 = I32Reg(); | |
| 3044 auto *T5 = I32Reg(); | |
| 3045 auto *SrcR = legalizeToReg(Src); | |
| 3046 _srl(T1, SrcR, 24); | |
| 3047 _srl(T2, SrcR, 8); | |
| 3048 _andi(T2, T2, 65280); | |
|
Jim Stichnoth
2016/09/27 04:20:32
Maybe this strange-looking constant would be more
obucinac
2016/09/27 14:22:01
Done.
| |
| 3049 _or(T1, T2, T1); | |
| 3050 _sll(T4, SrcR, 8); | |
| 3051 _lui(T3, Ctx->getConstantInt32(255)); | |
| 3052 _and(T4, T4, T3); | |
| 3053 _sll(T5, SrcR, 24); | |
| 3054 _or(T4, T5, T4); | |
| 3055 _or(T4, T4, T1); | |
| 3056 _mov(Dest, T4); | |
| 3057 break; | |
| 3058 } | |
| 3059 case IceType_i64: { | |
| 3060 auto *T1 = I32Reg(); | |
| 3061 auto *T2 = I32Reg(); | |
| 3062 auto *T3 = I32Reg(); | |
| 3063 auto *T4 = I32Reg(); | |
| 3064 auto *T5 = I32Reg(); | |
| 3065 auto *T6 = I32Reg(); | |
| 3066 auto *T7 = I32Reg(); | |
| 3067 auto *T8 = I32Reg(); | |
| 3068 auto *T9 = I32Reg(); | |
| 3069 auto *T10 = I32Reg(); | |
| 3070 auto *T11 = I32Reg(); | |
| 3071 auto *T12 = I32Reg(); | |
| 3072 auto *T13 = I32Reg(); | |
| 3073 auto *T14 = I32Reg(); | |
| 3074 auto *T15 = I32Reg(); | |
| 3075 auto *T16 = I32Reg(); | |
| 3076 auto *T17 = I32Reg(); | |
| 3077 auto *T18 = I32Reg(); | |
| 3078 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); | |
| 3079 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); | |
| 3080 Src = legalizeUndef(Src); | |
| 3081 auto *SrcLoR = legalizeToReg(loOperand(Src)); | |
| 3082 auto *SrcHiR = legalizeToReg(hiOperand(Src)); | |
| 3083 _sll(T1, SrcHiR, 8); | |
| 3084 _srl(T2, SrcHiR, 24); | |
| 3085 _srl(T3, SrcHiR, 8); | |
| 3086 _andi(T3, T3, 65280); | |
| 3087 _lui(T4, Ctx->getConstantInt32(255)); | |
| 3088 _or(T5, T3, T2); | |
| 3089 _and(T6, T1, T4); | |
| 3090 _sll(T7, SrcHiR, 24); | |
| 3091 _or(T8, T7, T6); | |
| 3092 _srl(T9, SrcLoR, 24); | |
| 3093 _srl(T10, SrcLoR, 8); | |
| 3094 _andi(T11, T10, 65280); | |
| 3095 _or(T12, T8, T5); | |
| 3096 _or(T13, T11, T9); | |
| 3097 _sll(T14, SrcLoR, 8); | |
| 3098 _and(T15, T14, T4); | |
| 3099 _sll(T16, SrcLoR, 24); | |
| 3100 _or(T17, T16, T15); | |
| 3101 _or(T18, T17, T13); | |
| 3102 _mov(DestLo, T12); | |
| 3103 _mov(DestHi, T18); | |
| 3104 break; | |
| 3105 } | |
| 3106 default: | |
| 3107 llvm::report_fatal_error("Control flow should never have reached here."); | |
| 3108 } | |
| 3020 return; | 3109 return; |
| 3021 } | 3110 } |
| 3022 case Intrinsics::Ctpop: { | 3111 case Intrinsics::Ctpop: { |
| 3023 llvm::report_fatal_error("Ctpop should have been prelowered."); | 3112 llvm::report_fatal_error("Ctpop should have been prelowered."); |
| 3024 return; | 3113 return; |
| 3025 } | 3114 } |
| 3026 case Intrinsics::Ctlz: { | 3115 case Intrinsics::Ctlz: { |
| 3027 auto *Src = Instr->getArg(0); | 3116 auto *Src = Instr->getArg(0); |
| 3028 const Type SrcTy = Src->getType(); | 3117 const Type SrcTy = Src->getType(); |
| 3029 assert(SrcTy == IceType_i32 || SrcTy == IceType_i64); | 3118 assert(SrcTy == IceType_i32 || SrcTy == IceType_i64); |
| (...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3980 Str << "\t.set\t" | 4069 Str << "\t.set\t" |
| 3981 << "nomips16\n"; | 4070 << "nomips16\n"; |
| 3982 } | 4071 } |
| 3983 | 4072 |
| 3984 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 4073 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 3985 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 4074 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 3986 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 4075 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 3987 | 4076 |
| 3988 } // end of namespace MIPS32 | 4077 } // end of namespace MIPS32 |
| 3989 } // end of namespace Ice | 4078 } // end of namespace Ice |
| OLD | NEW |