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

Side by Side Diff: src/IceInstX86BaseImpl.h

Issue 1537703002: Subzero. x8664. Resurrects the Target. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments Created 5 years 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 //===- subzero/src/IceInstX86BaseImpl.h - Generic X86 instructions -*- C++ -*=// 1 //===- subzero/src/IceInstX86BaseImpl.h - Generic X86 instructions -*- 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 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 this->addSource(Source); 191 this->addSource(Source);
192 } 192 }
193 193
194 template <class Machine> 194 template <class Machine>
195 InstX86Cmpxchg<Machine>::InstX86Cmpxchg(Cfg *Func, Operand *DestOrAddr, 195 InstX86Cmpxchg<Machine>::InstX86Cmpxchg(Cfg *Func, Operand *DestOrAddr,
196 Variable *Eax, Variable *Desired, 196 Variable *Eax, Variable *Desired,
197 bool Locked) 197 bool Locked)
198 : InstX86BaseLockable<Machine>(Func, InstX86Base<Machine>::Cmpxchg, 3, 198 : InstX86BaseLockable<Machine>(Func, InstX86Base<Machine>::Cmpxchg, 3,
199 llvm::dyn_cast<Variable>(DestOrAddr), 199 llvm::dyn_cast<Variable>(DestOrAddr),
200 Locked) { 200 Locked) {
201 assert(InstX86Base<Machine>::Traits::getBaseReg(Eax->getRegNum()) == 201 constexpr uint16_t Encoded_rAX = 0;
202 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); 202 (void)Encoded_rAX;
203 assert(InstX86Base<Machine>::Traits::getEncodedGPR(Eax->getRegNum()) ==
204 Encoded_rAX);
203 this->addSource(DestOrAddr); 205 this->addSource(DestOrAddr);
204 this->addSource(Eax); 206 this->addSource(Eax);
205 this->addSource(Desired); 207 this->addSource(Desired);
206 } 208 }
207 209
208 template <class Machine> 210 template <class Machine>
209 InstX86Cmpxchg8b<Machine>::InstX86Cmpxchg8b( 211 InstX86Cmpxchg8b<Machine>::InstX86Cmpxchg8b(
210 Cfg *Func, typename InstX86Base<Machine>::Traits::X86OperandMem *Addr, 212 Cfg *Func, typename InstX86Base<Machine>::Traits::X86OperandMem *Addr,
211 Variable *Edx, Variable *Eax, Variable *Ecx, Variable *Ebx, bool Locked) 213 Variable *Edx, Variable *Eax, Variable *Ecx, Variable *Ebx, bool Locked)
212 : InstX86BaseLockable<Machine>(Func, InstX86Base<Machine>::Cmpxchg, 5, 214 : InstX86BaseLockable<Machine>(Func, InstX86Base<Machine>::Cmpxchg, 5,
(...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after
1502 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ax); 1504 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ax);
1503 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_dx); 1505 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_dx);
1504 Asm->cwd(); 1506 Asm->cwd();
1505 break; 1507 break;
1506 case IceType_i32: 1508 case IceType_i32:
1507 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); 1509 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_eax);
1508 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); 1510 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx);
1509 Asm->cdq(); 1511 Asm->cdq();
1510 break; 1512 break;
1511 case IceType_i64: 1513 case IceType_i64:
1512 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); 1514 assert(InstX86Base<Machine>::Traits::Is64Bit);
1515 assert(SrcReg == InstX86Base<Machine>::Traits::getRaxOrDie());
1516 assert(DestReg == InstX86Base<Machine>::Traits::getRdxOrDie());
1513 Asm->cqo(); 1517 Asm->cqo();
1514 break; 1518 break;
1515 } 1519 }
1516 } 1520 }
1517 1521
1518 template <class Machine> void InstX86Mul<Machine>::emit(const Cfg *Func) const { 1522 template <class Machine> void InstX86Mul<Machine>::emit(const Cfg *Func) const {
1519 if (!BuildDefs::dump()) 1523 if (!BuildDefs::dump())
1520 return; 1524 return;
1521 Ostream &Str = Func->getContext()->getStrEmit(); 1525 Ostream &Str = Func->getContext()->getStrEmit();
1522 assert(this->getSrcSize() == 2); 1526 assert(this->getSrcSize() == 2);
(...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 return; 2465 return;
2462 } 2466 }
2463 } 2467 }
2464 2468
2465 template <class Machine> 2469 template <class Machine>
2466 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { 2470 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const {
2467 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2471 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2468 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2472 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2469 assert(this->getSrcSize() == 1); 2473 assert(this->getSrcSize() == 1);
2470 const Variable *Dest = this->getDest(); 2474 const Variable *Dest = this->getDest();
2471 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2472 auto *Target = InstX86Base<Machine>::getTarget(Func); 2475 auto *Target = InstX86Base<Machine>::getTarget(Func);
2473 // For insert/extract element (one of Src/Dest is an Xmm vector and the other 2476 // For insert/extract element (one of Src/Dest is an Xmm vector and the other
2474 // is an int type). 2477 // is an int type).
2475 if (SrcVar->getType() == IceType_i32 || 2478 if (const auto *SrcVar = llvm::dyn_cast<Variable>(this->getSrc(0))) {
2476 (InstX86Base<Machine>::Traits::Is64Bit && 2479 if (SrcVar->getType() == IceType_i32 ||
2477 SrcVar->getType() == IceType_i64)) { 2480 (InstX86Base<Machine>::Traits::Is64Bit &&
2478 assert(isVectorType(Dest->getType()) || 2481 SrcVar->getType() == IceType_i64)) {
2479 (isScalarFloatingType(Dest->getType()) && 2482 assert(isVectorType(Dest->getType()) ||
2480 typeWidthInBytes(SrcVar->getType()) == 2483 (isScalarFloatingType(Dest->getType()) &&
2481 typeWidthInBytes(Dest->getType()))); 2484 typeWidthInBytes(SrcVar->getType()) ==
2485 typeWidthInBytes(Dest->getType())));
2486 assert(Dest->hasReg());
2487 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg =
2488 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum());
2489 if (SrcVar->hasReg()) {
2490 Asm->movd(
2491 SrcVar->getType(), DestReg,
2492 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()));
2493 } else {
2494 typename InstX86Base<Machine>::Traits::Address StackAddr(
2495 Target->stackVarToAsmOperand(SrcVar));
2496 Asm->movd(SrcVar->getType(), DestReg, StackAddr);
2497 }
2498 } else {
2499 assert(isVectorType(SrcVar->getType()) ||
2500 (isScalarFloatingType(SrcVar->getType()) &&
2501 typeWidthInBytes(SrcVar->getType()) ==
2502 typeWidthInBytes(Dest->getType())));
2503 assert(SrcVar->hasReg());
2504 assert(Dest->getType() == IceType_i32 ||
2505 (InstX86Base<Machine>::Traits::Is64Bit &&
2506 Dest->getType() == IceType_i64));
2507 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
2508 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
2509 if (Dest->hasReg()) {
2510 Asm->movd(Dest->getType(), InstX86Base<Machine>::Traits::getEncodedGPR(
2511 Dest->getRegNum()),
2512 SrcReg);
2513 } else {
2514 typename InstX86Base<Machine>::Traits::Address StackAddr(
2515 Target->stackVarToAsmOperand(Dest));
2516 Asm->movd(Dest->getType(), StackAddr, SrcReg);
2517 }
2518 }
2519 } else {
2482 assert(Dest->hasReg()); 2520 assert(Dest->hasReg());
2483 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = 2521 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg =
2484 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); 2522 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum());
2485 if (SrcVar->hasReg()) { 2523 auto *Mem =
2486 Asm->movd( 2524 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2487 SrcVar->getType(), DestReg, 2525 this->getSrc(0));
2488 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); 2526 Asm->movd(Mem->getType(), DestReg, Mem->toAsmAddress(Asm, Target));
2489 } else {
2490 typename InstX86Base<Machine>::Traits::Address StackAddr(
2491 Target->stackVarToAsmOperand(SrcVar));
2492 Asm->movd(SrcVar->getType(), DestReg, StackAddr);
2493 }
2494 } else {
2495 assert(isVectorType(SrcVar->getType()) ||
2496 (isScalarFloatingType(SrcVar->getType()) &&
2497 typeWidthInBytes(SrcVar->getType()) ==
2498 typeWidthInBytes(Dest->getType())));
2499 assert(SrcVar->hasReg());
2500 assert(Dest->getType() == IceType_i32 ||
2501 (InstX86Base<Machine>::Traits::Is64Bit &&
2502 Dest->getType() == IceType_i64));
2503 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
2504 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
2505 if (Dest->hasReg()) {
2506 Asm->movd(Dest->getType(),
2507 InstX86Base<Machine>::Traits::getEncodedGPR(Dest->getRegNum()),
2508 SrcReg);
2509 } else {
2510 typename InstX86Base<Machine>::Traits::Address StackAddr(
2511 Target->stackVarToAsmOperand(Dest));
2512 Asm->movd(Dest->getType(), StackAddr, SrcReg);
2513 }
2514 } 2527 }
2515 } 2528 }
2516 2529
2517 template <class Machine> 2530 template <class Machine>
2518 void InstX86Movp<Machine>::emit(const Cfg *Func) const { 2531 void InstX86Movp<Machine>::emit(const Cfg *Func) const {
2519 if (!BuildDefs::dump()) 2532 if (!BuildDefs::dump())
2520 return; 2533 return;
2521 // TODO(wala,stichnot): movups works with all vector operands, but there 2534 // TODO(wala,stichnot): movups works with all vector operands, but there
2522 // exist other instructions (movaps, movdqa, movdqu) that may perform better, 2535 // exist other instructions (movaps, movdqa, movdqu) that may perform better,
2523 // depending on the data type and alignment of the operands. 2536 // depending on the data type and alignment of the operands.
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
3311 return; 3324 return;
3312 Ostream &Str = Func->getContext()->getStrDump(); 3325 Ostream &Str = Func->getContext()->getStrDump();
3313 Str << "IACA_END"; 3326 Str << "IACA_END";
3314 } 3327 }
3315 3328
3316 } // end of namespace X86Internal 3329 } // end of namespace X86Internal
3317 3330
3318 } // end of namespace Ice 3331 } // end of namespace Ice
3319 3332
3320 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H 3333 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H
OLDNEW
« src/IceAssemblerX86Base.h ('K') | « src/IceInstX86Base.h ('k') | src/IceRegAlloc.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698