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

Side by Side Diff: src/IceTargetLoweringX8632.cpp

Issue 547033002: Subzero: Be more strict about i1 calculations. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Revert unnecessary changes Created 6 years, 3 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 1495 matching lines...) Expand 10 before | Expand all | Expand 10 after
1506 } else { // Dest->getType() is non-i64 scalar 1506 } else { // Dest->getType() is non-i64 scalar
1507 Variable *T_edx = NULL; 1507 Variable *T_edx = NULL;
1508 Variable *T = NULL; 1508 Variable *T = NULL;
1509 switch (Inst->getOp()) { 1509 switch (Inst->getOp()) {
1510 case InstArithmetic::_num: 1510 case InstArithmetic::_num:
1511 llvm_unreachable("Unknown arithmetic operator"); 1511 llvm_unreachable("Unknown arithmetic operator");
1512 break; 1512 break;
1513 case InstArithmetic::Add: 1513 case InstArithmetic::Add:
1514 _mov(T, Src0); 1514 _mov(T, Src0);
1515 _add(T, Src1); 1515 _add(T, Src1);
1516 if (Dest->getType() == IceType_i1)
1517 _and(T, Ctx->getConstantInt(IceType_i1, 1));
1516 _mov(Dest, T); 1518 _mov(Dest, T);
1517 break; 1519 break;
1518 case InstArithmetic::And: 1520 case InstArithmetic::And:
1519 _mov(T, Src0); 1521 _mov(T, Src0);
1520 _and(T, Src1); 1522 _and(T, Src1);
1521 _mov(Dest, T); 1523 _mov(Dest, T);
1522 break; 1524 break;
1523 case InstArithmetic::Or: 1525 case InstArithmetic::Or:
1524 _mov(T, Src0); 1526 _mov(T, Src0);
1525 _or(T, Src1); 1527 _or(T, Src1);
1526 _mov(Dest, T); 1528 _mov(Dest, T);
1527 break; 1529 break;
1528 case InstArithmetic::Xor: 1530 case InstArithmetic::Xor:
1529 _mov(T, Src0); 1531 _mov(T, Src0);
1530 _xor(T, Src1); 1532 _xor(T, Src1);
1531 _mov(Dest, T); 1533 _mov(Dest, T);
1532 break; 1534 break;
1533 case InstArithmetic::Sub: 1535 case InstArithmetic::Sub:
1534 _mov(T, Src0); 1536 _mov(T, Src0);
1535 _sub(T, Src1); 1537 _sub(T, Src1);
1538 if (Dest->getType() == IceType_i1)
1539 _and(T, Ctx->getConstantInt(IceType_i1, 1));
1536 _mov(Dest, T); 1540 _mov(Dest, T);
1537 break; 1541 break;
1538 case InstArithmetic::Mul: 1542 case InstArithmetic::Mul:
1539 // TODO: Optimize for llvm::isa<Constant>(Src1) 1543 // TODO: Optimize for llvm::isa<Constant>(Src1)
1540 // TODO: Strength-reduce multiplications by a constant, 1544 // TODO: Strength-reduce multiplications by a constant,
1541 // particularly -1 and powers of 2. Advanced: use lea to 1545 // particularly -1 and powers of 2. Advanced: use lea to
1542 // multiply by 3, 5, 9. 1546 // multiply by 3, 5, 9.
1543 // 1547 //
1544 // The 8-bit version of imul only allows the form "imul r/m8" 1548 // The 8-bit version of imul only allows the form "imul r/m8"
1545 // where T must be in eax. 1549 // where T must be in eax.
1546 if (Dest->getType() == IceType_i8) 1550 if (Dest->getType() == IceType_i1 || Dest->getType() == IceType_i8)
1547 _mov(T, Src0, Reg_eax); 1551 _mov(T, Src0, Reg_eax);
1548 else 1552 else
1549 _mov(T, Src0); 1553 _mov(T, Src0);
1550 _imul(T, Src1); 1554 _imul(T, Src1);
1551 _mov(Dest, T); 1555 _mov(Dest, T);
1552 break; 1556 break;
1553 case InstArithmetic::Shl: 1557 case InstArithmetic::Shl:
1554 _mov(T, Src0); 1558 _mov(T, Src0);
1555 if (!llvm::isa<Constant>(Src1)) 1559 if (!llvm::isa<Constant>(Src1))
1556 Src1 = legalizeToVar(Src1, false, Reg_ecx); 1560 Src1 = legalizeToVar(Src1, false, Reg_ecx);
1557 _shl(T, Src1); 1561 _shl(T, Src1);
1562 if (Dest->getType() == IceType_i1)
1563 _and(T, Ctx->getConstantInt(IceType_i1, 1));
1558 _mov(Dest, T); 1564 _mov(Dest, T);
1559 break; 1565 break;
1560 case InstArithmetic::Lshr: 1566 case InstArithmetic::Lshr:
1561 _mov(T, Src0); 1567 _mov(T, Src0);
1562 if (!llvm::isa<Constant>(Src1)) 1568 if (!llvm::isa<Constant>(Src1))
1563 Src1 = legalizeToVar(Src1, false, Reg_ecx); 1569 Src1 = legalizeToVar(Src1, false, Reg_ecx);
1564 _shr(T, Src1); 1570 _shr(T, Src1);
1565 _mov(Dest, T); 1571 _mov(Dest, T);
1566 break; 1572 break;
1567 case InstArithmetic::Ashr: 1573 case InstArithmetic::Ashr:
1568 _mov(T, Src0); 1574 _mov(T, Src0);
1569 if (!llvm::isa<Constant>(Src1)) 1575 if (!llvm::isa<Constant>(Src1))
1570 Src1 = legalizeToVar(Src1, false, Reg_ecx); 1576 Src1 = legalizeToVar(Src1, false, Reg_ecx);
1571 _sar(T, Src1); 1577 _sar(T, Src1);
1572 _mov(Dest, T); 1578 _mov(Dest, T);
1573 break; 1579 break;
1574 case InstArithmetic::Udiv: 1580 case InstArithmetic::Udiv:
1575 // div and idiv are the few arithmetic operators that do not allow 1581 // div and idiv are the few arithmetic operators that do not allow
1576 // immediates as the operand. 1582 // immediates as the operand.
1577 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); 1583 Src1 = legalize(Src1, Legal_Reg | Legal_Mem);
1578 if (Dest->getType() == IceType_i8) { 1584 if (Dest->getType() == IceType_i1 || Dest->getType() == IceType_i8) {
1579 Variable *T_ah = NULL; 1585 Variable *T_ah = NULL;
1580 Constant *Zero = Ctx->getConstantZero(IceType_i8); 1586 Constant *Zero = Ctx->getConstantZero(IceType_i8);
1581 _mov(T, Src0, Reg_eax); 1587 _mov(T, Src0, Reg_eax);
1582 _mov(T_ah, Zero, Reg_ah); 1588 _mov(T_ah, Zero, Reg_ah);
1583 _div(T, Src1, T_ah); 1589 _div(T, Src1, T_ah);
1584 _mov(Dest, T); 1590 _mov(Dest, T);
1585 } else { 1591 } else {
1586 Constant *Zero = Ctx->getConstantZero(IceType_i32); 1592 Constant *Zero = Ctx->getConstantZero(IceType_i32);
1587 _mov(T, Src0, Reg_eax); 1593 _mov(T, Src0, Reg_eax);
1588 _mov(T_edx, Zero, Reg_edx); 1594 _mov(T_edx, Zero, Reg_edx);
1589 _div(T, Src1, T_edx); 1595 _div(T, Src1, T_edx);
1590 _mov(Dest, T); 1596 _mov(Dest, T);
1591 } 1597 }
1592 break; 1598 break;
1593 case InstArithmetic::Sdiv: 1599 case InstArithmetic::Sdiv:
1594 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); 1600 Src1 = legalize(Src1, Legal_Reg | Legal_Mem);
1595 if (Dest->getType() == IceType_i8) { 1601 if (Dest->getType() == IceType_i1 || Dest->getType() == IceType_i8) {
1596 _mov(T, Src0, Reg_eax); 1602 _mov(T, Src0, Reg_eax);
1597 _cbwdq(T, T); 1603 _cbwdq(T, T);
1598 _idiv(T, Src1, T); 1604 _idiv(T, Src1, T);
1599 _mov(Dest, T); 1605 _mov(Dest, T);
1600 } else { 1606 } else {
1601 T_edx = makeReg(IceType_i32, Reg_edx); 1607 T_edx = makeReg(IceType_i32, Reg_edx);
1602 _mov(T, Src0, Reg_eax); 1608 _mov(T, Src0, Reg_eax);
1603 _cbwdq(T_edx, T); 1609 _cbwdq(T_edx, T);
1604 _idiv(T, Src1, T_edx); 1610 _idiv(T, Src1, T_edx);
1605 _mov(Dest, T); 1611 _mov(Dest, T);
1606 } 1612 }
1607 break; 1613 break;
1608 case InstArithmetic::Urem: 1614 case InstArithmetic::Urem:
1609 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); 1615 Src1 = legalize(Src1, Legal_Reg | Legal_Mem);
1610 if (Dest->getType() == IceType_i8) { 1616 if (Dest->getType() == IceType_i1 || Dest->getType() == IceType_i8) {
1611 Variable *T_ah = NULL; 1617 Variable *T_ah = NULL;
1612 Constant *Zero = Ctx->getConstantZero(IceType_i8); 1618 Constant *Zero = Ctx->getConstantZero(IceType_i8);
1613 _mov(T, Src0, Reg_eax); 1619 _mov(T, Src0, Reg_eax);
1614 _mov(T_ah, Zero, Reg_ah); 1620 _mov(T_ah, Zero, Reg_ah);
1615 _div(T_ah, Src1, T); 1621 _div(T_ah, Src1, T);
1616 _mov(Dest, T_ah); 1622 _mov(Dest, T_ah);
1617 } else { 1623 } else {
1618 Constant *Zero = Ctx->getConstantZero(IceType_i32); 1624 Constant *Zero = Ctx->getConstantZero(IceType_i32);
1619 _mov(T_edx, Zero, Reg_edx); 1625 _mov(T_edx, Zero, Reg_edx);
1620 _mov(T, Src0, Reg_eax); 1626 _mov(T, Src0, Reg_eax);
1621 _div(T_edx, Src1, T); 1627 _div(T_edx, Src1, T);
1622 _mov(Dest, T_edx); 1628 _mov(Dest, T_edx);
1623 } 1629 }
1624 break; 1630 break;
1625 case InstArithmetic::Srem: 1631 case InstArithmetic::Srem:
1626 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); 1632 Src1 = legalize(Src1, Legal_Reg | Legal_Mem);
1627 if (Dest->getType() == IceType_i8) { 1633 if (Dest->getType() == IceType_i1 || Dest->getType() == IceType_i8) {
1628 Variable *T_ah = makeReg(IceType_i8, Reg_ah); 1634 Variable *T_ah = makeReg(IceType_i8, Reg_ah);
1629 _mov(T, Src0, Reg_eax); 1635 _mov(T, Src0, Reg_eax);
1630 _cbwdq(T, T); 1636 _cbwdq(T, T);
1631 Context.insert(InstFakeDef::create(Func, T_ah)); 1637 Context.insert(InstFakeDef::create(Func, T_ah));
1632 _idiv(T_ah, Src1, T); 1638 _idiv(T_ah, Src1, T);
1633 _mov(Dest, T_ah); 1639 _mov(Dest, T_ah);
1634 } else { 1640 } else {
1635 T_edx = makeReg(IceType_i32, Reg_edx); 1641 T_edx = makeReg(IceType_i32, Reg_edx);
1636 _mov(T, Src0, Reg_eax); 1642 _mov(T, Src0, Reg_eax);
1637 _cbwdq(T_edx, T); 1643 _cbwdq(T_edx, T);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1958 _mov(T_Hi, T_Lo); 1964 _mov(T_Hi, T_Lo);
1959 _sar(T_Hi, Shift); 1965 _sar(T_Hi, Shift);
1960 _mov(DestHi, T_Hi); 1966 _mov(DestHi, T_Hi);
1961 } else if (Src0RM->getType() == IceType_i1) { 1967 } else if (Src0RM->getType() == IceType_i1) {
1962 // t1 = src 1968 // t1 = src
1963 // shl t1, dst_bitwidth - 1 1969 // shl t1, dst_bitwidth - 1
1964 // sar t1, dst_bitwidth - 1 1970 // sar t1, dst_bitwidth - 1
1965 // dst = t1 1971 // dst = t1
1966 size_t DestBits = X86_CHAR_BIT * typeWidthInBytes(Dest->getType()); 1972 size_t DestBits = X86_CHAR_BIT * typeWidthInBytes(Dest->getType());
1967 Constant *ShiftAmount = Ctx->getConstantInt(IceType_i32, DestBits - 1); 1973 Constant *ShiftAmount = Ctx->getConstantInt(IceType_i32, DestBits - 1);
1968 Variable *T = NULL; 1974 Variable *T = makeReg(Dest->getType());
1969 _mov(T, Src0RM); 1975 if (typeWidthInBytes(Dest->getType()) <=
1976 typeWidthInBytes(Src0RM->getType())) {
1977 _mov(T, Src0RM);
1978 } else {
1979 _movzx(T, Src0RM);
1980 }
1970 _shl(T, ShiftAmount); 1981 _shl(T, ShiftAmount);
1971 _sar(T, ShiftAmount); 1982 _sar(T, ShiftAmount);
1972 _mov(Dest, T); 1983 _mov(Dest, T);
1973 } else { 1984 } else {
1974 // t1 = movsx src; dst = t1 1985 // t1 = movsx src; dst = t1
1975 Variable *T = makeReg(Dest->getType()); 1986 Variable *T = makeReg(Dest->getType());
1976 _movsx(T, Src0RM); 1987 _movsx(T, Src0RM);
1977 _mov(Dest, T); 1988 _mov(Dest, T);
1978 } 1989 }
1979 break; 1990 break;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2031 _pand(T, OneMask); 2042 _pand(T, OneMask);
2032 _movp(Dest, T); 2043 _movp(Dest, T);
2033 } else { 2044 } else {
2034 Operand *Src0 = Inst->getSrc(0); 2045 Operand *Src0 = Inst->getSrc(0);
2035 if (Src0->getType() == IceType_i64) 2046 if (Src0->getType() == IceType_i64)
2036 Src0 = loOperand(Src0); 2047 Src0 = loOperand(Src0);
2037 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem); 2048 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem);
2038 // t1 = trunc Src0RM; Dest = t1 2049 // t1 = trunc Src0RM; Dest = t1
2039 Variable *T = NULL; 2050 Variable *T = NULL;
2040 _mov(T, Src0RM); 2051 _mov(T, Src0RM);
2052 if (Dest->getType() == IceType_i1)
2053 _and(T, Ctx->getConstantInt(IceType_i1, 1));
2041 _mov(Dest, T); 2054 _mov(Dest, T);
2042 } 2055 }
2043 break; 2056 break;
2044 } 2057 }
2045 case InstCast::Fptrunc: 2058 case InstCast::Fptrunc:
2046 case InstCast::Fpext: { 2059 case InstCast::Fpext: {
2047 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); 2060 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem);
2048 // t1 = cvt Src0RM; Dest = t1 2061 // t1 = cvt Src0RM; Dest = t1
2049 Variable *T = makeReg(Dest->getType()); 2062 Variable *T = makeReg(Dest->getType());
2050 _cvt(T, Src0RM); 2063 _cvt(T, Src0RM);
(...skipping 23 matching lines...) Expand all
2074 // TODO: Call the correct compiler-rt helper function. 2087 // TODO: Call the correct compiler-rt helper function.
2075 Call->addArg(Inst->getSrc(0)); 2088 Call->addArg(Inst->getSrc(0));
2076 lowerCall(Call); 2089 lowerCall(Call);
2077 } else { 2090 } else {
2078 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); 2091 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem);
2079 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type 2092 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type
2080 Variable *T_1 = makeReg(IceType_i32); 2093 Variable *T_1 = makeReg(IceType_i32);
2081 Variable *T_2 = makeReg(Dest->getType()); 2094 Variable *T_2 = makeReg(Dest->getType());
2082 _cvt(T_1, Src0RM); 2095 _cvt(T_1, Src0RM);
2083 _mov(T_2, T_1); // T_1 and T_2 may have different integer types 2096 _mov(T_2, T_1); // T_1 and T_2 may have different integer types
2097 if (Dest->getType() == IceType_i1)
2098 _and(T_2, Ctx->getConstantInt(IceType_i1, 1));
2084 _mov(Dest, T_2); 2099 _mov(Dest, T_2);
2085 T_2->setPreferredRegister(T_1, true); 2100 T_2->setPreferredRegister(T_1, true);
2086 } 2101 }
2087 break; 2102 break;
2088 case InstCast::Fptoui: 2103 case InstCast::Fptoui:
2089 if (isVectorType(Dest->getType())) { 2104 if (isVectorType(Dest->getType())) {
2090 assert(Dest->getType() == IceType_v4i32 && 2105 assert(Dest->getType() == IceType_v4i32 &&
2091 Inst->getSrc(0)->getType() == IceType_v4f32); 2106 Inst->getSrc(0)->getType() == IceType_v4f32);
2092 const SizeT MaxSrcs = 1; 2107 const SizeT MaxSrcs = 1;
2093 InstCall *Call = makeHelperCall("Sz_fptoui_v4f32", Dest, MaxSrcs); 2108 InstCall *Call = makeHelperCall("Sz_fptoui_v4f32", Dest, MaxSrcs);
(...skipping 15 matching lines...) Expand all
2109 Call->addArg(Inst->getSrc(0)); 2124 Call->addArg(Inst->getSrc(0));
2110 lowerCall(Call); 2125 lowerCall(Call);
2111 return; 2126 return;
2112 } else { 2127 } else {
2113 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); 2128 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem);
2114 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type 2129 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type
2115 Variable *T_1 = makeReg(IceType_i32); 2130 Variable *T_1 = makeReg(IceType_i32);
2116 Variable *T_2 = makeReg(Dest->getType()); 2131 Variable *T_2 = makeReg(Dest->getType());
2117 _cvt(T_1, Src0RM); 2132 _cvt(T_1, Src0RM);
2118 _mov(T_2, T_1); // T_1 and T_2 may have different integer types 2133 _mov(T_2, T_1); // T_1 and T_2 may have different integer types
2134 if (Dest->getType() == IceType_i1)
2135 _and(T_2, Ctx->getConstantInt(IceType_i1, 1));
2119 _mov(Dest, T_2); 2136 _mov(Dest, T_2);
2120 T_2->setPreferredRegister(T_1, true); 2137 T_2->setPreferredRegister(T_1, true);
2121 } 2138 }
2122 break; 2139 break;
2123 case InstCast::Sitofp: 2140 case InstCast::Sitofp:
2124 if (isVectorType(Dest->getType())) { 2141 if (isVectorType(Dest->getType())) {
2125 assert(Dest->getType() == IceType_v4f32 && 2142 assert(Dest->getType() == IceType_v4f32 &&
2126 Inst->getSrc(0)->getType() == IceType_v4i32); 2143 Inst->getSrc(0)->getType() == IceType_v4i32);
2127 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); 2144 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem);
2128 Variable *T = makeReg(Dest->getType()); 2145 Variable *T = makeReg(Dest->getType());
(...skipping 2310 matching lines...) Expand 10 before | Expand all | Expand 10 after
4439 Str << "\t.align\t" << Align << "\n"; 4456 Str << "\t.align\t" << Align << "\n";
4440 Str << MangledName << ":\n"; 4457 Str << MangledName << ":\n";
4441 for (SizeT i = 0; i < Size; ++i) { 4458 for (SizeT i = 0; i < Size; ++i) {
4442 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; 4459 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n";
4443 } 4460 }
4444 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; 4461 Str << "\t.size\t" << MangledName << ", " << Size << "\n";
4445 } 4462 }
4446 } 4463 }
4447 4464
4448 } // end of namespace Ice 4465 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698