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

Side by Side Diff: src/IceTargetLoweringX86BaseImpl.h

Issue 2063053002: Subzero: x86-64: Allow immediates in 64-bit instructions. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix assert. Created 4 years, 6 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
« no previous file with comments | « src/IceInstX86BaseImpl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/IceInstX86BaseImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698