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; |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |