Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |