Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// | 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// |
| 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 // This file implements the TargetLoweringX8632 class, which | 10 // This file implements the TargetLoweringX8632 class, which |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 121 } | 121 } |
| 122 | 122 |
| 123 // The maximum number of arguments to pass in XMM registers | 123 // The maximum number of arguments to pass in XMM registers |
| 124 const uint32_t X86_MAX_XMM_ARGS = 4; | 124 const uint32_t X86_MAX_XMM_ARGS = 4; |
| 125 // The number of bits in a byte | 125 // The number of bits in a byte |
| 126 const uint32_t X86_CHAR_BIT = 8; | 126 const uint32_t X86_CHAR_BIT = 8; |
| 127 // Stack alignment | 127 // Stack alignment |
| 128 const uint32_t X86_STACK_ALIGNMENT_BYTES = 16; | 128 const uint32_t X86_STACK_ALIGNMENT_BYTES = 16; |
| 129 // Size of the return address on the stack | 129 // Size of the return address on the stack |
| 130 const uint32_t X86_RET_IP_SIZE_BYTES = 4; | 130 const uint32_t X86_RET_IP_SIZE_BYTES = 4; |
| 131 // The maximum supported length of a NOP instruction (all smaller | |
| 132 // lengths are also supported) | |
| 133 const uint32_t X86_MAX_NOP_LEN = 9; | |
|
jvoung (off chromium)
2014/08/14 15:17:17
Does it actually help to add nops of up to 9 bytes
wala
2014/08/14 23:29:50
Thanks for the link.
That paper makes it clear th
| |
| 131 | 134 |
| 132 // Value is a size in bytes. Return Value adjusted to the next highest | 135 // Value is a size in bytes. Return Value adjusted to the next highest |
| 133 // multiple of the stack alignment. | 136 // multiple of the stack alignment. |
| 134 uint32_t applyStackAlignment(uint32_t Value) { | 137 uint32_t applyStackAlignment(uint32_t Value) { |
| 135 // power of 2 | 138 // power of 2 |
| 136 assert((X86_STACK_ALIGNMENT_BYTES & (X86_STACK_ALIGNMENT_BYTES - 1)) == 0); | 139 assert((X86_STACK_ALIGNMENT_BYTES & (X86_STACK_ALIGNMENT_BYTES - 1)) == 0); |
| 137 return (Value + X86_STACK_ALIGNMENT_BYTES - 1) & -X86_STACK_ALIGNMENT_BYTES; | 140 return (Value + X86_STACK_ALIGNMENT_BYTES - 1) & -X86_STACK_ALIGNMENT_BYTES; |
| 138 } | 141 } |
| 139 | 142 |
| 140 // Instruction set options | 143 // Instruction set options |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 385 T_regAlloc.printElapsedUs(Context, "regAlloc()"); | 388 T_regAlloc.printElapsedUs(Context, "regAlloc()"); |
| 386 Func->dump("After linear scan regalloc"); | 389 Func->dump("After linear scan regalloc"); |
| 387 | 390 |
| 388 // Stack frame mapping. | 391 // Stack frame mapping. |
| 389 Timer T_genFrame; | 392 Timer T_genFrame; |
| 390 Func->genFrame(); | 393 Func->genFrame(); |
| 391 if (Func->hasError()) | 394 if (Func->hasError()) |
| 392 return; | 395 return; |
| 393 T_genFrame.printElapsedUs(Context, "genFrame()"); | 396 T_genFrame.printElapsedUs(Context, "genFrame()"); |
| 394 Func->dump("After stack frame mapping"); | 397 Func->dump("After stack frame mapping"); |
| 398 | |
| 399 // Nop insertion | |
| 400 if (shouldDoNopInsertion()) { | |
| 401 Func->doNopInsertion(); | |
| 402 } | |
| 395 } | 403 } |
| 396 | 404 |
| 397 void TargetX8632::translateOm1() { | 405 void TargetX8632::translateOm1() { |
| 398 GlobalContext *Context = Func->getContext(); | 406 GlobalContext *Context = Func->getContext(); |
| 399 Timer T_placePhiLoads; | 407 Timer T_placePhiLoads; |
| 400 Func->placePhiLoads(); | 408 Func->placePhiLoads(); |
| 401 if (Func->hasError()) | 409 if (Func->hasError()) |
| 402 return; | 410 return; |
| 403 T_placePhiLoads.printElapsedUs(Context, "placePhiLoads()"); | 411 T_placePhiLoads.printElapsedUs(Context, "placePhiLoads()"); |
| 404 Timer T_placePhiStores; | 412 Timer T_placePhiStores; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 423 return; | 431 return; |
| 424 T_genCode.printElapsedUs(Context, "genCode()"); | 432 T_genCode.printElapsedUs(Context, "genCode()"); |
| 425 Func->dump("After initial x8632 codegen"); | 433 Func->dump("After initial x8632 codegen"); |
| 426 | 434 |
| 427 Timer T_genFrame; | 435 Timer T_genFrame; |
| 428 Func->genFrame(); | 436 Func->genFrame(); |
| 429 if (Func->hasError()) | 437 if (Func->hasError()) |
| 430 return; | 438 return; |
| 431 T_genFrame.printElapsedUs(Context, "genFrame()"); | 439 T_genFrame.printElapsedUs(Context, "genFrame()"); |
| 432 Func->dump("After stack frame mapping"); | 440 Func->dump("After stack frame mapping"); |
| 441 | |
| 442 // Nop insertion | |
| 443 if (shouldDoNopInsertion()) { | |
| 444 Func->doNopInsertion(); | |
| 445 } | |
| 433 } | 446 } |
| 434 | 447 |
| 435 IceString TargetX8632::RegNames[] = { | 448 IceString TargetX8632::RegNames[] = { |
| 436 #define X(val, init, name, name16, name8, scratch, preserved, stackptr, \ | 449 #define X(val, init, name, name16, name8, scratch, preserved, stackptr, \ |
| 437 frameptr, isI8, isInt, isFP) \ | 450 frameptr, isI8, isInt, isFP) \ |
| 438 name, | 451 name, |
| 439 REGX8632_TABLE | 452 REGX8632_TABLE |
| 440 #undef X | 453 #undef X |
| 441 }; | 454 }; |
| 442 | 455 |
| (...skipping 3147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3590 computeAddressOpt(Base, Index, Shift, Offset); | 3603 computeAddressOpt(Base, Index, Shift, Offset); |
| 3591 if (Base && Addr != Base) { | 3604 if (Base && Addr != Base) { |
| 3592 Constant *OffsetOp = Ctx->getConstantInt(IceType_i32, Offset); | 3605 Constant *OffsetOp = Ctx->getConstantInt(IceType_i32, Offset); |
| 3593 Addr = OperandX8632Mem::create(Func, Dest->getType(), Base, OffsetOp, Index, | 3606 Addr = OperandX8632Mem::create(Func, Dest->getType(), Base, OffsetOp, Index, |
| 3594 Shift, SegmentReg); | 3607 Shift, SegmentReg); |
| 3595 Inst->setDeleted(); | 3608 Inst->setDeleted(); |
| 3596 Context.insert(InstLoad::create(Func, Dest, Addr)); | 3609 Context.insert(InstLoad::create(Func, Dest, Addr)); |
| 3597 } | 3610 } |
| 3598 } | 3611 } |
| 3599 | 3612 |
| 3613 void TargetX8632::randomlyInsertNop(float Probability) { | |
| 3614 RandomNumberGeneratorWrapper RNG = Ctx->getRNG(); | |
| 3615 if (RNG.getTrueWithProbability(Probability)) { | |
| 3616 _nop(1 + RNG.next(X86_MAX_NOP_LEN)); | |
| 3617 } | |
| 3618 } | |
| 3619 | |
| 3600 void TargetX8632::lowerPhi(const InstPhi * /*Inst*/) { | 3620 void TargetX8632::lowerPhi(const InstPhi * /*Inst*/) { |
| 3601 Func->setError("Phi found in regular instruction list"); | 3621 Func->setError("Phi found in regular instruction list"); |
| 3602 } | 3622 } |
| 3603 | 3623 |
| 3604 void TargetX8632::lowerRet(const InstRet *Inst) { | 3624 void TargetX8632::lowerRet(const InstRet *Inst) { |
| 3605 Variable *Reg = NULL; | 3625 Variable *Reg = NULL; |
| 3606 if (Inst->hasRetValue()) { | 3626 if (Inst->hasRetValue()) { |
| 3607 Operand *Src0 = legalize(Inst->getRetValue()); | 3627 Operand *Src0 = legalize(Inst->getRetValue()); |
| 3608 if (Src0->getType() == IceType_i64) { | 3628 if (Src0->getType() == IceType_i64) { |
| 3609 Variable *eax = legalizeToVar(loOperand(Src0), false, Reg_eax); | 3629 Variable *eax = legalizeToVar(loOperand(Src0), false, Reg_eax); |
| (...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4249 for (SizeT i = 0; i < Size; ++i) { | 4269 for (SizeT i = 0; i < Size; ++i) { |
| 4250 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; | 4270 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; |
| 4251 } | 4271 } |
| 4252 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; | 4272 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; |
| 4253 } | 4273 } |
| 4254 Str << "\t" << (IsInternal ? ".local" : ".global") << "\t" << MangledName | 4274 Str << "\t" << (IsInternal ? ".local" : ".global") << "\t" << MangledName |
| 4255 << "\n"; | 4275 << "\n"; |
| 4256 } | 4276 } |
| 4257 | 4277 |
| 4258 } // end of namespace Ice | 4278 } // end of namespace Ice |
| OLD | NEW |