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

Side by Side Diff: src/IceTargetLoweringX86BaseImpl.h

Issue 1438773004: Subzero. ARM32. Improve constant lowering. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years, 1 month 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/IceTargetLoweringARM32.cpp ('k') | src/IceUtils.h » ('j') | 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 11 matching lines...) Expand all
22 #include "IceDefs.h" 22 #include "IceDefs.h"
23 #include "IceELFObjectWriter.h" 23 #include "IceELFObjectWriter.h"
24 #include "IceGlobalInits.h" 24 #include "IceGlobalInits.h"
25 #include "IceInstVarIter.h" 25 #include "IceInstVarIter.h"
26 #include "IceLiveness.h" 26 #include "IceLiveness.h"
27 #include "IceOperand.h" 27 #include "IceOperand.h"
28 #include "IcePhiLoweringImpl.h" 28 #include "IcePhiLoweringImpl.h"
29 #include "IceUtils.h" 29 #include "IceUtils.h"
30 #include "llvm/Support/MathExtras.h" 30 #include "llvm/Support/MathExtras.h"
31 31
32 #include <cmath> // signbit()
33 #include <stack> 32 #include <stack>
34 33
35 namespace Ice { 34 namespace Ice {
36 namespace X86Internal { 35 namespace X86Internal {
37 36
38 /// A helper class to ease the settings of RandomizationPoolingPause to disable 37 /// A helper class to ease the settings of RandomizationPoolingPause to disable
39 /// constant blinding or pooling for some translation phases. 38 /// constant blinding or pooling for some translation phases.
40 class BoolFlagSaver { 39 class BoolFlagSaver {
41 BoolFlagSaver() = delete; 40 BoolFlagSaver() = delete;
42 BoolFlagSaver(const BoolFlagSaver &) = delete; 41 BoolFlagSaver(const BoolFlagSaver &) = delete;
(...skipping 5456 matching lines...) Expand 10 before | Expand all | Expand 10 after
5499 Type Ty = Src->getType(); 5498 Type Ty = Src->getType();
5500 Variable *Reg = makeReg(Ty, RegNum); 5499 Variable *Reg = makeReg(Ty, RegNum);
5501 if (isVectorType(Ty)) { 5500 if (isVectorType(Ty)) {
5502 _movp(Reg, Src); 5501 _movp(Reg, Src);
5503 } else { 5502 } else {
5504 _mov(Reg, Src); 5503 _mov(Reg, Src);
5505 } 5504 }
5506 return Reg; 5505 return Reg;
5507 } 5506 }
5508 5507
5509 namespace {
5510
5511 template <typename T> bool isPositiveZero(T Val) {
5512 static_assert(std::is_floating_point<T>::value,
5513 "Input type must be floating point");
5514 return Val == 0 && !std::signbit(Val);
5515 }
5516
5517 } // end of anonymous namespace
5518
5519 template <class Machine> 5508 template <class Machine>
5520 Operand *TargetX86Base<Machine>::legalize(Operand *From, LegalMask Allowed, 5509 Operand *TargetX86Base<Machine>::legalize(Operand *From, LegalMask Allowed,
5521 int32_t RegNum) { 5510 int32_t RegNum) {
5522 Type Ty = From->getType(); 5511 Type Ty = From->getType();
5523 // Assert that a physical register is allowed. To date, all calls to 5512 // Assert that a physical register is allowed. To date, all calls to
5524 // legalize() allow a physical register. If a physical register needs to be 5513 // legalize() allow a physical register. If a physical register needs to be
5525 // explicitly disallowed, then new code will need to be written to force a 5514 // explicitly disallowed, then new code will need to be written to force a
5526 // spill. 5515 // spill.
5527 assert(Allowed & Legal_Reg); 5516 assert(Allowed & Legal_Reg);
5528 // If we're asking for a specific physical register, make sure we're not 5517 // If we're asking for a specific physical register, make sure we're not
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
5602 Operand *NewConst = randomizeOrPoolImmediate(C, RegNum); 5591 Operand *NewConst = randomizeOrPoolImmediate(C, RegNum);
5603 if (NewConst != Const) { 5592 if (NewConst != Const) {
5604 return NewConst; 5593 return NewConst;
5605 } 5594 }
5606 } 5595 }
5607 5596
5608 // Convert a scalar floating point constant into an explicit memory 5597 // Convert a scalar floating point constant into an explicit memory
5609 // operand. 5598 // operand.
5610 if (isScalarFloatingType(Ty)) { 5599 if (isScalarFloatingType(Ty)) {
5611 if (auto *ConstFloat = llvm::dyn_cast<ConstantFloat>(Const)) { 5600 if (auto *ConstFloat = llvm::dyn_cast<ConstantFloat>(Const)) {
5612 if (isPositiveZero(ConstFloat->getValue())) 5601 if (Utils::isPositiveZero(ConstFloat->getValue()))
5613 return makeZeroedRegister(Ty, RegNum); 5602 return makeZeroedRegister(Ty, RegNum);
5614 } else if (auto *ConstDouble = llvm::dyn_cast<ConstantDouble>(Const)) { 5603 } else if (auto *ConstDouble = llvm::dyn_cast<ConstantDouble>(Const)) {
5615 if (isPositiveZero(ConstDouble->getValue())) 5604 if (Utils::isPositiveZero(ConstDouble->getValue()))
5616 return makeZeroedRegister(Ty, RegNum); 5605 return makeZeroedRegister(Ty, RegNum);
5617 } 5606 }
5618 Variable *Base = nullptr; 5607 Variable *Base = nullptr;
5619 std::string Buffer; 5608 std::string Buffer;
5620 llvm::raw_string_ostream StrBuf(Buffer); 5609 llvm::raw_string_ostream StrBuf(Buffer);
5621 llvm::cast<Constant>(From)->emitPoolLabel(StrBuf, Ctx); 5610 llvm::cast<Constant>(From)->emitPoolLabel(StrBuf, Ctx);
5622 llvm::cast<Constant>(From)->setShouldBePooled(true); 5611 llvm::cast<Constant>(From)->setShouldBePooled(true);
5623 Constant *Offset = Ctx->getConstantSym(0, StrBuf.str(), true); 5612 Constant *Offset = Ctx->getConstantSym(0, StrBuf.str(), true);
5624 From = Traits::X86OperandMem::create(Func, Ty, Base, Offset); 5613 From = Traits::X86OperandMem::create(Func, Ty, Base, Offset);
5625 } 5614 }
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
6030 } 6019 }
6031 // the offset is not eligible for blinding or pooling, return the original 6020 // the offset is not eligible for blinding or pooling, return the original
6032 // mem operand 6021 // mem operand
6033 return MemOperand; 6022 return MemOperand;
6034 } 6023 }
6035 6024
6036 } // end of namespace X86Internal 6025 } // end of namespace X86Internal
6037 } // end of namespace Ice 6026 } // end of namespace Ice
6038 6027
6039 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H 6028 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H
OLDNEW
« no previous file with comments | « src/IceTargetLoweringARM32.cpp ('k') | src/IceUtils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698