| 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 1929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1940 } | 1940 } |
| 1941 } else if (Dest->getType() == IceType_i64) { | 1941 } else if (Dest->getType() == IceType_i64) { |
| 1942 // t1=movsx src; t2=t1; t2=sar t2, 31; dst.lo=t1; dst.hi=t2 | 1942 // t1=movsx src; t2=t1; t2=sar t2, 31; dst.lo=t1; dst.hi=t2 |
| 1943 Constant *Shift = Ctx->getConstantInt(IceType_i32, 31); | 1943 Constant *Shift = Ctx->getConstantInt(IceType_i32, 31); |
| 1944 Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); | 1944 Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| 1945 Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); | 1945 Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| 1946 Variable *T_Lo = makeReg(DestLo->getType()); | 1946 Variable *T_Lo = makeReg(DestLo->getType()); |
| 1947 if (Src0RM->getType() == IceType_i32) { | 1947 if (Src0RM->getType() == IceType_i32) { |
| 1948 _mov(T_Lo, Src0RM); | 1948 _mov(T_Lo, Src0RM); |
| 1949 } else if (Src0RM->getType() == IceType_i1) { | 1949 } else if (Src0RM->getType() == IceType_i1) { |
| 1950 _mov(T_Lo, Src0RM); | 1950 _movzx(T_Lo, Src0RM); |
| 1951 _shl(T_Lo, Shift); | 1951 _shl(T_Lo, Shift); |
| 1952 _sar(T_Lo, Shift); | 1952 _sar(T_Lo, Shift); |
| 1953 } else { | 1953 } else { |
| 1954 _movsx(T_Lo, Src0RM); | 1954 _movsx(T_Lo, Src0RM); |
| 1955 } | 1955 } |
| 1956 _mov(DestLo, T_Lo); | 1956 _mov(DestLo, T_Lo); |
| 1957 Variable *T_Hi = NULL; | 1957 Variable *T_Hi = NULL; |
| 1958 _mov(T_Hi, T_Lo); | 1958 _mov(T_Hi, T_Lo); |
| 1959 _sar(T_Hi, Shift); | 1959 if (Src0RM->getType() != IceType_i1) |
| 1960 // For i1, the sar instruction is already done above. |
| 1961 _sar(T_Hi, Shift); |
| 1960 _mov(DestHi, T_Hi); | 1962 _mov(DestHi, T_Hi); |
| 1961 } else if (Src0RM->getType() == IceType_i1) { | 1963 } else if (Src0RM->getType() == IceType_i1) { |
| 1962 // t1 = src | 1964 // t1 = src |
| 1963 // shl t1, dst_bitwidth - 1 | 1965 // shl t1, dst_bitwidth - 1 |
| 1964 // sar t1, dst_bitwidth - 1 | 1966 // sar t1, dst_bitwidth - 1 |
| 1965 // dst = t1 | 1967 // dst = t1 |
| 1966 size_t DestBits = X86_CHAR_BIT * typeWidthInBytes(Dest->getType()); | 1968 size_t DestBits = X86_CHAR_BIT * typeWidthInBytes(Dest->getType()); |
| 1967 Constant *ShiftAmount = Ctx->getConstantInt(IceType_i32, DestBits - 1); | 1969 Constant *ShiftAmount = Ctx->getConstantInt(IceType_i32, DestBits - 1); |
| 1968 Variable *T = NULL; | 1970 Variable *T = makeReg(Dest->getType()); |
| 1969 _mov(T, Src0RM); | 1971 if (typeWidthInBytes(Dest->getType()) <= |
| 1972 typeWidthInBytes(Src0RM->getType())) { |
| 1973 _mov(T, Src0RM); |
| 1974 } else { |
| 1975 // Widen the source using movsx or movzx. (It doesn't matter |
| 1976 // which one, since the following shl/sar overwrite the bits.) |
| 1977 _movzx(T, Src0RM); |
| 1978 } |
| 1970 _shl(T, ShiftAmount); | 1979 _shl(T, ShiftAmount); |
| 1971 _sar(T, ShiftAmount); | 1980 _sar(T, ShiftAmount); |
| 1972 _mov(Dest, T); | 1981 _mov(Dest, T); |
| 1973 } else { | 1982 } else { |
| 1974 // t1 = movsx src; dst = t1 | 1983 // t1 = movsx src; dst = t1 |
| 1975 Variable *T = makeReg(Dest->getType()); | 1984 Variable *T = makeReg(Dest->getType()); |
| 1976 _movsx(T, Src0RM); | 1985 _movsx(T, Src0RM); |
| 1977 _mov(Dest, T); | 1986 _mov(Dest, T); |
| 1978 } | 1987 } |
| 1979 break; | 1988 break; |
| 1980 } | 1989 } |
| 1981 case InstCast::Zext: { | 1990 case InstCast::Zext: { |
| 1982 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 1991 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
| 1983 if (isVectorType(Dest->getType())) { | 1992 if (isVectorType(Dest->getType())) { |
| 1984 // onemask = materialize(1,1,...); dest = onemask & src | 1993 // onemask = materialize(1,1,...); dest = onemask & src |
| 1985 Type DestTy = Dest->getType(); | 1994 Type DestTy = Dest->getType(); |
| 1986 Variable *OneMask = makeVectorOfOnes(DestTy); | 1995 Variable *OneMask = makeVectorOfOnes(DestTy); |
| 1987 Variable *T = makeReg(DestTy); | 1996 Variable *T = makeReg(DestTy); |
| 1988 _movp(T, Src0RM); | 1997 _movp(T, Src0RM); |
| 1989 _pand(T, OneMask); | 1998 _pand(T, OneMask); |
| 1990 _movp(Dest, T); | 1999 _movp(Dest, T); |
| 1991 } else if (Dest->getType() == IceType_i64) { | 2000 } else if (Dest->getType() == IceType_i64) { |
| 1992 // t1=movzx src; dst.lo=t1; dst.hi=0 | 2001 // t1=movzx src; dst.lo=t1; dst.hi=0 |
| 1993 Constant *Zero = Ctx->getConstantZero(IceType_i32); | 2002 Constant *Zero = Ctx->getConstantZero(IceType_i32); |
| 1994 Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); | 2003 Variable *DestLo = llvm::cast<Variable>(loOperand(Dest)); |
| 1995 Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); | 2004 Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest)); |
| 1996 Variable *Tmp = makeReg(DestLo->getType()); | 2005 Variable *Tmp = makeReg(DestLo->getType()); |
| 1997 if (Src0RM->getType() == IceType_i32) { | 2006 if (Src0RM->getType() == IceType_i32) { |
| 1998 _mov(Tmp, Src0RM); | 2007 _mov(Tmp, Src0RM); |
| 1999 } else if (Src0RM->getType() == IceType_i1) { | |
| 2000 Constant *One = Ctx->getConstantInt(IceType_i32, 1); | |
| 2001 _mov(Tmp, Src0RM); | |
| 2002 _and(Tmp, One); | |
| 2003 } else { | 2008 } else { |
| 2004 _movzx(Tmp, Src0RM); | 2009 _movzx(Tmp, Src0RM); |
| 2005 } | 2010 } |
| 2011 if (Src0RM->getType() == IceType_i1) { |
| 2012 Constant *One = Ctx->getConstantInt(IceType_i32, 1); |
| 2013 _and(Tmp, One); |
| 2014 } |
| 2006 _mov(DestLo, Tmp); | 2015 _mov(DestLo, Tmp); |
| 2007 _mov(DestHi, Zero); | 2016 _mov(DestHi, Zero); |
| 2008 } else if (Src0RM->getType() == IceType_i1) { | 2017 } else if (Src0RM->getType() == IceType_i1) { |
| 2009 // t = Src0RM; t &= 1; Dest = t | 2018 // t = Src0RM; t &= 1; Dest = t |
| 2010 Constant *One = Ctx->getConstantInt(IceType_i32, 1); | 2019 Constant *One = Ctx->getConstantInt(IceType_i32, 1); |
| 2011 Variable *T = makeReg(IceType_i32); | 2020 Variable *T = makeReg(IceType_i32); |
| 2012 _movzx(T, Src0RM); | 2021 _movzx(T, Src0RM); |
| 2013 _and(T, One); | 2022 _and(T, One); |
| 2014 _mov(Dest, T); | 2023 _mov(Dest, T); |
| 2015 } else { | 2024 } else { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2031 _pand(T, OneMask); | 2040 _pand(T, OneMask); |
| 2032 _movp(Dest, T); | 2041 _movp(Dest, T); |
| 2033 } else { | 2042 } else { |
| 2034 Operand *Src0 = Inst->getSrc(0); | 2043 Operand *Src0 = Inst->getSrc(0); |
| 2035 if (Src0->getType() == IceType_i64) | 2044 if (Src0->getType() == IceType_i64) |
| 2036 Src0 = loOperand(Src0); | 2045 Src0 = loOperand(Src0); |
| 2037 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem); | 2046 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem); |
| 2038 // t1 = trunc Src0RM; Dest = t1 | 2047 // t1 = trunc Src0RM; Dest = t1 |
| 2039 Variable *T = NULL; | 2048 Variable *T = NULL; |
| 2040 _mov(T, Src0RM); | 2049 _mov(T, Src0RM); |
| 2050 if (Dest->getType() == IceType_i1) |
| 2051 _and(T, Ctx->getConstantInt(IceType_i1, 1)); |
| 2041 _mov(Dest, T); | 2052 _mov(Dest, T); |
| 2042 } | 2053 } |
| 2043 break; | 2054 break; |
| 2044 } | 2055 } |
| 2045 case InstCast::Fptrunc: | 2056 case InstCast::Fptrunc: |
| 2046 case InstCast::Fpext: { | 2057 case InstCast::Fpext: { |
| 2047 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2058 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
| 2048 // t1 = cvt Src0RM; Dest = t1 | 2059 // t1 = cvt Src0RM; Dest = t1 |
| 2049 Variable *T = makeReg(Dest->getType()); | 2060 Variable *T = makeReg(Dest->getType()); |
| 2050 _cvt(T, Src0RM); | 2061 _cvt(T, Src0RM); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2074 // TODO: Call the correct compiler-rt helper function. | 2085 // TODO: Call the correct compiler-rt helper function. |
| 2075 Call->addArg(Inst->getSrc(0)); | 2086 Call->addArg(Inst->getSrc(0)); |
| 2076 lowerCall(Call); | 2087 lowerCall(Call); |
| 2077 } else { | 2088 } else { |
| 2078 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2089 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
| 2079 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type | 2090 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type |
| 2080 Variable *T_1 = makeReg(IceType_i32); | 2091 Variable *T_1 = makeReg(IceType_i32); |
| 2081 Variable *T_2 = makeReg(Dest->getType()); | 2092 Variable *T_2 = makeReg(Dest->getType()); |
| 2082 _cvtt(T_1, Src0RM); | 2093 _cvtt(T_1, Src0RM); |
| 2083 _mov(T_2, T_1); // T_1 and T_2 may have different integer types | 2094 _mov(T_2, T_1); // T_1 and T_2 may have different integer types |
| 2095 if (Dest->getType() == IceType_i1) |
| 2096 _and(T_2, Ctx->getConstantInt(IceType_i1, 1)); |
| 2084 _mov(Dest, T_2); | 2097 _mov(Dest, T_2); |
| 2085 T_2->setPreferredRegister(T_1, true); | 2098 T_2->setPreferredRegister(T_1, true); |
| 2086 } | 2099 } |
| 2087 break; | 2100 break; |
| 2088 case InstCast::Fptoui: | 2101 case InstCast::Fptoui: |
| 2089 if (isVectorType(Dest->getType())) { | 2102 if (isVectorType(Dest->getType())) { |
| 2090 assert(Dest->getType() == IceType_v4i32 && | 2103 assert(Dest->getType() == IceType_v4i32 && |
| 2091 Inst->getSrc(0)->getType() == IceType_v4f32); | 2104 Inst->getSrc(0)->getType() == IceType_v4f32); |
| 2092 const SizeT MaxSrcs = 1; | 2105 const SizeT MaxSrcs = 1; |
| 2093 InstCall *Call = makeHelperCall("Sz_fptoui_v4f32", Dest, MaxSrcs); | 2106 InstCall *Call = makeHelperCall("Sz_fptoui_v4f32", Dest, MaxSrcs); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2109 Call->addArg(Inst->getSrc(0)); | 2122 Call->addArg(Inst->getSrc(0)); |
| 2110 lowerCall(Call); | 2123 lowerCall(Call); |
| 2111 return; | 2124 return; |
| 2112 } else { | 2125 } else { |
| 2113 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2126 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
| 2114 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type | 2127 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type |
| 2115 Variable *T_1 = makeReg(IceType_i32); | 2128 Variable *T_1 = makeReg(IceType_i32); |
| 2116 Variable *T_2 = makeReg(Dest->getType()); | 2129 Variable *T_2 = makeReg(Dest->getType()); |
| 2117 _cvtt(T_1, Src0RM); | 2130 _cvtt(T_1, Src0RM); |
| 2118 _mov(T_2, T_1); // T_1 and T_2 may have different integer types | 2131 _mov(T_2, T_1); // T_1 and T_2 may have different integer types |
| 2132 if (Dest->getType() == IceType_i1) |
| 2133 _and(T_2, Ctx->getConstantInt(IceType_i1, 1)); |
| 2119 _mov(Dest, T_2); | 2134 _mov(Dest, T_2); |
| 2120 T_2->setPreferredRegister(T_1, true); | 2135 T_2->setPreferredRegister(T_1, true); |
| 2121 } | 2136 } |
| 2122 break; | 2137 break; |
| 2123 case InstCast::Sitofp: | 2138 case InstCast::Sitofp: |
| 2124 if (isVectorType(Dest->getType())) { | 2139 if (isVectorType(Dest->getType())) { |
| 2125 assert(Dest->getType() == IceType_v4f32 && | 2140 assert(Dest->getType() == IceType_v4f32 && |
| 2126 Inst->getSrc(0)->getType() == IceType_v4i32); | 2141 Inst->getSrc(0)->getType() == IceType_v4i32); |
| 2127 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2142 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
| 2128 Variable *T = makeReg(Dest->getType()); | 2143 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"; | 4454 Str << "\t.align\t" << Align << "\n"; |
| 4440 Str << MangledName << ":\n"; | 4455 Str << MangledName << ":\n"; |
| 4441 for (SizeT i = 0; i < Size; ++i) { | 4456 for (SizeT i = 0; i < Size; ++i) { |
| 4442 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; | 4457 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; |
| 4443 } | 4458 } |
| 4444 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; | 4459 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; |
| 4445 } | 4460 } |
| 4446 } | 4461 } |
| 4447 | 4462 |
| 4448 } // end of namespace Ice | 4463 } // end of namespace Ice |
| OLD | NEW |