OLD | NEW |
1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// | 1 //===- subzero/src/IceTargetLoweringX86BaseImpl.h - x86 lowering -*- C++ -*-==// |
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 /// \file | 10 /// \file |
(...skipping 2118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2129 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2129 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
2130 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type | 2130 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type |
2131 Variable *T_1 = nullptr; | 2131 Variable *T_1 = nullptr; |
2132 if (Traits::Is64Bit && Dest->getType() == IceType_i64) { | 2132 if (Traits::Is64Bit && Dest->getType() == IceType_i64) { |
2133 T_1 = makeReg(IceType_i64); | 2133 T_1 = makeReg(IceType_i64); |
2134 } else { | 2134 } else { |
2135 assert(Dest->getType() != IceType_i64); | 2135 assert(Dest->getType() != IceType_i64); |
2136 T_1 = makeReg(IceType_i32); | 2136 T_1 = makeReg(IceType_i32); |
2137 } | 2137 } |
2138 // cvt() requires its integer argument to be a GPR. | 2138 // cvt() requires its integer argument to be a GPR. |
2139 T_1->setMustHaveReg(); | |
2140 Variable *T_2 = makeReg(Dest->getType()); | 2139 Variable *T_2 = makeReg(Dest->getType()); |
2141 _cvt(T_1, Src0RM, Traits::Insts::Cvt::Tss2si); | 2140 _cvt(T_1, Src0RM, Traits::Insts::Cvt::Tss2si); |
2142 _mov(T_2, T_1); // T_1 and T_2 may have different integer types | 2141 _mov(T_2, T_1); // T_1 and T_2 may have different integer types |
2143 if (Dest->getType() == IceType_i1) | 2142 if (Dest->getType() == IceType_i1) |
2144 _and(T_2, Ctx->getConstantInt1(1)); | 2143 _and(T_2, Ctx->getConstantInt1(1)); |
2145 _mov(Dest, T_2); | 2144 _mov(Dest, T_2); |
2146 } | 2145 } |
2147 break; | 2146 break; |
2148 case InstCast::Fptoui: | 2147 case InstCast::Fptoui: |
2149 if (isVectorType(Dest->getType())) { | 2148 if (isVectorType(Dest->getType())) { |
(...skipping 28 matching lines...) Expand all Loading... |
2178 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2177 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
2179 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type | 2178 // t1.i32 = cvt Src0RM; t2.dest_type = t1; Dest = t2.dest_type |
2180 assert(Dest->getType() != IceType_i64); | 2179 assert(Dest->getType() != IceType_i64); |
2181 Variable *T_1 = nullptr; | 2180 Variable *T_1 = nullptr; |
2182 if (Traits::Is64Bit && Dest->getType() == IceType_i32) { | 2181 if (Traits::Is64Bit && Dest->getType() == IceType_i32) { |
2183 T_1 = makeReg(IceType_i64); | 2182 T_1 = makeReg(IceType_i64); |
2184 } else { | 2183 } else { |
2185 assert(Dest->getType() != IceType_i32); | 2184 assert(Dest->getType() != IceType_i32); |
2186 T_1 = makeReg(IceType_i32); | 2185 T_1 = makeReg(IceType_i32); |
2187 } | 2186 } |
2188 T_1->setMustHaveReg(); | |
2189 Variable *T_2 = makeReg(Dest->getType()); | 2187 Variable *T_2 = makeReg(Dest->getType()); |
2190 _cvt(T_1, Src0RM, Traits::Insts::Cvt::Tss2si); | 2188 _cvt(T_1, Src0RM, Traits::Insts::Cvt::Tss2si); |
2191 _mov(T_2, T_1); // T_1 and T_2 may have different integer types | 2189 _mov(T_2, T_1); // T_1 and T_2 may have different integer types |
2192 if (Dest->getType() == IceType_i1) | 2190 if (Dest->getType() == IceType_i1) |
2193 _and(T_2, Ctx->getConstantInt1(1)); | 2191 _and(T_2, Ctx->getConstantInt1(1)); |
2194 _mov(Dest, T_2); | 2192 _mov(Dest, T_2); |
2195 } | 2193 } |
2196 break; | 2194 break; |
2197 case InstCast::Sitofp: | 2195 case InstCast::Sitofp: |
2198 if (isVectorType(Dest->getType())) { | 2196 if (isVectorType(Dest->getType())) { |
(...skipping 21 matching lines...) Expand all Loading... |
2220 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); | 2218 Operand *Src0RM = legalize(Inst->getSrc(0), Legal_Reg | Legal_Mem); |
2221 // Sign-extend the operand. | 2219 // Sign-extend the operand. |
2222 // t1.i32 = movsx Src0RM; t2 = Cvt t1.i32; Dest = t2 | 2220 // t1.i32 = movsx Src0RM; t2 = Cvt t1.i32; Dest = t2 |
2223 Variable *T_1 = nullptr; | 2221 Variable *T_1 = nullptr; |
2224 if (Traits::Is64Bit && Src0RM->getType() == IceType_i64) { | 2222 if (Traits::Is64Bit && Src0RM->getType() == IceType_i64) { |
2225 T_1 = makeReg(IceType_i64); | 2223 T_1 = makeReg(IceType_i64); |
2226 } else { | 2224 } else { |
2227 assert(Src0RM->getType() != IceType_i64); | 2225 assert(Src0RM->getType() != IceType_i64); |
2228 T_1 = makeReg(IceType_i32); | 2226 T_1 = makeReg(IceType_i32); |
2229 } | 2227 } |
2230 T_1->setMustHaveReg(); | |
2231 Variable *T_2 = makeReg(Dest->getType()); | 2228 Variable *T_2 = makeReg(Dest->getType()); |
2232 if (Src0RM->getType() == T_1->getType()) | 2229 if (Src0RM->getType() == T_1->getType()) |
2233 _mov(T_1, Src0RM); | 2230 _mov(T_1, Src0RM); |
2234 else | 2231 else |
2235 _movsx(T_1, Src0RM); | 2232 _movsx(T_1, Src0RM); |
2236 _cvt(T_2, T_1, Traits::Insts::Cvt::Si2ss); | 2233 _cvt(T_2, T_1, Traits::Insts::Cvt::Si2ss); |
2237 _mov(Dest, T_2); | 2234 _mov(Dest, T_2); |
2238 } | 2235 } |
2239 break; | 2236 break; |
2240 case InstCast::Uitofp: { | 2237 case InstCast::Uitofp: { |
(...skipping 28 matching lines...) Expand all Loading... |
2269 // Zero-extend the operand. | 2266 // Zero-extend the operand. |
2270 // t1.i32 = movzx Src0RM; t2 = Cvt t1.i32; Dest = t2 | 2267 // t1.i32 = movzx Src0RM; t2 = Cvt t1.i32; Dest = t2 |
2271 Variable *T_1 = nullptr; | 2268 Variable *T_1 = nullptr; |
2272 if (Traits::Is64Bit && Src0RM->getType() == IceType_i32) { | 2269 if (Traits::Is64Bit && Src0RM->getType() == IceType_i32) { |
2273 T_1 = makeReg(IceType_i64); | 2270 T_1 = makeReg(IceType_i64); |
2274 } else { | 2271 } else { |
2275 assert(Src0RM->getType() != IceType_i64); | 2272 assert(Src0RM->getType() != IceType_i64); |
2276 assert(Traits::Is64Bit || Src0RM->getType() != IceType_i32); | 2273 assert(Traits::Is64Bit || Src0RM->getType() != IceType_i32); |
2277 T_1 = makeReg(IceType_i32); | 2274 T_1 = makeReg(IceType_i32); |
2278 } | 2275 } |
2279 T_1->setMustHaveReg(); | |
2280 Variable *T_2 = makeReg(Dest->getType()); | 2276 Variable *T_2 = makeReg(Dest->getType()); |
2281 if (Src0RM->getType() == T_1->getType()) | 2277 if (Src0RM->getType() == T_1->getType()) |
2282 _mov(T_1, Src0RM); | 2278 _mov(T_1, Src0RM); |
2283 else | 2279 else |
2284 _movzx(T_1, Src0RM); | 2280 _movzx(T_1, Src0RM); |
2285 _cvt(T_2, T_1, Traits::Insts::Cvt::Si2ss); | 2281 _cvt(T_2, T_1, Traits::Insts::Cvt::Si2ss); |
2286 _mov(Dest, T_2); | 2282 _mov(Dest, T_2); |
2287 } | 2283 } |
2288 break; | 2284 break; |
2289 } | 2285 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2378 _mov(DestHi, T_Hi); | 2374 _mov(DestHi, T_Hi); |
2379 } | 2375 } |
2380 } break; | 2376 } break; |
2381 case IceType_f64: { | 2377 case IceType_f64: { |
2382 assert(Src0->getType() == IceType_i64); | 2378 assert(Src0->getType() == IceType_i64); |
2383 if (Traits::Is64Bit) { | 2379 if (Traits::Is64Bit) { |
2384 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem); | 2380 Operand *Src0RM = legalize(Src0, Legal_Reg | Legal_Mem); |
2385 Variable *T = makeReg(IceType_f64); | 2381 Variable *T = makeReg(IceType_f64); |
2386 // Movd requires its fp argument (in this case, the bitcast | 2382 // Movd requires its fp argument (in this case, the bitcast |
2387 // destination) to be an xmm register. | 2383 // destination) to be an xmm register. |
2388 T->setMustHaveReg(); | |
2389 _movd(T, Src0RM); | 2384 _movd(T, Src0RM); |
2390 _mov(Dest, T); | 2385 _mov(Dest, T); |
2391 } else { | 2386 } else { |
2392 Src0 = legalize(Src0); | 2387 Src0 = legalize(Src0); |
2393 if (llvm::isa<typename Traits::X86OperandMem>(Src0)) { | 2388 if (llvm::isa<typename Traits::X86OperandMem>(Src0)) { |
2394 Variable *T = Func->makeVariable(Dest->getType()); | 2389 Variable *T = Func->makeVariable(Dest->getType()); |
2395 _movq(T, Src0); | 2390 _movq(T, Src0); |
2396 _movq(Dest, T); | 2391 _movq(Dest, T); |
2397 break; | 2392 break; |
2398 } | 2393 } |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2625 Operand *Src1RM = legalize(Src1, Legal_Reg | Legal_Mem); | 2620 Operand *Src1RM = legalize(Src1, Legal_Reg | Legal_Mem); |
2626 Variable *T = nullptr; | 2621 Variable *T = nullptr; |
2627 _mov(T, Src0); | 2622 _mov(T, Src0); |
2628 _ucomiss(T, Src1RM); | 2623 _ucomiss(T, Src1RM); |
2629 if (!HasC2) { | 2624 if (!HasC2) { |
2630 assert(Traits::TableFcmp[Index].Default); | 2625 assert(Traits::TableFcmp[Index].Default); |
2631 _setcc(Dest, Traits::TableFcmp[Index].C1); | 2626 _setcc(Dest, Traits::TableFcmp[Index].C1); |
2632 return; | 2627 return; |
2633 } | 2628 } |
2634 } | 2629 } |
2635 Constant *Default = Ctx->getConstantInt32(Traits::TableFcmp[Index].Default); | 2630 Constant *Default = |
| 2631 Ctx->getConstantInt(Dest->getType(), Traits::TableFcmp[Index].Default); |
2636 _mov(Dest, Default); | 2632 _mov(Dest, Default); |
2637 if (HasC1) { | 2633 if (HasC1) { |
2638 typename Traits::Insts::Label *Label = | 2634 typename Traits::Insts::Label *Label = |
2639 Traits::Insts::Label::create(Func, this); | 2635 Traits::Insts::Label::create(Func, this); |
2640 _br(Traits::TableFcmp[Index].C1, Label); | 2636 _br(Traits::TableFcmp[Index].C1, Label); |
2641 if (HasC2) { | 2637 if (HasC2) { |
2642 _br(Traits::TableFcmp[Index].C2, Label); | 2638 _br(Traits::TableFcmp[Index].C2, Label); |
2643 } | 2639 } |
2644 Constant *NonDefault = | 2640 Constant *NonDefault = |
2645 Ctx->getConstantInt32(!Traits::TableFcmp[Index].Default); | 2641 Ctx->getConstantInt(Dest->getType(), !Traits::TableFcmp[Index].Default); |
2646 _mov_redefined(Dest, NonDefault); | 2642 _mov_redefined(Dest, NonDefault); |
2647 Context.insert(Label); | 2643 Context.insert(Label); |
2648 } | 2644 } |
2649 } | 2645 } |
2650 | 2646 |
2651 template <class Machine> | 2647 template <class Machine> |
2652 void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) { | 2648 void TargetX86Base<Machine>::lowerIcmp(const InstIcmp *Inst) { |
2653 Operand *Src0 = legalize(Inst->getSrc(0)); | 2649 Operand *Src0 = legalize(Inst->getSrc(0)); |
2654 Operand *Src1 = legalize(Inst->getSrc(1)); | 2650 Operand *Src1 = legalize(Inst->getSrc(1)); |
2655 Variable *Dest = Inst->getDest(); | 2651 Variable *Dest = Inst->getDest(); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2782 Operand *Src0 = legalize(Inst->getSrc(0)); | 2778 Operand *Src0 = legalize(Inst->getSrc(0)); |
2783 Operand *Src1 = legalize(Inst->getSrc(1)); | 2779 Operand *Src1 = legalize(Inst->getSrc(1)); |
2784 Variable *Dest = Inst->getDest(); | 2780 Variable *Dest = Inst->getDest(); |
2785 InstIcmp::ICond Condition = Inst->getCondition(); | 2781 InstIcmp::ICond Condition = Inst->getCondition(); |
2786 size_t Index = static_cast<size_t>(Condition); | 2782 size_t Index = static_cast<size_t>(Condition); |
2787 assert(Index < Traits::TableIcmp64Size); | 2783 assert(Index < Traits::TableIcmp64Size); |
2788 Operand *Src0LoRM = legalize(loOperand(Src0), Legal_Reg | Legal_Mem); | 2784 Operand *Src0LoRM = legalize(loOperand(Src0), Legal_Reg | Legal_Mem); |
2789 Operand *Src0HiRM = legalize(hiOperand(Src0), Legal_Reg | Legal_Mem); | 2785 Operand *Src0HiRM = legalize(hiOperand(Src0), Legal_Reg | Legal_Mem); |
2790 Operand *Src1LoRI = legalize(loOperand(Src1), Legal_Reg | Legal_Imm); | 2786 Operand *Src1LoRI = legalize(loOperand(Src1), Legal_Reg | Legal_Imm); |
2791 Operand *Src1HiRI = legalize(hiOperand(Src1), Legal_Reg | Legal_Imm); | 2787 Operand *Src1HiRI = legalize(hiOperand(Src1), Legal_Reg | Legal_Imm); |
2792 Constant *Zero = Ctx->getConstantZero(IceType_i32); | 2788 Constant *Zero = Ctx->getConstantZero(Dest->getType()); |
2793 Constant *One = Ctx->getConstantInt32(1); | 2789 Constant *One = Ctx->getConstantInt(Dest->getType(), 1); |
2794 typename Traits::Insts::Label *LabelFalse = | 2790 typename Traits::Insts::Label *LabelFalse = |
2795 Traits::Insts::Label::create(Func, this); | 2791 Traits::Insts::Label::create(Func, this); |
2796 typename Traits::Insts::Label *LabelTrue = | 2792 typename Traits::Insts::Label *LabelTrue = |
2797 Traits::Insts::Label::create(Func, this); | 2793 Traits::Insts::Label::create(Func, this); |
2798 _mov(Dest, One); | 2794 _mov(Dest, One); |
2799 _cmp(Src0HiRM, Src1HiRI); | 2795 _cmp(Src0HiRM, Src1HiRI); |
2800 if (Traits::TableIcmp64[Index].C1 != Traits::Cond::Br_None) | 2796 if (Traits::TableIcmp64[Index].C1 != Traits::Cond::Br_None) |
2801 _br(Traits::TableIcmp64[Index].C1, LabelTrue); | 2797 _br(Traits::TableIcmp64[Index].C1, LabelTrue); |
2802 if (Traits::TableIcmp64[Index].C2 != Traits::Cond::Br_None) | 2798 if (Traits::TableIcmp64[Index].C2 != Traits::Cond::Br_None) |
2803 _br(Traits::TableIcmp64[Index].C2, LabelFalse); | 2799 _br(Traits::TableIcmp64[Index].C2, LabelFalse); |
(...skipping 2279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5083 Const = llvm::cast<Constant>(From); | 5079 Const = llvm::cast<Constant>(From); |
5084 } | 5080 } |
5085 // There should be no constants of vector type (other than undef). | 5081 // There should be no constants of vector type (other than undef). |
5086 assert(!isVectorType(Ty)); | 5082 assert(!isVectorType(Ty)); |
5087 | 5083 |
5088 // If the operand is a 64 bit constant integer we need to legalize it to a | 5084 // If the operand is a 64 bit constant integer we need to legalize it to a |
5089 // register in x86-64. | 5085 // register in x86-64. |
5090 if (Traits::Is64Bit) { | 5086 if (Traits::Is64Bit) { |
5091 if (llvm::isa<ConstantInteger64>(Const)) { | 5087 if (llvm::isa<ConstantInteger64>(Const)) { |
5092 Variable *V = copyToReg(Const, RegNum); | 5088 Variable *V = copyToReg(Const, RegNum); |
5093 V->setMustHaveReg(); | |
5094 return V; | 5089 return V; |
5095 } | 5090 } |
5096 } | 5091 } |
5097 | 5092 |
5098 // If the operand is an 32 bit constant integer, we should check whether we | 5093 // If the operand is an 32 bit constant integer, we should check whether we |
5099 // need to randomize it or pool it. | 5094 // need to randomize it or pool it. |
5100 if (ConstantInteger32 *C = llvm::dyn_cast<ConstantInteger32>(Const)) { | 5095 if (ConstantInteger32 *C = llvm::dyn_cast<ConstantInteger32>(Const)) { |
5101 Operand *NewConst = randomizeOrPoolImmediate(C, RegNum); | 5096 Operand *NewConst = randomizeOrPoolImmediate(C, RegNum); |
5102 if (NewConst != Const) { | 5097 if (NewConst != Const) { |
5103 return NewConst; | 5098 return NewConst; |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5509 } | 5504 } |
5510 // the offset is not eligible for blinding or pooling, return the original | 5505 // the offset is not eligible for blinding or pooling, return the original |
5511 // mem operand | 5506 // mem operand |
5512 return MemOperand; | 5507 return MemOperand; |
5513 } | 5508 } |
5514 | 5509 |
5515 } // end of namespace X86Internal | 5510 } // end of namespace X86Internal |
5516 } // end of namespace Ice | 5511 } // end of namespace Ice |
5517 | 5512 |
5518 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H | 5513 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H |
OLD | NEW |