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