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

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: Add comments, clean up test file 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 1947 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698