| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|