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 1947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1958 _mov(T_Hi, T_Lo); | 1958 _mov(T_Hi, T_Lo); |
1959 _sar(T_Hi, Shift); | 1959 _sar(T_Hi, Shift); |
1960 _mov(DestHi, T_Hi); | 1960 _mov(DestHi, T_Hi); |
1961 } else if (Src0RM->getType() == IceType_i1) { | 1961 } else if (Src0RM->getType() == IceType_i1) { |
1962 // t1 = src | 1962 // t1 = src |
1963 // shl t1, dst_bitwidth - 1 | 1963 // shl t1, dst_bitwidth - 1 |
1964 // sar t1, dst_bitwidth - 1 | 1964 // sar t1, dst_bitwidth - 1 |
1965 // dst = t1 | 1965 // dst = t1 |
1966 size_t DestBits = X86_CHAR_BIT * typeWidthInBytes(Dest->getType()); | 1966 size_t DestBits = X86_CHAR_BIT * typeWidthInBytes(Dest->getType()); |
1967 Constant *ShiftAmount = Ctx->getConstantInt(IceType_i32, DestBits - 1); | 1967 Constant *ShiftAmount = Ctx->getConstantInt(IceType_i32, DestBits - 1); |
1968 Variable *T = NULL; | 1968 Variable *T = makeReg(Dest->getType()); |
1969 _mov(T, Src0RM); | 1969 if (typeWidthInBytes(Dest->getType()) <= |
1970 typeWidthInBytes(Src0RM->getType())) { | |
1971 _mov(T, Src0RM); | |
1972 } else { | |
1973 // Widen the souce using movsx or movzx. (It doesn't matter | |
halyavin
2014/09/08 06:28:07
FYI: souce->source.
Jim Stichnoth
2014/09/08 17:01:02
Done.
| |
1974 // which one, since the following shl/sar overwrite the bits.) | |
1975 _movzx(T, Src0RM); | |
1976 } | |
1970 _shl(T, ShiftAmount); | 1977 _shl(T, ShiftAmount); |
1971 _sar(T, ShiftAmount); | 1978 _sar(T, ShiftAmount); |
1972 _mov(Dest, T); | 1979 _mov(Dest, T); |
1973 } else { | 1980 } else { |
1974 // t1 = movsx src; dst = t1 | 1981 // t1 = movsx src; dst = t1 |
1975 Variable *T = makeReg(Dest->getType()); | 1982 Variable *T = makeReg(Dest->getType()); |
1976 _movsx(T, Src0RM); | 1983 _movsx(T, Src0RM); |
1977 _mov(Dest, T); | 1984 _mov(Dest, T); |
1978 } | 1985 } |
1979 break; | 1986 break; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2031 _pand(T, OneMask); | 2038 _pand(T, OneMask); |
2032 _movp(Dest, T); | 2039 _movp(Dest, T); |
2033 } else { | 2040 } else { |
2034 Operand *Src0 = Inst->getSrc(0); | 2041 Operand *Src0 = Inst->getSrc(0); |
2035 if (Src0->getType() == IceType_i64) | 2042 if (Src0->getType() == IceType_i64) |
2036 Src0 = loOperand(Src0); | 2043 Src0 = loOperand(Src0); |
2037 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem); | 2044 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem); |
2038 // t1 = trunc Src0RM; Dest = t1 | 2045 // t1 = trunc Src0RM; Dest = t1 |
2039 Variable *T = NULL; | 2046 Variable *T = NULL; |
2040 _mov(T, Src0RM); | 2047 _mov(T, Src0RM); |
2048 if (Dest->getType() == IceType_i1) | |
2049 _and(T, Ctx->getConstantInt(IceType_i1, 1)); | |
2041 _mov(Dest, T); | 2050 _mov(Dest, T); |
2042 } | 2051 } |
2043 break; | 2052 break; |
2044 } | 2053 } |
2045 case InstCast::Fptrunc: | 2054 case InstCast::Fptrunc: |
2046 case InstCast::Fpext: { | 2055 case InstCast::Fpext: { |
2047 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2056 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
2048 // t1 = cvt Src0RM; Dest = t1 | 2057 // t1 = cvt Src0RM; Dest = t1 |
2049 Variable *T = makeReg(Dest->getType()); | 2058 Variable *T = makeReg(Dest->getType()); |
2050 _cvt(T, Src0RM); | 2059 _cvt(T, Src0RM); |
(...skipping 23 matching lines...) Expand all Loading... | |
2074 // TODO: Call the correct compiler-rt helper function. | 2083 // TODO: Call the correct compiler-rt helper function. |
2075 Call->addArg(Inst->getSrc(0)); | 2084 Call->addArg(Inst->getSrc(0)); |
2076 lowerCall(Call); | 2085 lowerCall(Call); |
2077 } else { | 2086 } else { |
2078 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2087 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
2079 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type | 2088 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type |
2080 Variable *T_1 = makeReg(IceType_i32); | 2089 Variable *T_1 = makeReg(IceType_i32); |
2081 Variable *T_2 = makeReg(Dest->getType()); | 2090 Variable *T_2 = makeReg(Dest->getType()); |
2082 _cvt(T_1, Src0RM); | 2091 _cvt(T_1, Src0RM); |
2083 _mov(T_2, T_1); // T_1 and T_2 may have different integer types | 2092 _mov(T_2, T_1); // T_1 and T_2 may have different integer types |
2093 if (Dest->getType() == IceType_i1) | |
2094 _and(T_2, Ctx->getConstantInt(IceType_i1, 1)); | |
2084 _mov(Dest, T_2); | 2095 _mov(Dest, T_2); |
2085 T_2->setPreferredRegister(T_1, true); | 2096 T_2->setPreferredRegister(T_1, true); |
2086 } | 2097 } |
2087 break; | 2098 break; |
2088 case InstCast::Fptoui: | 2099 case InstCast::Fptoui: |
2089 if (isVectorType(Dest->getType())) { | 2100 if (isVectorType(Dest->getType())) { |
2090 assert(Dest->getType() == IceType_v4i32 && | 2101 assert(Dest->getType() == IceType_v4i32 && |
2091 Inst->getSrc(0)->getType() == IceType_v4f32); | 2102 Inst->getSrc(0)->getType() == IceType_v4f32); |
2092 const SizeT MaxSrcs = 1; | 2103 const SizeT MaxSrcs = 1; |
2093 InstCall *Call = makeHelperCall("Sz_fptoui_v4f32", Dest, MaxSrcs); | 2104 InstCall *Call = makeHelperCall("Sz_fptoui_v4f32", Dest, MaxSrcs); |
(...skipping 15 matching lines...) Expand all Loading... | |
2109 Call->addArg(Inst->getSrc(0)); | 2120 Call->addArg(Inst->getSrc(0)); |
2110 lowerCall(Call); | 2121 lowerCall(Call); |
2111 return; | 2122 return; |
2112 } else { | 2123 } else { |
2113 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2124 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
2114 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type | 2125 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type |
2115 Variable *T_1 = makeReg(IceType_i32); | 2126 Variable *T_1 = makeReg(IceType_i32); |
2116 Variable *T_2 = makeReg(Dest->getType()); | 2127 Variable *T_2 = makeReg(Dest->getType()); |
2117 _cvt(T_1, Src0RM); | 2128 _cvt(T_1, Src0RM); |
2118 _mov(T_2, T_1); // T_1 and T_2 may have different integer types | 2129 _mov(T_2, T_1); // T_1 and T_2 may have different integer types |
2130 if (Dest->getType() == IceType_i1) | |
2131 _and(T_2, Ctx->getConstantInt(IceType_i1, 1)); | |
2119 _mov(Dest, T_2); | 2132 _mov(Dest, T_2); |
2120 T_2->setPreferredRegister(T_1, true); | 2133 T_2->setPreferredRegister(T_1, true); |
2121 } | 2134 } |
2122 break; | 2135 break; |
2123 case InstCast::Sitofp: | 2136 case InstCast::Sitofp: |
2124 if (isVectorType(Dest->getType())) { | 2137 if (isVectorType(Dest->getType())) { |
2125 assert(Dest->getType() == IceType_v4f32 && | 2138 assert(Dest->getType() == IceType_v4f32 && |
2126 Inst->getSrc(0)->getType() == IceType_v4i32); | 2139 Inst->getSrc(0)->getType() == IceType_v4i32); |
2127 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2140 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
2128 Variable *T = makeReg(Dest->getType()); | 2141 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"; | 4452 Str << "\t.align\t" << Align << "\n"; |
4440 Str << MangledName << ":\n"; | 4453 Str << MangledName << ":\n"; |
4441 for (SizeT i = 0; i < Size; ++i) { | 4454 for (SizeT i = 0; i < Size; ++i) { |
4442 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; | 4455 Str << "\t.byte\t" << (((unsigned)Data[i]) & 0xff) << "\n"; |
4443 } | 4456 } |
4444 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; | 4457 Str << "\t.size\t" << MangledName << ", " << Size << "\n"; |
4445 } | 4458 } |
4446 } | 4459 } |
4447 | 4460 |
4448 } // end of namespace Ice | 4461 } // end of namespace Ice |
OLD | NEW |