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 |