| 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 auto *T4 = I32Reg(); |
| 2922 _xor(T1, Src0HiR, Src1HiR); |
| 2923 _xor(T2, Src0LoR, Src1LoR); |
| 2924 _or(T3, T1, T2); |
| 2925 _sltiu(T4, T3, 1); |
| 2926 _mov(Dest, T4); |
| 2927 return; |
| 2928 } |
| 2929 case InstIcmp::Ne: { |
| 2930 auto *T1 = I32Reg(); |
| 2931 auto *T2 = I32Reg(); |
| 2932 auto *T3 = I32Reg(); |
| 2933 auto *T4 = I32Reg(); |
| 2934 _xor(T1, Src0HiR, Src1HiR); |
| 2935 _xor(T2, Src0LoR, Src1LoR); |
| 2936 _or(T3, T1, T2); |
| 2937 _sltu(T4, getZero(), T3); |
| 2938 _mov(Dest, T4); |
| 2939 return; |
| 2940 } |
| 2941 case InstIcmp::Sgt: { |
| 2942 auto *T1 = I32Reg(); |
| 2943 auto *T2 = I32Reg(); |
| 2944 auto *T3 = I32Reg(); |
| 2945 _xor(T1, Src0HiR, Src1HiR); |
| 2946 _slt(T2, Src1HiR, Src0HiR); |
| 2947 _sltu(T3, Src1LoR, Src0LoR); |
| 2948 _movz(T2, T3, T1); |
| 2949 _mov(Dest, T2); |
| 2950 return; |
| 2951 } |
| 2952 case InstIcmp::Ugt: { |
| 2953 auto *T1 = I32Reg(); |
| 2954 auto *T2 = I32Reg(); |
| 2955 auto *T3 = I32Reg(); |
| 2956 _xor(T1, Src0HiR, Src1HiR); |
| 2957 _sltu(T2, Src1HiR, Src0HiR); |
| 2958 _sltu(T3, Src1LoR, Src0LoR); |
| 2959 _movz(T2, T3, T1); |
| 2960 _mov(Dest, T2); |
| 2961 return; |
| 2962 } |
| 2963 case InstIcmp::Sge: { |
| 2964 auto *T1 = I32Reg(); |
| 2965 auto *T2 = I32Reg(); |
| 2966 auto *T3 = I32Reg(); |
| 2967 auto *T4 = I32Reg(); |
| 2968 auto *T5 = I32Reg(); |
| 2969 _xor(T1, Src0HiR, Src1HiR); |
| 2970 _slt(T2, Src0HiR, Src1HiR); |
| 2971 _xori(T3, T2, 1); |
| 2972 _sltu(T4, Src0LoR, Src1LoR); |
| 2973 _xori(T5, T4, 1); |
| 2974 _movz(T3, T5, T1); |
| 2975 _mov(Dest, T3); |
| 2976 return; |
| 2977 } |
| 2978 case InstIcmp::Uge: { |
| 2979 auto *T1 = I32Reg(); |
| 2980 auto *T2 = I32Reg(); |
| 2981 auto *T3 = I32Reg(); |
| 2982 auto *T4 = I32Reg(); |
| 2983 auto *T5 = I32Reg(); |
| 2984 _xor(T1, Src0HiR, Src1HiR); |
| 2985 _sltu(T2, Src0HiR, Src1HiR); |
| 2986 _xori(T3, T2, 1); |
| 2987 _sltu(T4, Src0LoR, Src1LoR); |
| 2988 _xori(T5, T4, 1); |
| 2989 _movz(T3, T5, T1); |
| 2990 _mov(Dest, T3); |
| 2991 return; |
| 2992 } |
| 2993 case InstIcmp::Slt: { |
| 2994 auto *T1 = I32Reg(); |
| 2995 auto *T2 = I32Reg(); |
| 2996 auto *T3 = I32Reg(); |
| 2997 _xor(T1, Src0HiR, Src1HiR); |
| 2998 _slt(T2, Src0HiR, Src1HiR); |
| 2999 _sltu(T3, Src0LoR, Src1LoR); |
| 3000 _movz(T2, T3, T1); |
| 3001 _mov(Dest, T2); |
| 3002 return; |
| 3003 } |
| 3004 case InstIcmp::Ult: { |
| 3005 auto *T1 = I32Reg(); |
| 3006 auto *T2 = I32Reg(); |
| 3007 auto *T3 = I32Reg(); |
| 3008 _xor(T1, Src0HiR, Src1HiR); |
| 3009 _sltu(T2, Src0HiR, Src1HiR); |
| 3010 _sltu(T3, Src0LoR, Src1LoR); |
| 3011 _movz(T2, T3, T1); |
| 3012 _mov(Dest, T2); |
| 3013 return; |
| 3014 } |
| 3015 case InstIcmp::Sle: { |
| 3016 auto *T1 = I32Reg(); |
| 3017 auto *T2 = I32Reg(); |
| 3018 auto *T3 = I32Reg(); |
| 3019 auto *T4 = I32Reg(); |
| 3020 auto *T5 = I32Reg(); |
| 3021 _xor(T1, Src0HiR, Src1HiR); |
| 3022 _slt(T2, Src1HiR, Src0HiR); |
| 3023 _xori(T3, T2, 1); |
| 3024 _sltu(T4, Src1LoR, Src0LoR); |
| 3025 _xori(T5, T4, 1); |
| 3026 _movz(T3, T5, T1); |
| 3027 _mov(Dest, T3); |
| 3028 return; |
| 3029 } |
| 3030 case InstIcmp::Ule: { |
| 3031 auto *T1 = I32Reg(); |
| 3032 auto *T2 = I32Reg(); |
| 3033 auto *T3 = I32Reg(); |
| 3034 auto *T4 = I32Reg(); |
| 3035 auto *T5 = I32Reg(); |
| 3036 _xor(T1, Src0HiR, Src1HiR); |
| 3037 _sltu(T2, Src1HiR, Src0HiR); |
| 3038 _xori(T3, T2, 1); |
| 3039 _sltu(T4, Src1LoR, Src0LoR); |
| 3040 _xori(T5, T4, 1); |
| 3041 _movz(T3, T5, T1); |
| 3042 _mov(Dest, T3); |
| 3043 return; |
| 3044 } |
| 3045 } |
| 2905 } | 3046 } |
| 2906 | 3047 |
| 2907 void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) { | 3048 void TargetMIPS32::lowerIcmp(const InstIcmp *Instr) { |
| 2908 auto *Src0 = Instr->getSrc(0); | 3049 auto *Src0 = Instr->getSrc(0); |
| 2909 auto *Src1 = Instr->getSrc(1); | 3050 auto *Src1 = Instr->getSrc(1); |
| 2910 if (Src0->getType() == IceType_i64) { | 3051 if (Src0->getType() == IceType_i64) { |
| 2911 lower64Icmp(Instr); | 3052 lower64Icmp(Instr); |
| 2912 return; | 3053 return; |
| 2913 } | 3054 } |
| 2914 Variable *Dest = Instr->getDest(); | 3055 Variable *Dest = Instr->getDest(); |
| (...skipping 1144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4059 Str << "\t.set\t" | 4200 Str << "\t.set\t" |
| 4060 << "nomips16\n"; | 4201 << "nomips16\n"; |
| 4061 } | 4202 } |
| 4062 | 4203 |
| 4063 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; | 4204 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; |
| 4064 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; | 4205 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; |
| 4065 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; | 4206 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; |
| 4066 | 4207 |
| 4067 } // end of namespace MIPS32 | 4208 } // end of namespace MIPS32 |
| 4068 } // end of namespace Ice | 4209 } // end of namespace Ice |
| OLD | NEW |