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

Side by Side Diff: src/IceTargetLoweringX86BaseImpl.h

Issue 1631383002: Subzero. X8664. Fixes various small bugs. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments. Created 4 years, 10 months 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
« no previous file with comments | « src/IceInstX86BaseImpl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- 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 2470 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 // is passed. 2481 // is passed.
2482 for (SizeT i = 0, NumArgs = Instr->getNumArgs(); i < NumArgs; ++i) { 2482 for (SizeT i = 0, NumArgs = Instr->getNumArgs(); i < NumArgs; ++i) {
2483 Operand *Arg = Instr->getArg(i); 2483 Operand *Arg = Instr->getArg(i);
2484 const Type Ty = Arg->getType(); 2484 const Type Ty = Arg->getType();
2485 // The PNaCl ABI requires the width of arguments to be at least 32 bits. 2485 // The PNaCl ABI requires the width of arguments to be at least 32 bits.
2486 assert(typeWidthInBytes(Ty) >= 4); 2486 assert(typeWidthInBytes(Ty) >= 4);
2487 if (isVectorType(Ty) && (Traits::getRegisterForXmmArgNum(XmmArgs.size()) != 2487 if (isVectorType(Ty) && (Traits::getRegisterForXmmArgNum(XmmArgs.size()) !=
2488 Variable::NoRegister)) { 2488 Variable::NoRegister)) {
2489 XmmArgs.push_back(Arg); 2489 XmmArgs.push_back(Arg);
2490 } else if (isScalarFloatingType(Ty) && Traits::X86_PASS_SCALAR_FP_IN_XMM && 2490 } else if (isScalarFloatingType(Ty) && Traits::X86_PASS_SCALAR_FP_IN_XMM &&
2491 (Traits::getRegisterForXmmArgNum(0) != Variable::NoRegister)) { 2491 (Traits::getRegisterForXmmArgNum(XmmArgs.size()) !=
2492 Variable::NoRegister)) {
2492 XmmArgs.push_back(Arg); 2493 XmmArgs.push_back(Arg);
2493 } else if (isScalarIntegerType(Ty) && 2494 } else if (isScalarIntegerType(Ty) &&
2494 (Traits::getRegisterForGprArgNum(Ty, GprArgs.size()) != 2495 (Traits::getRegisterForGprArgNum(Ty, GprArgs.size()) !=
2495 Variable::NoRegister)) { 2496 Variable::NoRegister)) {
2496 GprArgs.emplace_back(Ty, Arg); 2497 GprArgs.emplace_back(Ty, Arg);
2497 } else { 2498 } else {
2498 // Place on stack. 2499 // Place on stack.
2499 StackArgs.push_back(Arg); 2500 StackArgs.push_back(Arg);
2500 if (isVectorType(Arg->getType())) { 2501 if (isVectorType(Arg->getType())) {
2501 ParameterAreaSizeBytes = 2502 ParameterAreaSizeBytes =
(...skipping 2091 matching lines...) Expand 10 before | Expand all | Expand 10 after
4593 void TargetX86Base<TraitsType>::lowerCountZeros(bool Cttz, Type Ty, 4594 void TargetX86Base<TraitsType>::lowerCountZeros(bool Cttz, Type Ty,
4594 Variable *Dest, 4595 Variable *Dest,
4595 Operand *FirstVal, 4596 Operand *FirstVal,
4596 Operand *SecondVal) { 4597 Operand *SecondVal) {
4597 // TODO(jvoung): Determine if the user CPU supports LZCNT (BMI). 4598 // TODO(jvoung): Determine if the user CPU supports LZCNT (BMI).
4598 // Then the instructions will handle the Val == 0 case much more simply 4599 // Then the instructions will handle the Val == 0 case much more simply
4599 // and won't require conversion from bit position to number of zeros. 4600 // and won't require conversion from bit position to number of zeros.
4600 // 4601 //
4601 // Otherwise: 4602 // Otherwise:
4602 // bsr IF_NOT_ZERO, Val 4603 // bsr IF_NOT_ZERO, Val
4603 // mov T_DEST, 63 4604 // mov T_DEST, ((Ty == i32) ? 63 : 127)
4604 // cmovne T_DEST, IF_NOT_ZERO 4605 // cmovne T_DEST, IF_NOT_ZERO
4605 // xor T_DEST, 31 4606 // xor T_DEST, ((Ty == i32) ? 31 : 63)
4606 // mov DEST, T_DEST 4607 // mov DEST, T_DEST
4607 // 4608 //
4608 // NOTE: T_DEST must be a register because cmov requires its dest to be a 4609 // NOTE: T_DEST must be a register because cmov requires its dest to be a
4609 // register. Also, bsf and bsr require their dest to be a register. 4610 // register. Also, bsf and bsr require their dest to be a register.
4610 // 4611 //
4611 // The xor DEST, 31 converts a bit position to # of leading zeroes. 4612 // The xor DEST, C(31|63) converts a bit position to # of leading zeroes.
4612 // E.g., for 000... 00001100, bsr will say that the most significant bit 4613 // E.g., for 000... 00001100, bsr will say that the most significant bit
4613 // set is at position 3, while the number of leading zeros is 28. Xor is 4614 // set is at position 3, while the number of leading zeros is 28. Xor is
4614 // like (31 - N) for N <= 31, and converts 63 to 32 (for the all-zeros case). 4615 // like (M - N) for N <= M, and converts 63 to 32, and 127 to 64 (for the
4616 // all-zeros case).
4615 // 4617 //
4616 // Similar for 64-bit, but start w/ speculating that the upper 32 bits 4618 // X8632 only: Similar for 64-bit, but start w/ speculating that the upper 32
4617 // are all zero, and compute the result for that case (checking the lower 4619 // bits are all zero, and compute the result for that case (checking the
4618 // 32 bits). Then actually compute the result for the upper bits and 4620 // lower 32 bits). Then actually compute the result for the upper bits and
4619 // cmov in the result from the lower computation if the earlier speculation 4621 // cmov in the result from the lower computation if the earlier speculation
4620 // was correct. 4622 // was correct.
4621 // 4623 //
4622 // Cttz, is similar, but uses bsf instead, and doesn't require the xor 4624 // Cttz, is similar, but uses bsf instead, and doesn't require the xor
4623 // bit position conversion, and the speculation is reversed. 4625 // bit position conversion, and the speculation is reversed.
4626
4627 // TODO(jpp): refactor this method.
4624 assert(Ty == IceType_i32 || Ty == IceType_i64); 4628 assert(Ty == IceType_i32 || Ty == IceType_i64);
4625 const Type DestTy = Traits::Is64Bit ? Dest->getType() : IceType_i32; 4629 const Type DestTy = Traits::Is64Bit ? Dest->getType() : IceType_i32;
4626 Variable *T = makeReg(DestTy); 4630 Variable *T = makeReg(DestTy);
4627 Operand *FirstValRM = legalize(FirstVal, Legal_Mem | Legal_Reg); 4631 Operand *FirstValRM = legalize(FirstVal, Legal_Mem | Legal_Reg);
4628 if (Cttz) { 4632 if (Cttz) {
4629 _bsf(T, FirstValRM); 4633 _bsf(T, FirstValRM);
4630 } else { 4634 } else {
4631 _bsr(T, FirstValRM); 4635 _bsr(T, FirstValRM);
4632 } 4636 }
4633 Variable *T_Dest = makeReg(DestTy); 4637 Variable *T_Dest = makeReg(DestTy);
4634 Constant *_31 = Ctx->getConstantInt32(31); 4638 Constant *_31 = Ctx->getConstantInt32(31);
4635 Constant *_32 = Ctx->getConstantInt(DestTy, 32); 4639 Constant *_32 = Ctx->getConstantInt(DestTy, 32);
4640 Constant *_63 = Ctx->getConstantInt(DestTy, 63);
4641 Constant *_64 = Ctx->getConstantInt(DestTy, 64);
4636 if (Cttz) { 4642 if (Cttz) {
4637 _mov(T_Dest, _32); 4643 if (DestTy == IceType_i64) {
4644 _mov(T_Dest, _64);
4645 } else {
4646 _mov(T_Dest, _32);
4647 }
4638 } else { 4648 } else {
4639 Constant *_63 = Ctx->getConstantInt(DestTy, 63); 4649 Constant *_127 = Ctx->getConstantInt(DestTy, 127);
4640 _mov(T_Dest, _63); 4650 if (DestTy == IceType_i64) {
4651 _mov(T_Dest, _127);
4652 } else {
4653 _mov(T_Dest, _63);
4654 }
4641 } 4655 }
4642 _cmov(T_Dest, T, Traits::Cond::Br_ne); 4656 _cmov(T_Dest, T, Traits::Cond::Br_ne);
4643 if (!Cttz) { 4657 if (!Cttz) {
4644 _xor(T_Dest, _31); 4658 if (DestTy == IceType_i64) {
4659 // Even though there's a _63 available at this point, that constant might
4660 // not be an i32, which will cause the xor emission to fail.
4661 Constant *_63 = Ctx->getConstantInt32(63);
4662 _xor(T_Dest, _63);
4663 } else {
4664 _xor(T_Dest, _31);
4665 }
4645 } 4666 }
4646 if (Traits::Is64Bit || Ty == IceType_i32) { 4667 if (Traits::Is64Bit || Ty == IceType_i32) {
4647 _mov(Dest, T_Dest); 4668 _mov(Dest, T_Dest);
4648 return; 4669 return;
4649 } 4670 }
4650 _add(T_Dest, _32); 4671 _add(T_Dest, _32);
4651 auto *DestLo = llvm::cast<Variable>(loOperand(Dest)); 4672 auto *DestLo = llvm::cast<Variable>(loOperand(Dest));
4652 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest)); 4673 auto *DestHi = llvm::cast<Variable>(hiOperand(Dest));
4653 // Will be using "test" on this, so we need a registerized variable. 4674 // Will be using "test" on this, so we need a registerized variable.
4654 Variable *SecondVar = legalizeToReg(SecondVal); 4675 Variable *SecondVar = legalizeToReg(SecondVal);
(...skipping 2779 matching lines...) Expand 10 before | Expand all | Expand 10 after
7434 emitGlobal(*Var, SectionSuffix); 7455 emitGlobal(*Var, SectionSuffix);
7435 } 7456 }
7436 } 7457 }
7437 } break; 7458 } break;
7438 } 7459 }
7439 } 7460 }
7440 } // end of namespace X86NAMESPACE 7461 } // end of namespace X86NAMESPACE
7441 } // end of namespace Ice 7462 } // end of namespace Ice
7442 7463
7443 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H 7464 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H
OLDNEW
« no previous file with comments | « src/IceInstX86BaseImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698