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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1449263003: Subzero. ARM32. Introduces the ShAmtImm Operand. (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.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/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 /// \file 10 /// \file
(...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 1293
1294 void TargetARM32::div0Check(Type Ty, Operand *SrcLo, Operand *SrcHi) { 1294 void TargetARM32::div0Check(Type Ty, Operand *SrcLo, Operand *SrcHi) {
1295 if (isGuaranteedNonzeroInt(SrcLo) || isGuaranteedNonzeroInt(SrcHi)) 1295 if (isGuaranteedNonzeroInt(SrcLo) || isGuaranteedNonzeroInt(SrcHi))
1296 return; 1296 return;
1297 Variable *SrcLoReg = legalizeToReg(SrcLo); 1297 Variable *SrcLoReg = legalizeToReg(SrcLo);
1298 switch (Ty) { 1298 switch (Ty) {
1299 default: 1299 default:
1300 llvm::report_fatal_error("Unexpected type"); 1300 llvm::report_fatal_error("Unexpected type");
1301 case IceType_i8: 1301 case IceType_i8:
1302 case IceType_i16: { 1302 case IceType_i16: {
1303 Operand *ShAmtF = 1303 Operand *ShAmtImm = shAmtImm(32 - getScalarIntBitWidth(Ty));
1304 legalize(Ctx->getConstantInt32(32 - getScalarIntBitWidth(Ty)),
1305 Legal_Reg | Legal_Flex);
1306 Variable *T = makeReg(IceType_i32); 1304 Variable *T = makeReg(IceType_i32);
1307 _lsls(T, SrcLoReg, ShAmtF); 1305 _lsls(T, SrcLoReg, ShAmtImm);
1308 Context.insert(InstFakeUse::create(Func, T)); 1306 Context.insert(InstFakeUse::create(Func, T));
1309 } break; 1307 } break;
1310 case IceType_i32: { 1308 case IceType_i32: {
1311 _tst(SrcLoReg, SrcLoReg); 1309 _tst(SrcLoReg, SrcLoReg);
1312 break; 1310 break;
1313 } 1311 }
1314 case IceType_i64: { 1312 case IceType_i64: {
1315 Variable *T = makeReg(IceType_i32); 1313 Variable *T = makeReg(IceType_i32);
1316 _orrs(T, SrcLoReg, legalize(SrcHi, Legal_Reg | Legal_Flex)); 1314 _orrs(T, SrcLoReg, legalize(SrcHi, Legal_Reg | Legal_Flex));
1317 // T isn't going to be used, but we need the side-effect of setting flags 1315 // T isn't going to be used, but we need the side-effect of setting flags
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1447 } 1445 }
1448 1446
1449 Operand *src1RF(TargetARM32 *Target) const { 1447 Operand *src1RF(TargetARM32 *Target) const {
1450 return legalizeToRegOrFlex(Target, Src1); 1448 return legalizeToRegOrFlex(Target, Src1);
1451 } 1449 }
1452 1450
1453 Variable *unswappedSrc1R(TargetARM32 *Target) const { 1451 Variable *unswappedSrc1R(TargetARM32 *Target) const {
1454 return legalizeToReg(Target, Swapped ? Src0 : Src1); 1452 return legalizeToReg(Target, Swapped ? Src0 : Src1);
1455 } 1453 }
1456 1454
1457 Operand *unswappedSrc1RF(TargetARM32 *Target) const {
1458 return legalizeToRegOrFlex(Target, Swapped ? Src0 : Src1);
1459 }
1460
1461 protected: 1455 protected:
1462 Operand *const Src0; 1456 Operand *const Src0;
1463 Operand *const Src1; 1457 Operand *const Src1;
1464 const bool Swapped; 1458 const bool Swapped;
1465 1459
1466 static Variable *legalizeToReg(TargetARM32 *Target, Operand *Src) { 1460 static Variable *legalizeToReg(TargetARM32 *Target, Operand *Src) {
1467 return Target->legalizeToReg(Src); 1461 return Target->legalizeToReg(Src);
1468 } 1462 }
1469 1463
1470 static Operand *legalizeToRegOrFlex(TargetARM32 *Target, Operand *Src) { 1464 static Operand *legalizeToRegOrFlex(TargetARM32 *Target, Operand *Src) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1515 using DoubleOperands = NumericOperands<ConstantDouble>; 1509 using DoubleOperands = NumericOperands<ConstantDouble>;
1516 1510
1517 class Int32Operands : public NumericOperands<ConstantInteger32> { 1511 class Int32Operands : public NumericOperands<ConstantInteger32> {
1518 Int32Operands() = delete; 1512 Int32Operands() = delete;
1519 Int32Operands(const Int32Operands &) = delete; 1513 Int32Operands(const Int32Operands &) = delete;
1520 Int32Operands &operator=(const Int32Operands &) = delete; 1514 Int32Operands &operator=(const Int32Operands &) = delete;
1521 1515
1522 public: 1516 public:
1523 Int32Operands(Operand *S0, Operand *S1) : NumericOperands(S0, S1) {} 1517 Int32Operands(Operand *S0, Operand *S1) : NumericOperands(S0, S1) {}
1524 1518
1519 Operand *unswappedSrc1RShAmtImm(TargetARM32 *Target) const {
1520 if (!swappedOperands() && hasConstOperand()) {
1521 return Target->shAmtImm(getConstantValue() & 0x1F);
1522 }
1523 return legalizeToReg(Target, Swapped ? Src0 : Src1);
1524 }
1525
1525 bool immediateIsFlexEncodable() const { 1526 bool immediateIsFlexEncodable() const {
1526 uint32_t Rotate, Imm8; 1527 uint32_t Rotate, Imm8;
1527 return OperandARM32FlexImm::canHoldImm(getConstantValue(), &Rotate, &Imm8); 1528 return OperandARM32FlexImm::canHoldImm(getConstantValue(), &Rotate, &Imm8);
1528 } 1529 }
1529 1530
1530 bool negatedImmediateIsFlexEncodable() const { 1531 bool negatedImmediateIsFlexEncodable() const {
1531 uint32_t Rotate, Imm8; 1532 uint32_t Rotate, Imm8;
1532 return OperandARM32FlexImm::canHoldImm( 1533 return OperandARM32FlexImm::canHoldImm(
1533 -static_cast<int32_t>(getConstantValue()), &Rotate, &Imm8); 1534 -static_cast<int32_t>(getConstantValue()), &Rotate, &Imm8);
1534 } 1535 }
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 if (ShAmtImm == 0) { 1732 if (ShAmtImm == 0) {
1732 _mov(DestLo, Src0RLo); 1733 _mov(DestLo, Src0RLo);
1733 _mov(DestHi, SrcsHi.src0R(this)); 1734 _mov(DestHi, SrcsHi.src0R(this));
1734 return; 1735 return;
1735 } 1736 }
1736 1737
1737 if (ShAmtImm >= 32) { 1738 if (ShAmtImm >= 32) {
1738 if (ShAmtImm == 32) { 1739 if (ShAmtImm == 32) {
1739 _mov(DestHi, Src0RLo); 1740 _mov(DestHi, Src0RLo);
1740 } else { 1741 } else {
1741 Operand *ShAmtOp = legalize(Ctx->getConstantInt32(ShAmtImm - 32), 1742 Operand *ShAmtOp = shAmtImm(ShAmtImm - 32);
1742 Legal_Reg | Legal_Flex);
1743 _lsl(T_Hi, Src0RLo, ShAmtOp); 1743 _lsl(T_Hi, Src0RLo, ShAmtOp);
1744 _mov(DestHi, T_Hi); 1744 _mov(DestHi, T_Hi);
1745 } 1745 }
1746 1746
1747 Operand *_0 = 1747 Operand *_0 =
1748 legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex); 1748 legalize(Ctx->getConstantZero(IceType_i32), Legal_Reg | Legal_Flex);
1749 _mov(T_Lo, _0); 1749 _mov(T_Lo, _0);
1750 _mov(DestLo, T_Lo); 1750 _mov(DestLo, T_Lo);
1751 return; 1751 return;
1752 } 1752 }
1753 1753
1754 Variable *Src0RHi = SrcsHi.src0R(this); 1754 Variable *Src0RHi = SrcsHi.src0R(this);
1755 Operand *ShAmtOp = 1755 Operand *ShAmtOp = shAmtImm(ShAmtImm);
1756 legalize(Ctx->getConstantInt32(ShAmtImm), Legal_Reg | Legal_Flex); 1756 Operand *ComplShAmtOp = shAmtImm(32 - ShAmtImm);
1757 Operand *ComplShAmtOp = legalize(Ctx->getConstantInt32(32 - ShAmtImm),
1758 Legal_Reg | Legal_Flex);
1759 _lsl(T_Hi, Src0RHi, ShAmtOp); 1757 _lsl(T_Hi, Src0RHi, ShAmtOp);
1760 _orr(T_Hi, T_Hi, 1758 _orr(T_Hi, T_Hi,
1761 OperandARM32FlexReg::create(Func, IceType_i32, Src0RLo, 1759 OperandARM32FlexReg::create(Func, IceType_i32, Src0RLo,
1762 OperandARM32::LSR, ComplShAmtOp)); 1760 OperandARM32::LSR, ComplShAmtOp));
1763 _mov(DestHi, T_Hi); 1761 _mov(DestHi, T_Hi);
1764 1762
1765 _lsl(T_Lo, Src0RLo, ShAmtOp); 1763 _lsl(T_Lo, Src0RLo, ShAmtOp);
1766 _mov(DestLo, T_Lo); 1764 _mov(DestLo, T_Lo);
1767 return; 1765 return;
1768 } 1766 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1821 _mov(DestLo, TA_Lo); 1819 _mov(DestLo, TA_Lo);
1822 _mov(DestHi, TA_Hi); 1820 _mov(DestHi, TA_Hi);
1823 return; 1821 return;
1824 } 1822 }
1825 case InstArithmetic::Lshr: 1823 case InstArithmetic::Lshr:
1826 case InstArithmetic::Ashr: { 1824 case InstArithmetic::Ashr: {
1827 const bool ASR = Op == InstArithmetic::Ashr; 1825 const bool ASR = Op == InstArithmetic::Ashr;
1828 if (!SrcsLo.swappedOperands() && SrcsLo.hasConstOperand()) { 1826 if (!SrcsLo.swappedOperands() && SrcsLo.hasConstOperand()) {
1829 Variable *Src0RHi = SrcsHi.src0R(this); 1827 Variable *Src0RHi = SrcsHi.src0R(this);
1830 // Truncating the ShAmt to [0, 63] because that's what ARM does anyway. 1828 // Truncating the ShAmt to [0, 63] because that's what ARM does anyway.
1831 const int32_t ShAmtImm = SrcsLo.getConstantValue() & 0x3F; 1829 const int32_t ShAmt = SrcsLo.getConstantValue() & 0x3F;
1832 if (ShAmtImm == 0) { 1830 if (ShAmt == 0) {
1833 _mov(DestHi, Src0RHi); 1831 _mov(DestHi, Src0RHi);
1834 _mov(DestLo, SrcsLo.src0R(this)); 1832 _mov(DestLo, SrcsLo.src0R(this));
1835 return; 1833 return;
1836 } 1834 }
1837 1835
1838 if (ShAmtImm >= 32) { 1836 if (ShAmt >= 32) {
1839 if (ShAmtImm == 32) { 1837 if (ShAmt == 32) {
1840 _mov(DestLo, Src0RHi); 1838 _mov(DestLo, Src0RHi);
1841 } else { 1839 } else {
1842 Operand *ShAmtOp = legalize(Ctx->getConstantInt32(ShAmtImm - 32), 1840 Operand *ShAmtImm = shAmtImm(ShAmt - 32);
1843 Legal_Reg | Legal_Flex);
1844 if (ASR) { 1841 if (ASR) {
1845 _asr(T_Lo, Src0RHi, ShAmtOp); 1842 _asr(T_Lo, Src0RHi, ShAmtImm);
1846 } else { 1843 } else {
1847 _lsr(T_Lo, Src0RHi, ShAmtOp); 1844 _lsr(T_Lo, Src0RHi, ShAmtImm);
1848 } 1845 }
1849 _mov(DestLo, T_Lo); 1846 _mov(DestLo, T_Lo);
1850 } 1847 }
1851 1848
1852 if (ASR) { 1849 if (ASR) {
1853 Operand *_31 = legalize(Ctx->getConstantZero(IceType_i32), 1850 Operand *_31 = shAmtImm(31);
1854 Legal_Reg | Legal_Flex);
1855 _asr(T_Hi, Src0RHi, _31); 1851 _asr(T_Hi, Src0RHi, _31);
1856 } else { 1852 } else {
1857 Operand *_0 = legalize(Ctx->getConstantZero(IceType_i32), 1853 Operand *_0 = legalize(Ctx->getConstantZero(IceType_i32),
1858 Legal_Reg | Legal_Flex); 1854 Legal_Reg | Legal_Flex);
1859 _mov(T_Hi, _0); 1855 _mov(T_Hi, _0);
1860 } 1856 }
1861 _mov(DestHi, T_Hi); 1857 _mov(DestHi, T_Hi);
1862 return; 1858 return;
1863 } 1859 }
1864 1860
1865 Variable *Src0RLo = SrcsLo.src0R(this); 1861 Variable *Src0RLo = SrcsLo.src0R(this);
1866 Operand *ShAmtOp = 1862 Operand *ShAmtImm = shAmtImm(ShAmt);
1867 legalize(Ctx->getConstantInt32(ShAmtImm), Legal_Reg | Legal_Flex); 1863 Operand *ComplShAmtImm = shAmtImm(32 - ShAmt);
1868 Operand *ComplShAmtOp = legalize(Ctx->getConstantInt32(32 - ShAmtImm), 1864 _lsr(T_Lo, Src0RLo, ShAmtImm);
1869 Legal_Reg | Legal_Flex);
1870 _lsr(T_Lo, Src0RLo, ShAmtOp);
1871 _orr(T_Lo, T_Lo, 1865 _orr(T_Lo, T_Lo,
1872 OperandARM32FlexReg::create(Func, IceType_i32, Src0RHi, 1866 OperandARM32FlexReg::create(Func, IceType_i32, Src0RHi,
1873 OperandARM32::LSL, ComplShAmtOp)); 1867 OperandARM32::LSL, ComplShAmtImm));
1874 _mov(DestLo, T_Lo); 1868 _mov(DestLo, T_Lo);
1875 1869
1876 if (ASR) { 1870 if (ASR) {
1877 _asr(T_Hi, Src0RHi, ShAmtOp); 1871 _asr(T_Hi, Src0RHi, ShAmtImm);
1878 } else { 1872 } else {
1879 _lsr(T_Hi, Src0RHi, ShAmtOp); 1873 _lsr(T_Hi, Src0RHi, ShAmtImm);
1880 } 1874 }
1881 _mov(DestHi, T_Hi); 1875 _mov(DestHi, T_Hi);
1882 return; 1876 return;
1883 } 1877 }
1884 1878
1885 // a=b>>c 1879 // a=b>>c
1886 // pnacl-llc does: 1880 // pnacl-llc does:
1887 // mov t_b.lo, b.lo 1881 // mov t_b.lo, b.lo
1888 // mov t_b.hi, b.hi 1882 // mov t_b.hi, b.hi
1889 // mov t_c.lo, c.lo 1883 // mov t_c.lo, c.lo
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
2144 } 2138 }
2145 case InstArithmetic::Mul: { 2139 case InstArithmetic::Mul: {
2146 Variable *Src0R = Srcs.unswappedSrc0R(this); 2140 Variable *Src0R = Srcs.unswappedSrc0R(this);
2147 Variable *Src1R = Srcs.unswappedSrc1R(this); 2141 Variable *Src1R = Srcs.unswappedSrc1R(this);
2148 _mul(T, Src0R, Src1R); 2142 _mul(T, Src0R, Src1R);
2149 _mov(Dest, T); 2143 _mov(Dest, T);
2150 return; 2144 return;
2151 } 2145 }
2152 case InstArithmetic::Shl: { 2146 case InstArithmetic::Shl: {
2153 Variable *Src0R = Srcs.unswappedSrc0R(this); 2147 Variable *Src0R = Srcs.unswappedSrc0R(this);
2154 Operand *Src1R = Srcs.unswappedSrc1RF(this); 2148 Operand *Src1R = Srcs.unswappedSrc1RShAmtImm(this);
2155 _lsl(T, Src0R, Src1R); 2149 _lsl(T, Src0R, Src1R);
2156 _mov(Dest, T); 2150 _mov(Dest, T);
2157 return; 2151 return;
2158 } 2152 }
2159 case InstArithmetic::Lshr: { 2153 case InstArithmetic::Lshr: {
2160 Variable *Src0R = Srcs.unswappedSrc0R(this); 2154 Variable *Src0R = Srcs.unswappedSrc0R(this);
2161 if (Dest->getType() != IceType_i32) { 2155 if (Dest->getType() != IceType_i32) {
2162 _uxt(Src0R, Src0R); 2156 _uxt(Src0R, Src0R);
2163 } 2157 }
2164 _lsr(T, Src0R, Srcs.unswappedSrc1RF(this)); 2158 _lsr(T, Src0R, Srcs.unswappedSrc1RShAmtImm(this));
2165 _mov(Dest, T); 2159 _mov(Dest, T);
2166 return; 2160 return;
2167 } 2161 }
2168 case InstArithmetic::Ashr: { 2162 case InstArithmetic::Ashr: {
2169 Variable *Src0R = Srcs.unswappedSrc0R(this); 2163 Variable *Src0R = Srcs.unswappedSrc0R(this);
2170 if (Dest->getType() != IceType_i32) { 2164 if (Dest->getType() != IceType_i32) {
2171 _sxt(Src0R, Src0R); 2165 _sxt(Src0R, Src0R);
2172 } 2166 }
2173 _asr(T, Src0R, Srcs.unswappedSrc1RF(this)); 2167 _asr(T, Src0R, Srcs.unswappedSrc1RShAmtImm(this));
2174 _mov(Dest, T); 2168 _mov(Dest, T);
2175 return; 2169 return;
2176 } 2170 }
2177 case InstArithmetic::Udiv: 2171 case InstArithmetic::Udiv:
2178 case InstArithmetic::Sdiv: 2172 case InstArithmetic::Sdiv:
2179 case InstArithmetic::Urem: 2173 case InstArithmetic::Urem:
2180 case InstArithmetic::Srem: 2174 case InstArithmetic::Srem:
2181 llvm::report_fatal_error( 2175 llvm::report_fatal_error(
2182 "Integer div/rem should have been handled earlier."); 2176 "Integer div/rem should have been handled earlier.");
2183 return; 2177 return;
(...skipping 994 matching lines...) Expand 10 before | Expand all | Expand 10 after
3178 3172
3179 TargetARM32::CondWhenTrue 3173 TargetARM32::CondWhenTrue
3180 TargetARM32::lowerInt8AndInt16IcmpCond(InstIcmp::ICond Condition, Operand *Src0, 3174 TargetARM32::lowerInt8AndInt16IcmpCond(InstIcmp::ICond Condition, Operand *Src0,
3181 Operand *Src1) { 3175 Operand *Src1) {
3182 Int32Operands Srcs(Src0, Src1); 3176 Int32Operands Srcs(Src0, Src1);
3183 const int32_t ShAmt = 32 - getScalarIntBitWidth(Src0->getType()); 3177 const int32_t ShAmt = 32 - getScalarIntBitWidth(Src0->getType());
3184 assert(ShAmt >= 0); 3178 assert(ShAmt >= 0);
3185 3179
3186 if (!Srcs.hasConstOperand()) { 3180 if (!Srcs.hasConstOperand()) {
3187 Variable *Src0R = makeReg(IceType_i32); 3181 Variable *Src0R = makeReg(IceType_i32);
3188 Operand *ShAmtF = 3182 Operand *ShAmtImm = shAmtImm(ShAmt);
3189 legalize(Ctx->getConstantInt32(ShAmt), Legal_Reg | Legal_Flex); 3183 _lsl(Src0R, legalizeToReg(Src0), ShAmtImm);
3190 _lsl(Src0R, legalizeToReg(Src0), ShAmtF);
3191 3184
3192 Variable *Src1R = legalizeToReg(Src1); 3185 Variable *Src1R = legalizeToReg(Src1);
3193 OperandARM32FlexReg *Src1F = OperandARM32FlexReg::create( 3186 OperandARM32FlexReg *Src1F = OperandARM32FlexReg::create(
3194 Func, IceType_i32, Src1R, OperandARM32::LSL, ShAmtF); 3187 Func, IceType_i32, Src1R, OperandARM32::LSL, ShAmtImm);
3195 _cmp(Src0R, Src1F); 3188 _cmp(Src0R, Src1F);
3196 return CondWhenTrue(getIcmp32Mapping(Condition)); 3189 return CondWhenTrue(getIcmp32Mapping(Condition));
3197 } 3190 }
3198 3191
3199 const int32_t Value = Srcs.getConstantValue(); 3192 const int32_t Value = Srcs.getConstantValue();
3200 if ((Condition == InstIcmp::Eq || Condition == InstIcmp::Ne) && Value == 0) { 3193 if ((Condition == InstIcmp::Eq || Condition == InstIcmp::Ne) && Value == 0) {
3201 Operand *ShAmtOp = Ctx->getConstantInt32(ShAmt); 3194 Operand *ShAmtImm = shAmtImm(ShAmt);
3202 Variable *T = makeReg(IceType_i32); 3195 Variable *T = makeReg(IceType_i32);
3203 _lsls(T, Srcs.src0R(this), ShAmtOp); 3196 _lsls(T, Srcs.src0R(this), ShAmtImm);
3204 Context.insert(InstFakeUse::create(Func, T)); 3197 Context.insert(InstFakeUse::create(Func, T));
3205 return CondWhenTrue(getIcmp32Mapping(Condition)); 3198 return CondWhenTrue(getIcmp32Mapping(Condition));
3206 } 3199 }
3207 3200
3208 Variable *ConstR = makeReg(IceType_i32); 3201 Variable *ConstR = makeReg(IceType_i32);
3209 _mov(ConstR, 3202 _mov(ConstR,
3210 legalize(Ctx->getConstantInt32(Value << ShAmt), Legal_Reg | Legal_Flex)); 3203 legalize(Ctx->getConstantInt32(Value << ShAmt), Legal_Reg | Legal_Flex));
3211 Operand *NonConstF = OperandARM32FlexReg::create( 3204 Operand *NonConstF = OperandARM32FlexReg::create(
3212 Func, IceType_i32, Srcs.src0R(this), OperandARM32::LSL, 3205 Func, IceType_i32, Srcs.src0R(this), OperandARM32::LSL,
3213 Ctx->getConstantInt32(ShAmt)); 3206 Ctx->getConstantInt32(ShAmt));
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
3770 _rev(T_Lo, Val_Lo); 3763 _rev(T_Lo, Val_Lo);
3771 _rev(T_Hi, Val_Hi); 3764 _rev(T_Hi, Val_Hi);
3772 _mov(DestLo, T_Hi); 3765 _mov(DestLo, T_Hi);
3773 _mov(DestHi, T_Lo); 3766 _mov(DestHi, T_Lo);
3774 } else { 3767 } else {
3775 assert(Ty == IceType_i32 || Ty == IceType_i16); 3768 assert(Ty == IceType_i32 || Ty == IceType_i16);
3776 Variable *ValR = legalizeToReg(Val); 3769 Variable *ValR = legalizeToReg(Val);
3777 Variable *T = makeReg(Ty); 3770 Variable *T = makeReg(Ty);
3778 _rev(T, ValR); 3771 _rev(T, ValR);
3779 if (Val->getType() == IceType_i16) { 3772 if (Val->getType() == IceType_i16) {
3780 Operand *Sixteen = 3773 Operand *_16 = shAmtImm(16);
3781 legalize(Ctx->getConstantInt32(16), Legal_Reg | Legal_Flex); 3774 _lsr(T, T, _16);
3782 _lsr(T, T, Sixteen);
3783 } 3775 }
3784 _mov(Dest, T); 3776 _mov(Dest, T);
3785 } 3777 }
3786 return; 3778 return;
3787 } 3779 }
3788 case Intrinsics::Ctpop: { 3780 case Intrinsics::Ctpop: {
3789 Operand *Val = Instr->getArg(0); 3781 Operand *Val = Instr->getArg(0);
3790 InstCall *Call = makeHelperCall(isInt32Asserting32Or64(Val->getType()) 3782 InstCall *Call = makeHelperCall(isInt32Asserting32Or64(Val->getType())
3791 ? H_call_ctpop_i32 3783 ? H_call_ctpop_i32
3792 : H_call_ctpop_i64, 3784 : H_call_ctpop_i64,
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after
4566 return; 4558 return;
4567 } 4559 }
4568 4560
4569 Variable *Src0Var = legalizeToReg(Src0); 4561 Variable *Src0Var = legalizeToReg(Src0);
4570 // If Src0 is not an i32, we left shift it -- see the icmp lowering for the 4562 // If Src0 is not an i32, we left shift it -- see the icmp lowering for the
4571 // reason. 4563 // reason.
4572 assert(Src0Var->mustHaveReg()); 4564 assert(Src0Var->mustHaveReg());
4573 const size_t ShiftAmt = 32 - getScalarIntBitWidth(Src0->getType()); 4565 const size_t ShiftAmt = 32 - getScalarIntBitWidth(Src0->getType());
4574 assert(ShiftAmt < 32); 4566 assert(ShiftAmt < 32);
4575 if (ShiftAmt > 0) { 4567 if (ShiftAmt > 0) {
4576 Operand *ShiftConst = Ctx->getConstantInt32(ShiftAmt); 4568 Operand *ShAmtImm = shAmtImm(ShiftAmt);
4577 Variable *T = makeReg(IceType_i32); 4569 Variable *T = makeReg(IceType_i32);
4578 _lsl(T, Src0Var, ShiftConst); 4570 _lsl(T, Src0Var, ShAmtImm);
4579 Src0Var = T; 4571 Src0Var = T;
4580 } 4572 }
4581 4573
4582 for (SizeT I = 0; I < NumCases; ++I) { 4574 for (SizeT I = 0; I < NumCases; ++I) {
4583 Operand *Value = Ctx->getConstantInt32(Inst->getValue(I) << ShiftAmt); 4575 Operand *Value = Ctx->getConstantInt32(Inst->getValue(I) << ShiftAmt);
4584 Value = legalize(Value, Legal_Reg | Legal_Flex); 4576 Value = legalize(Value, Legal_Reg | Legal_Flex);
4585 _cmp(Src0Var, Value); 4577 _cmp(Src0Var, Value);
4586 _br(Inst->getLabel(I), CondARM32::EQ); 4578 _br(Inst->getLabel(I), CondARM32::EQ);
4587 } 4579 }
4588 _br(Inst->getLabelDefault()); 4580 _br(Inst->getLabelDefault());
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after
5420 // Technically R9 is used for TLS with Sandboxing, and we reserve it. 5412 // Technically R9 is used for TLS with Sandboxing, and we reserve it.
5421 // However, for compatibility with current NaCl LLVM, don't claim that. 5413 // However, for compatibility with current NaCl LLVM, don't claim that.
5422 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; 5414 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n";
5423 } 5415 }
5424 5416
5425 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; 5417 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM];
5426 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; 5418 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM];
5427 llvm::SmallBitVector TargetARM32::ScratchRegs; 5419 llvm::SmallBitVector TargetARM32::ScratchRegs;
5428 5420
5429 } // end of namespace Ice 5421 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceTargetLoweringARM32.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698