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

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: Make OPTM1 change similar to CHECK change 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
« no previous file with comments | « src/IceGlobalContext.cpp ('k') | tests_lit/llvm2ice_tests/64bit.pnacl.ll » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1929 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/IceGlobalContext.cpp ('k') | tests_lit/llvm2ice_tests/64bit.pnacl.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698