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

Side by Side Diff: src/IceTargetLoweringX8632.cpp

Issue 321993002: Add a few Subzero intrinsics (not the atomic ones yet). (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: doesn't matter if eax or not Created 6 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
OLDNEW
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 1746 matching lines...) Expand 10 before | Expand all | Expand 10 after
1757 legalize(Src0, IsSrc1ImmOrReg ? Legal_All : Legal_Reg, true); 1757 legalize(Src0, IsSrc1ImmOrReg ? Legal_All : Legal_Reg, true);
1758 InstX8632Label *Label = InstX8632Label::create(Func, this); 1758 InstX8632Label *Label = InstX8632Label::create(Func, this);
1759 _cmp(Src0New, Src1); 1759 _cmp(Src0New, Src1);
1760 _mov(Dest, One); 1760 _mov(Dest, One);
1761 _br(getIcmp32Mapping(Inst->getCondition()), Label); 1761 _br(getIcmp32Mapping(Inst->getCondition()), Label);
1762 Context.insert(InstFakeUse::create(Func, Dest)); 1762 Context.insert(InstFakeUse::create(Func, Dest));
1763 _mov(Dest, Zero); 1763 _mov(Dest, Zero);
1764 Context.insert(Label); 1764 Context.insert(Label);
1765 } 1765 }
1766 1766
1767 void TargetX8632::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
1768 switch (Instr->getIntrinsicInfo().ID) {
1769 case AtomicCmpxchg:
1770 case AtomicFence:
1771 case AtomicFenceAll:
1772 case AtomicIsLockFree:
1773 case AtomicLoad:
1774 case AtomicRMW:
1775 case AtomicStore:
1776 case Bswap:
1777 case Ctlz:
1778 case Ctpop:
1779 case Cttz:
1780 Func->setError("Unhandled intrinsic");
1781 return;
1782 case Longjmp: {
1783 InstCall *Call = makeHelperCall("longjmp", NULL, 2);
1784 Call->addArg(Instr->getSrc(1));
Jim Stichnoth 2014/06/10 22:58:28 Change all the Instr->getSrc(N) calls to Instr->ge
jvoung (off chromium) 2014/06/12 05:48:30 Done. Also adding a crosstest runnable test. Curr
1785 Call->addArg(Instr->getSrc(2));
1786 lowerCall(Call);
1787 break;
1788 }
1789 case Memcpy: {
1790 // In the future, we could potentially emit an inline memcpy/memset, etc.
1791 // for intrinsic calls w/ a known length.
1792 InstCall *Call = makeHelperCall("memcpy", NULL, 3);
1793 Call->addArg(Instr->getSrc(1));
1794 Call->addArg(Instr->getSrc(2));
1795 Call->addArg(Instr->getSrc(3));
1796 lowerCall(Call);
1797 break;
1798 }
1799 case Memmove: {
1800 InstCall *Call = makeHelperCall("memmove", NULL, 3);
1801 Call->addArg(Instr->getSrc(1));
1802 Call->addArg(Instr->getSrc(2));
1803 Call->addArg(Instr->getSrc(3));
1804 lowerCall(Call);
1805 break;
1806 }
1807 case Memset: {
1808 InstCall *Call = makeHelperCall("memset", NULL, 3);
1809 Call->addArg(Instr->getSrc(1));
1810 Call->addArg(Instr->getSrc(2));
1811 Call->addArg(Instr->getSrc(3));
1812 lowerCall(Call);
1813 break;
1814 }
1815 case NaClReadTP: {
1816 Constant *Zero = Ctx->getConstantInt(IceType_i32, 0);
1817 Operand *Src = OperandX8632MemOffSeg::create(Func, IceType_i32,
1818 Zero, Reg_GS);
1819 Variable *Dest = Instr->getDest();
1820 // Src is already a memory operand, so we need Dest to be a register.
1821 Dest->setWeightInfinite();
Jim Stichnoth 2014/06/10 22:58:28 This will force Dest to have a register for the en
jvoung (off chromium) 2014/06/12 05:48:30 Oops yeah otherwise it could potentially have a pr
1822 _mov(Dest, Src);
1823 break;
1824 }
1825 case Setjmp: {
1826 InstCall *Call = makeHelperCall("setjmp", Instr->getDest(), 1);
1827 Call->addArg(Instr->getSrc(1));
1828 lowerCall(Call);
1829 break;
1830 }
1831 case Sqrt:
1832 case Stacksave:
1833 case Stackrestore:
1834 Func->setError("Unhandled intrinsic");
1835 return;
1836 case Trap:
1837 _ud2();
1838 break;
1839 }
1840 return;
1841 }
1842
1767 namespace { 1843 namespace {
1768 1844
1769 bool isAdd(const Inst *Inst) { 1845 bool isAdd(const Inst *Inst) {
1770 if (const InstArithmetic *Arith = 1846 if (const InstArithmetic *Arith =
1771 llvm::dyn_cast_or_null<const InstArithmetic>(Inst)) { 1847 llvm::dyn_cast_or_null<const InstArithmetic>(Inst)) {
1772 return (Arith->getOp() == InstArithmetic::Add); 1848 return (Arith->getOp() == InstArithmetic::Add);
1773 } 1849 }
1774 return false; 1850 return false;
1775 } 1851 }
1776 1852
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
2259 // llvm-mc doesn't parse "dword ptr [.L$foo]". 2335 // llvm-mc doesn't parse "dword ptr [.L$foo]".
2260 Str << "dword ptr [L$" << IceType_f32 << "$" << getPoolEntryID() << "]"; 2336 Str << "dword ptr [L$" << IceType_f32 << "$" << getPoolEntryID() << "]";
2261 } 2337 }
2262 2338
2263 template <> void ConstantDouble::emit(GlobalContext *Ctx) const { 2339 template <> void ConstantDouble::emit(GlobalContext *Ctx) const {
2264 Ostream &Str = Ctx->getStrEmit(); 2340 Ostream &Str = Ctx->getStrEmit();
2265 Str << "qword ptr [L$" << IceType_f64 << "$" << getPoolEntryID() << "]"; 2341 Str << "qword ptr [L$" << IceType_f64 << "$" << getPoolEntryID() << "]";
2266 } 2342 }
2267 2343
2268 } // end of namespace Ice 2344 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698