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

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: Beautifies the assembler. 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;
Jim Stichnoth 2015/12/20 19:27:37 It seems odd to capitalize AX here. Also, don't y
John 2015/12/21 13:41:31 that's x86 nomenclature for a register than could
202 InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); 202 assert(InstX86Base<Machine>::Traits::getEncodedGPR(Eax->getRegNum()) ==
203 Encoded_rAX);
203 this->addSource(DestOrAddr); 204 this->addSource(DestOrAddr);
204 this->addSource(Eax); 205 this->addSource(Eax);
205 this->addSource(Desired); 206 this->addSource(Desired);
206 } 207 }
207 208
208 template <class Machine> 209 template <class Machine>
209 InstX86Cmpxchg8b<Machine>::InstX86Cmpxchg8b( 210 InstX86Cmpxchg8b<Machine>::InstX86Cmpxchg8b(
210 Cfg *Func, typename InstX86Base<Machine>::Traits::X86OperandMem *Addr, 211 Cfg *Func, typename InstX86Base<Machine>::Traits::X86OperandMem *Addr,
211 Variable *Edx, Variable *Eax, Variable *Ecx, Variable *Ebx, bool Locked) 212 Variable *Edx, Variable *Eax, Variable *Ecx, Variable *Ebx, bool Locked)
212 : InstX86BaseLockable<Machine>(Func, InstX86Base<Machine>::Cmpxchg, 5, 213 : 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); 1503 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_ax);
1503 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_dx); 1504 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_dx);
1504 Asm->cwd(); 1505 Asm->cwd();
1505 break; 1506 break;
1506 case IceType_i32: 1507 case IceType_i32:
1507 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_eax); 1508 assert(SrcReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_eax);
1508 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); 1509 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx);
1509 Asm->cdq(); 1510 Asm->cdq();
1510 break; 1511 break;
1511 case IceType_i64: 1512 case IceType_i64:
1512 assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx); 1513 // assert(DestReg == InstX86Base<Machine>::Traits::RegisterSet::Reg_edx);
Jim Stichnoth 2015/12/20 19:27:37 There should be *some* assert here, right?
John 2015/12/21 13:41:31 Yes and no. These asserts should be in the constru
1513 Asm->cqo(); 1514 Asm->cqo();
1514 break; 1515 break;
1515 } 1516 }
1516 } 1517 }
1517 1518
1518 template <class Machine> void InstX86Mul<Machine>::emit(const Cfg *Func) const { 1519 template <class Machine> void InstX86Mul<Machine>::emit(const Cfg *Func) const {
1519 if (!BuildDefs::dump()) 1520 if (!BuildDefs::dump())
1520 return; 1521 return;
1521 Ostream &Str = Func->getContext()->getStrEmit(); 1522 Ostream &Str = Func->getContext()->getStrEmit();
1522 assert(this->getSrcSize() == 2); 1523 assert(this->getSrcSize() == 2);
(...skipping 938 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 return; 2462 return;
2462 } 2463 }
2463 } 2464 }
2464 2465
2465 template <class Machine> 2466 template <class Machine>
2466 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const { 2467 void InstX86Movd<Machine>::emitIAS(const Cfg *Func) const {
2467 typename InstX86Base<Machine>::Traits::Assembler *Asm = 2468 typename InstX86Base<Machine>::Traits::Assembler *Asm =
2468 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>(); 2469 Func->getAssembler<typename InstX86Base<Machine>::Traits::Assembler>();
2469 assert(this->getSrcSize() == 1); 2470 assert(this->getSrcSize() == 1);
2470 const Variable *Dest = this->getDest(); 2471 const Variable *Dest = this->getDest();
2471 const auto *SrcVar = llvm::cast<Variable>(this->getSrc(0));
2472 auto *Target = InstX86Base<Machine>::getTarget(Func); 2472 auto *Target = InstX86Base<Machine>::getTarget(Func);
2473 // For insert/extract element (one of Src/Dest is an Xmm vector and the other 2473 // For insert/extract element (one of Src/Dest is an Xmm vector and the other
2474 // is an int type). 2474 // is an int type).
2475 if (SrcVar->getType() == IceType_i32 || 2475 if (const auto *SrcVar = llvm::dyn_cast<Variable>(this->getSrc(0))) {
2476 (InstX86Base<Machine>::Traits::Is64Bit && 2476 if (SrcVar->getType() == IceType_i32 ||
2477 SrcVar->getType() == IceType_i64)) { 2477 (InstX86Base<Machine>::Traits::Is64Bit &&
2478 assert(isVectorType(Dest->getType()) || 2478 SrcVar->getType() == IceType_i64)) {
2479 (isScalarFloatingType(Dest->getType()) && 2479 assert(isVectorType(Dest->getType()) ||
2480 typeWidthInBytes(SrcVar->getType()) == 2480 (isScalarFloatingType(Dest->getType()) &&
2481 typeWidthInBytes(Dest->getType()))); 2481 typeWidthInBytes(SrcVar->getType()) ==
2482 typeWidthInBytes(Dest->getType())));
2483 assert(Dest->hasReg());
2484 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg =
2485 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum());
2486 if (SrcVar->hasReg()) {
2487 Asm->movd(
2488 SrcVar->getType(), DestReg,
2489 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum()));
2490 } else {
2491 typename InstX86Base<Machine>::Traits::Address StackAddr(
2492 Target->stackVarToAsmOperand(SrcVar));
2493 Asm->movd(SrcVar->getType(), DestReg, StackAddr);
2494 }
2495 } else {
2496 assert(isVectorType(SrcVar->getType()) ||
2497 (isScalarFloatingType(SrcVar->getType()) &&
2498 typeWidthInBytes(SrcVar->getType()) ==
2499 typeWidthInBytes(Dest->getType())));
2500 assert(SrcVar->hasReg());
2501 assert(Dest->getType() == IceType_i32 ||
2502 (InstX86Base<Machine>::Traits::Is64Bit &&
2503 Dest->getType() == IceType_i64));
2504 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister SrcReg =
2505 InstX86Base<Machine>::Traits::getEncodedXmm(SrcVar->getRegNum());
2506 if (Dest->hasReg()) {
2507 Asm->movd(Dest->getType(), InstX86Base<Machine>::Traits::getEncodedGPR(
2508 Dest->getRegNum()),
2509 SrcReg);
2510 } else {
2511 typename InstX86Base<Machine>::Traits::Address StackAddr(
2512 Target->stackVarToAsmOperand(Dest));
2513 Asm->movd(Dest->getType(), StackAddr, SrcReg);
2514 }
2515 }
2516 } else {
2482 assert(Dest->hasReg()); 2517 assert(Dest->hasReg());
2483 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg = 2518 typename InstX86Base<Machine>::Traits::RegisterSet::XmmRegister DestReg =
2484 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum()); 2519 InstX86Base<Machine>::Traits::getEncodedXmm(Dest->getRegNum());
2485 if (SrcVar->hasReg()) { 2520 auto *Mem =
2486 Asm->movd( 2521 llvm::cast<typename InstX86Base<Machine>::Traits::X86OperandMem>(
2487 SrcVar->getType(), DestReg, 2522 this->getSrc(0));
2488 InstX86Base<Machine>::Traits::getEncodedGPR(SrcVar->getRegNum())); 2523 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 } 2524 }
2515 } 2525 }
2516 2526
2517 template <class Machine> 2527 template <class Machine>
2518 void InstX86Movp<Machine>::emit(const Cfg *Func) const { 2528 void InstX86Movp<Machine>::emit(const Cfg *Func) const {
2519 if (!BuildDefs::dump()) 2529 if (!BuildDefs::dump())
2520 return; 2530 return;
2521 // TODO(wala,stichnot): movups works with all vector operands, but there 2531 // TODO(wala,stichnot): movups works with all vector operands, but there
2522 // exist other instructions (movaps, movdqa, movdqu) that may perform better, 2532 // exist other instructions (movaps, movdqa, movdqu) that may perform better,
2523 // depending on the data type and alignment of the operands. 2533 // depending on the data type and alignment of the operands.
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
3311 return; 3321 return;
3312 Ostream &Str = Func->getContext()->getStrDump(); 3322 Ostream &Str = Func->getContext()->getStrDump();
3313 Str << "IACA_END"; 3323 Str << "IACA_END";
3314 } 3324 }
3315 3325
3316 } // end of namespace X86Internal 3326 } // end of namespace X86Internal
3317 3327
3318 } // end of namespace Ice 3328 } // end of namespace Ice
3319 3329
3320 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H 3330 #endif // SUBZERO_SRC_ICEINSTX86BASEIMPL_H
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698