Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2364093002: Subzero, MIPS32: Intrinsic calls Ctlz and Cttz for i64 (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Bitcast added Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698