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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1152703006: Subzero ARM: lowerLoad and lowerStore. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: typo in comments Created 5 years, 6 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/IceTargetLoweringARM32.h ('k') | src/IceTargetLoweringX8632.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/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 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 TargetLoweringARM32 class, which consists almost 10 // This file implements the TargetLoweringARM32 class, which consists almost
(...skipping 1610 matching lines...) Expand 10 before | Expand all | Expand 10 after
1621 case Intrinsics::Trap: 1621 case Intrinsics::Trap:
1622 UnimplementedError(Func->getContext()->getFlags()); 1622 UnimplementedError(Func->getContext()->getFlags());
1623 return; 1623 return;
1624 case Intrinsics::UnknownIntrinsic: 1624 case Intrinsics::UnknownIntrinsic:
1625 Func->setError("Should not be lowering UnknownIntrinsic"); 1625 Func->setError("Should not be lowering UnknownIntrinsic");
1626 return; 1626 return;
1627 } 1627 }
1628 return; 1628 return;
1629 } 1629 }
1630 1630
1631 void TargetARM32::lowerLoad(const InstLoad *Inst) { 1631 void TargetARM32::lowerLoad(const InstLoad *Load) {
1632 (void)Inst; 1632 // A Load instruction can be treated the same as an Assign
1633 UnimplementedError(Func->getContext()->getFlags()); 1633 // instruction, after the source operand is transformed into an
1634 // OperandARM32Mem operand.
1635 Type Ty = Load->getDest()->getType();
1636 Operand *Src0 = formMemoryOperand(Load->getSourceAddress(), Ty);
1637 Variable *DestLoad = Load->getDest();
1638
1639 // TODO(jvoung): handled folding opportunities. Sign and zero extension
1640 // can be folded into a load.
1641 InstAssign *Assign = InstAssign::create(Func, DestLoad, Src0);
1642 lowerAssign(Assign);
1634 } 1643 }
1635 1644
1636 void TargetARM32::doAddressOptLoad() { 1645 void TargetARM32::doAddressOptLoad() {
1637 UnimplementedError(Func->getContext()->getFlags()); 1646 UnimplementedError(Func->getContext()->getFlags());
1638 } 1647 }
1639 1648
1640 void TargetARM32::randomlyInsertNop(float Probability) { 1649 void TargetARM32::randomlyInsertNop(float Probability) {
1641 RandomNumberGeneratorWrapper RNG(Ctx->getRNG()); 1650 RandomNumberGeneratorWrapper RNG(Ctx->getRNG());
1642 if (RNG.getTrueWithProbability(Probability)) { 1651 if (RNG.getTrueWithProbability(Probability)) {
1643 UnimplementedError(Func->getContext()->getFlags()); 1652 UnimplementedError(Func->getContext()->getFlags());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1680 Variable *SP = Func->getTarget()->getPhysicalRegister(RegARM32::Reg_sp); 1689 Variable *SP = Func->getTarget()->getPhysicalRegister(RegARM32::Reg_sp);
1681 Context.insert(InstFakeUse::create(Func, SP)); 1690 Context.insert(InstFakeUse::create(Func, SP));
1682 } 1691 }
1683 1692
1684 void TargetARM32::lowerSelect(const InstSelect *Inst) { 1693 void TargetARM32::lowerSelect(const InstSelect *Inst) {
1685 (void)Inst; 1694 (void)Inst;
1686 UnimplementedError(Func->getContext()->getFlags()); 1695 UnimplementedError(Func->getContext()->getFlags());
1687 } 1696 }
1688 1697
1689 void TargetARM32::lowerStore(const InstStore *Inst) { 1698 void TargetARM32::lowerStore(const InstStore *Inst) {
1690 (void)Inst; 1699 Operand *Value = Inst->getData();
1691 UnimplementedError(Func->getContext()->getFlags()); 1700 Operand *Addr = Inst->getAddr();
1701 OperandARM32Mem *NewAddr = formMemoryOperand(Addr, Value->getType());
1702 Type Ty = NewAddr->getType();
1703
1704 if (Ty == IceType_i64) {
1705 Variable *ValueHi = legalizeToVar(hiOperand(Value));
1706 Variable *ValueLo = legalizeToVar(loOperand(Value));
1707 _str(ValueHi, llvm::cast<OperandARM32Mem>(hiOperand(NewAddr)));
1708 _str(ValueLo, llvm::cast<OperandARM32Mem>(loOperand(NewAddr)));
1709 } else if (isVectorType(Ty)) {
1710 UnimplementedError(Func->getContext()->getFlags());
1711 } else {
1712 Variable *ValueR = legalizeToVar(Value);
1713 _str(ValueR, NewAddr);
1714 }
1692 } 1715 }
1693 1716
1694 void TargetARM32::doAddressOptStore() { 1717 void TargetARM32::doAddressOptStore() {
1695 UnimplementedError(Func->getContext()->getFlags()); 1718 UnimplementedError(Func->getContext()->getFlags());
1696 } 1719 }
1697 1720
1698 void TargetARM32::lowerSwitch(const InstSwitch *Inst) { 1721 void TargetARM32::lowerSwitch(const InstSwitch *Inst) {
1699 (void)Inst; 1722 (void)Inst;
1700 UnimplementedError(Func->getContext()->getFlags()); 1723 UnimplementedError(Func->getContext()->getFlags());
1701 } 1724 }
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1884 llvm_unreachable("Unhandled operand kind in legalize()"); 1907 llvm_unreachable("Unhandled operand kind in legalize()");
1885 1908
1886 return From; 1909 return From;
1887 } 1910 }
1888 1911
1889 // Provide a trivial wrapper to legalize() for this common usage. 1912 // Provide a trivial wrapper to legalize() for this common usage.
1890 Variable *TargetARM32::legalizeToVar(Operand *From, int32_t RegNum) { 1913 Variable *TargetARM32::legalizeToVar(Operand *From, int32_t RegNum) {
1891 return llvm::cast<Variable>(legalize(From, Legal_Reg, RegNum)); 1914 return llvm::cast<Variable>(legalize(From, Legal_Reg, RegNum));
1892 } 1915 }
1893 1916
1917 OperandARM32Mem *TargetARM32::formMemoryOperand(Operand *Operand, Type Ty) {
1918 OperandARM32Mem *Mem = llvm::dyn_cast<OperandARM32Mem>(Operand);
1919 // It may be the case that address mode optimization already creates
1920 // an OperandARM32Mem, so in that case it wouldn't need another level
1921 // of transformation.
1922 if (Mem) {
1923 return llvm::cast<OperandARM32Mem>(legalize(Mem));
1924 }
1925 // If we didn't do address mode optimization, then we only
1926 // have a base/offset to work with. ARM always requires a base
1927 // register, so just use that to hold the operand.
1928 Variable *Base = legalizeToVar(Operand);
1929 return OperandARM32Mem::create(
1930 Func, Ty, Base,
1931 llvm::cast<ConstantInteger32>(Ctx->getConstantZero(IceType_i32)));
1932 }
1933
1894 Variable *TargetARM32::makeReg(Type Type, int32_t RegNum) { 1934 Variable *TargetARM32::makeReg(Type Type, int32_t RegNum) {
1895 // There aren't any 64-bit integer registers for ARM32. 1935 // There aren't any 64-bit integer registers for ARM32.
1896 assert(Type != IceType_i64); 1936 assert(Type != IceType_i64);
1897 Variable *Reg = Func->makeVariable(Type); 1937 Variable *Reg = Func->makeVariable(Type);
1898 if (RegNum == Variable::NoRegister) 1938 if (RegNum == Variable::NoRegister)
1899 Reg->setWeightInfinite(); 1939 Reg->setWeightInfinite();
1900 else 1940 else
1901 Reg->setRegNum(RegNum); 1941 Reg->setRegNum(RegNum);
1902 return Reg; 1942 return Reg;
1903 } 1943 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1986 } 2026 }
1987 } 2027 }
1988 2028
1989 void TargetDataARM32::lowerConstants() const { 2029 void TargetDataARM32::lowerConstants() const {
1990 if (Ctx->getFlags().getDisableTranslation()) 2030 if (Ctx->getFlags().getDisableTranslation())
1991 return; 2031 return;
1992 UnimplementedError(Ctx->getFlags()); 2032 UnimplementedError(Ctx->getFlags());
1993 } 2033 }
1994 2034
1995 } // end of namespace Ice 2035 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceTargetLoweringARM32.h ('k') | src/IceTargetLoweringX8632.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698