| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// | 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 2210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2221 _imul_imm(T, Src0, ImmConst); | 2221 _imul_imm(T, Src0, ImmConst); |
| 2222 _mov(Dest, T); | 2222 _mov(Dest, T); |
| 2223 } else { | 2223 } else { |
| 2224 _mov(T, Src0); | 2224 _mov(T, Src0); |
| 2225 _imul(T, Src0 == Src1 ? T : Src1); | 2225 _imul(T, Src0 == Src1 ? T : Src1); |
| 2226 _mov(Dest, T); | 2226 _mov(Dest, T); |
| 2227 } | 2227 } |
| 2228 break; | 2228 break; |
| 2229 case InstArithmetic::Shl: | 2229 case InstArithmetic::Shl: |
| 2230 _mov(T, Src0); | 2230 _mov(T, Src0); |
| 2231 if (!llvm::isa<ConstantInteger32>(Src1)) | 2231 if (!llvm::isa<ConstantInteger32>(Src1) && |
| 2232 !llvm::isa<ConstantInteger64>(Src1)) |
| 2232 Src1 = copyToReg8(Src1, Traits::RegisterSet::Reg_cl); | 2233 Src1 = copyToReg8(Src1, Traits::RegisterSet::Reg_cl); |
| 2233 _shl(T, Src1); | 2234 _shl(T, Src1); |
| 2234 _mov(Dest, T); | 2235 _mov(Dest, T); |
| 2235 break; | 2236 break; |
| 2236 case InstArithmetic::Lshr: | 2237 case InstArithmetic::Lshr: |
| 2237 _mov(T, Src0); | 2238 _mov(T, Src0); |
| 2238 if (!llvm::isa<ConstantInteger32>(Src1)) | 2239 if (!llvm::isa<ConstantInteger32>(Src1) && |
| 2240 !llvm::isa<ConstantInteger64>(Src1)) |
| 2239 Src1 = copyToReg8(Src1, Traits::RegisterSet::Reg_cl); | 2241 Src1 = copyToReg8(Src1, Traits::RegisterSet::Reg_cl); |
| 2240 _shr(T, Src1); | 2242 _shr(T, Src1); |
| 2241 _mov(Dest, T); | 2243 _mov(Dest, T); |
| 2242 break; | 2244 break; |
| 2243 case InstArithmetic::Ashr: | 2245 case InstArithmetic::Ashr: |
| 2244 _mov(T, Src0); | 2246 _mov(T, Src0); |
| 2245 if (!llvm::isa<ConstantInteger32>(Src1)) | 2247 if (!llvm::isa<ConstantInteger32>(Src1) && |
| 2248 !llvm::isa<ConstantInteger64>(Src1)) |
| 2246 Src1 = copyToReg8(Src1, Traits::RegisterSet::Reg_cl); | 2249 Src1 = copyToReg8(Src1, Traits::RegisterSet::Reg_cl); |
| 2247 _sar(T, Src1); | 2250 _sar(T, Src1); |
| 2248 _mov(Dest, T); | 2251 _mov(Dest, T); |
| 2249 break; | 2252 break; |
| 2250 case InstArithmetic::Udiv: { | 2253 case InstArithmetic::Udiv: { |
| 2251 // div and idiv are the few arithmetic operators that do not allow | 2254 // div and idiv are the few arithmetic operators that do not allow |
| 2252 // immediates as the operand. | 2255 // immediates as the operand. |
| 2253 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); | 2256 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); |
| 2254 RegNumT Eax; | 2257 RegNumT Eax; |
| 2255 RegNumT Edx; | 2258 RegNumT Edx; |
| (...skipping 5076 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7332 if (isVectorType(Ty)) | 7335 if (isVectorType(Ty)) |
| 7333 return From; | 7336 return From; |
| 7334 Const = llvm::cast<Constant>(From); | 7337 Const = llvm::cast<Constant>(From); |
| 7335 } | 7338 } |
| 7336 // There should be no constants of vector type (other than undef). | 7339 // There should be no constants of vector type (other than undef). |
| 7337 assert(!isVectorType(Ty)); | 7340 assert(!isVectorType(Ty)); |
| 7338 | 7341 |
| 7339 // If the operand is a 64 bit constant integer we need to legalize it to a | 7342 // If the operand is a 64 bit constant integer we need to legalize it to a |
| 7340 // register in x86-64. | 7343 // register in x86-64. |
| 7341 if (Traits::Is64Bit) { | 7344 if (Traits::Is64Bit) { |
| 7342 if (llvm::isa<ConstantInteger64>(Const)) { | 7345 if (auto *C64 = llvm::dyn_cast<ConstantInteger64>(Const)) { |
| 7343 if (RegNum.hasValue()) { | 7346 if (!Utils::IsInt(32, C64->getValue())) { |
| 7344 assert(Traits::getGprForType(IceType_i64, RegNum) == RegNum); | 7347 if (RegNum.hasValue()) { |
| 7348 assert(Traits::getGprForType(IceType_i64, RegNum) == RegNum); |
| 7349 } |
| 7350 return copyToReg(Const, RegNum); |
| 7345 } | 7351 } |
| 7346 return copyToReg(Const, RegNum); | |
| 7347 } | 7352 } |
| 7348 } | 7353 } |
| 7349 | 7354 |
| 7350 // If the operand is an 32 bit constant integer, we should check whether we | 7355 // If the operand is an 32 bit constant integer, we should check whether we |
| 7351 // need to randomize it or pool it. | 7356 // need to randomize it or pool it. |
| 7352 if (auto *C = llvm::dyn_cast<ConstantInteger32>(Const)) { | 7357 if (auto *C = llvm::dyn_cast<ConstantInteger32>(Const)) { |
| 7353 Operand *NewConst = randomizeOrPoolImmediate(C, RegNum); | 7358 Operand *NewConst = randomizeOrPoolImmediate(C, RegNum); |
| 7354 if (NewConst != Const) { | 7359 if (NewConst != Const) { |
| 7355 return NewConst; | 7360 return NewConst; |
| 7356 } | 7361 } |
| (...skipping 609 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7966 emitGlobal(*Var, SectionSuffix); | 7971 emitGlobal(*Var, SectionSuffix); |
| 7967 } | 7972 } |
| 7968 } | 7973 } |
| 7969 } break; | 7974 } break; |
| 7970 } | 7975 } |
| 7971 } | 7976 } |
| 7972 } // end of namespace X86NAMESPACE | 7977 } // end of namespace X86NAMESPACE |
| 7973 } // end of namespace Ice | 7978 } // end of namespace Ice |
| 7974 | 7979 |
| 7975 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H | 7980 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H |
| OLD | NEW |