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 2882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2893 Context.insert<InstFakeUse>(Src0R); | 2893 Context.insert<InstFakeUse>(Src0R); |
| 2894 Context.insert<InstFakeUse>(Src1R); | 2894 Context.insert<InstFakeUse>(Src1R); |
| 2895 _addiu(DestR, Zero, 1); | 2895 _addiu(DestR, Zero, 1); |
| 2896 _mov(Dest, DestR); | 2896 _mov(Dest, DestR); |
| 2897 break; | 2897 break; |
| 2898 } | 2898 } |
| 2899 } | 2899 } |
| 2900 } | 2900 } |
| 2901 | 2901 |
| 2902 void TargetMIPS32::lower64Icmp(const InstIcmp *Instr) { | 2902 void TargetMIPS32::lower64Icmp(const InstIcmp *Instr) { |
| 2903 UnimplementedLoweringError(this, Instr); | 2903 Operand *Src0 = legalize(Instr->getSrc(0)); |
| 2904 return; | 2904 Operand *Src1 = legalize(Instr->getSrc(1)); |
| 2905 Variable *Dest = Instr->getDest(); | |
| 2906 InstIcmp::ICond Condition = Instr->getCondition(); | |
| 2907 | |
| 2908 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); | |
| 2909 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); | |
| 2910 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); | |
| 2911 Variable *Src1HiR = legalizeToReg(hiOperand(Src1)); | |
| 2912 | |
| 2913 switch (Condition) { | |
| 2914 default: | |
| 2915 llvm_unreachable("unexpected condition"); | |
| 2916 break; | |
| 2917 case InstIcmp::Eq: { | |
| 2918 auto *T1 = I32Reg(); | |
| 2919 auto *T2 = I32Reg(); | |
| 2920 auto *T3 = I32Reg(); | |
| 2921 _xor(T1, Src0HiR, Src1HiR); | |
| 2922 _xor(T2, Src0LoR, Src1LoR); | |
| 2923 _or(T3, T1, T2); | |
| 2924 _sltiu(Dest, T3, 1); | |
|
Jim Stichnoth
2016/09/27 13:45:35
Dest isn't necessarily a physical register (and pr
sagar.thakur
2016/09/28 08:23:23
Done.
| |
| 2925 return; | |
| 2926 } | |
| 2927 case InstIcmp::Ne: { | |
| 2928 auto *T1 = I32Reg(); | |
| 2929 auto *T2 = I32Reg(); | |
| 2930 auto *T3 = I32Reg(); | |
| 2931 _xor(T1, Src0HiR, Src1HiR); | |
| 2932 _xor(T2, Src0LoR, Src1LoR); | |
| 2933 _or(T3, T1, T2); | |
| 2934 _sltu(Dest, getZero(), T3); | |
| 2935 return; | |
| 2936 } | |
| 2937 case InstIcmp::Sgt: { | |
| 2938 auto *T1 = I32Reg(); | |
| 2939 auto *T2 = I32Reg(); | |
| 2940 auto *T3 = I32Reg(); | |
| 2941 _xor(T1, Src0HiR, Src1HiR); | |
| 2942 _slt(T2, Src1HiR, Src0HiR); | |
| 2943 _sltu(T3, Src1LoR, Src0LoR); | |
| 2944 _movz(T2, T3, T1); | |
| 2945 _mov(Dest, T2); | |
| 2946 return; | |
| 2947 } | |
| 2948 case InstIcmp::Ugt: { | |
| 2949 auto *T1 = I32Reg(); | |
| 2950 auto *T2 = I32Reg(); | |
| 2951 auto *T3 = I32Reg(); | |
| 2952 _xor(T1, Src0HiR, Src1HiR); | |
| 2953 _sltu(T2, Src1HiR, Src0HiR); | |
| 2954 _sltu(T3, Src1LoR, Src0LoR); | |
| 2955 _movz(T2, T3, T1); | |
| 2956 _mov(Dest, T2); | |
| 2957 return; | |
| 2958 } | |
| 2959 case InstIcmp::Sge: { | |
| 2960 auto *T1 = I32Reg(); | |
| 2961 auto *T2 = I32Reg(); | |
| 2962 auto *T3 = I32Reg(); | |
| 2963 auto *T4 = I32Reg(); | |
| 2964 auto *T5 = I32Reg(); | |
| 2965 _xor(T1, Src0HiR, Src1HiR); | |
| 2966 _slt(T2, Src0HiR, Src1HiR); | |
| 2967 _xori(T3, T2, 1); | |
| 2968 _sltu(T4, Src0LoR, Src1LoR); | |
| 2969 _xori(T5, T4, 1); | |
| 2970 _movz(T3, T5, T1); | |
| 2971 _mov(Dest, T3); | |
| 2972 return; | |
| 2973 } | |
| 2974 case InstIcmp::Uge: { | |
| 2975 auto *T1 = I32Reg(); | |
| 2976 auto *T2 = I32Reg(); | |
| 2977 auto *T3 = I32Reg(); | |
| 2978 auto *T4 = I32Reg(); | |
| 2979 auto *T5 = I32Reg(); | |
| 2980 _xor(T1, Src0HiR, Src1HiR); | |
| 2981 _sltu(T2, Src0HiR, Src1HiR); | |
| 2982 _xori(T3, T2, 1); | |
| 2983 _sltu(T4, Src0LoR, Src1LoR); | |
| 2984 _xori(T5, T4, 1); | |
| 2985 _movz(T3, T5, T1); | |
| 2986 _mov(Dest, T3); | |
| 2987 return; | |
| 2988 } | |
| 2989 case InstIcmp::Slt: { | |
| 2990 auto *T1 = I32Reg(); | |
| 2991 auto *T2 = I32Reg(); | |
| 2992 auto *T3 = I32Reg(); | |
| 2993 _xor(T1, Src0HiR, Src1HiR); | |
| 2994 _slt(T2, Src0HiR, Src1HiR); | |
| 2995 _sltu(T3, Src0LoR, Src1LoR); | |
| 2996 _movz(T2, T3, T1); | |
| 2997 _mov(Dest, T2); | |
| 2998 return; | |
| 2999 } | |
| 3000 case InstIcmp::Ult: { | |
| 3001 auto *T1 = I32Reg(); | |
| 3002 auto *T2 = I32Reg(); | |
| 3003 auto *T3 = I32Reg(); | |
| 3004 _xor(T1, Src0HiR, Src1HiR); | |
| 3005 _sltu(T2, Src0HiR, Src1HiR); | |
| 3006 _sltu(T3, Src0LoR, Src1LoR); | |
| 3007 _movz(T2, T3, T1); | |
| 3008 _mov(Dest, T2); | |
| 3009 return; | |
| 3010 } | |
| 3011 case InstIcmp::Sle: { | |
| 3012 auto *T1 = I32Reg(); | |
| 3013 auto *T2 = I32Reg(); | |
| 3014 auto *T3 = I32Reg(); | |
| 3015 auto *T4 = I32Reg(); | |
| 3016 auto *T5 = I32Reg(); | |
| 3017 _xor(T1, Src0HiR, Src1HiR); | |
| 3018 _slt(T2, Src1HiR, Src0HiR); | |
| 3019 _xori(T3, T2, 1); | |
| 3020 _sltu(T4, Src1LoR, Src0LoR); | |
| 3021 _xori(T5, T4, 1); | |
| 3022 _movz(T3, T5, T1); | |
| 3023 _mov(Dest, T3); | |
| 3024 return; | |
| 3025 } | |
| 3026 case InstIcmp::Ule: { | |
| 3027 auto *T1 = I32Reg(); | |
| 3028 auto *T2 = I32Reg(); | |
| 3029 auto *T3 = I32Reg(); | |
| 3030 auto *T4 = I32Reg(); | |
| 3031 auto *T5 = I32Reg(); | |
| 3032 _xor(T1, Src0HiR, Src1HiR); | |
| 3033 _sltu(T2, Src1HiR, Src0HiR); | |
| 3034 _xori(T3, T2, 1); | |
| 3035 _sltu(T4, Src1LoR, Src0LoR); | |
| 3036 _xori(T5, T4, 1); | |
| 3037 _movz(T3, T5, T1); | |
| 3038 _mov(Dest, T3); | |
| 3039 return; | |
| 3040 } | |
| 3041 } | |
| 2905 } | 3042 } |
| 2906 | 3043 |
| 2907 void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) { | 3044 void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) { |
| 2908 auto *Src0 = Instr->getSrc(0); | 3045 auto *Src0 = Instr->getSrc(0); |
| 2909 auto *Src1 = Instr->getSrc(1); | 3046 auto *Src1 = Instr->getSrc(1); |
| 2910 if (Src0->getType() == IceType_i64) { | 3047 if (Src0->getType() == IceType_i64) { |
| 2911 lower64Icmp(Instr); | 3048 lower64Icmp(Instr); |
| 2912 return; | 3049 return; |
| 2913 } | 3050 } |
| 2914 Variable *Dest = Instr->getDest(); | 3051 Variable *Dest = Instr->getDest(); |
| (...skipping 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4059 Str << "\t.set\t" | 4196 Str << "\t.set\t" |
| 4060 << "nomips16\n"; | 4197 << "nomips16\n"; |
| 4061 } | 4198 } |
| 4062 | 4199 |
| 4063 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 4200 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 4064 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 4201 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 4065 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 4202 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 4066 | 4203 |
| 4067 } // end of namespace MIPS32 | 4204 } // end of namespace MIPS32 |
| 4068 } // end of namespace Ice | 4205 } // end of namespace Ice |
| OLD | NEW |