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 2265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2276 Edx = Traits::RegisterSet::Reg_dx; | 2276 Edx = Traits::RegisterSet::Reg_dx; |
2277 break; | 2277 break; |
2278 case IceType_i8: | 2278 case IceType_i8: |
2279 Eax = Traits::RegisterSet::Reg_al; | 2279 Eax = Traits::RegisterSet::Reg_al; |
2280 Edx = Traits::RegisterSet::Reg_ah; | 2280 Edx = Traits::RegisterSet::Reg_ah; |
2281 break; | 2281 break; |
2282 } | 2282 } |
2283 T_edx = makeReg(Ty, Edx); | 2283 T_edx = makeReg(Ty, Edx); |
2284 _mov(T, Src0, Eax); | 2284 _mov(T, Src0, Eax); |
2285 _mov(T_edx, Ctx->getConstantZero(Ty)); | 2285 _mov(T_edx, Ctx->getConstantZero(Ty)); |
2286 _div(T, Src1, T_edx); | 2286 _div(T_edx, Src1, T); |
| 2287 _redefined(Context.insert<InstFakeDef>(T, T_edx)); |
2287 _mov(Dest, T); | 2288 _mov(Dest, T); |
2288 } break; | 2289 } break; |
2289 case InstArithmetic::Sdiv: | 2290 case InstArithmetic::Sdiv: |
2290 // TODO(stichnot): Enable this after doing better performance and cross | 2291 // TODO(stichnot): Enable this after doing better performance and cross |
2291 // testing. | 2292 // testing. |
2292 if (false && Func->getOptLevel() >= Opt_1) { | 2293 if (false && Func->getOptLevel() >= Opt_1) { |
2293 // Optimize division by constant power of 2, but not for Om1 or O0, just | 2294 // Optimize division by constant power of 2, but not for Om1 or O0, just |
2294 // to keep things simple there. | 2295 // to keep things simple there. |
2295 if (auto *C = llvm::dyn_cast<ConstantInteger32>(Src1)) { | 2296 if (auto *C = llvm::dyn_cast<ConstantInteger32>(Src1)) { |
2296 const int32_t Divisor = C->getValue(); | 2297 const int32_t Divisor = C->getValue(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2336 case IceType_i16: | 2337 case IceType_i16: |
2337 T_edx = makeReg(Ty, Traits::RegisterSet::Reg_dx); | 2338 T_edx = makeReg(Ty, Traits::RegisterSet::Reg_dx); |
2338 _mov(T, Src0, Traits::RegisterSet::Reg_ax); | 2339 _mov(T, Src0, Traits::RegisterSet::Reg_ax); |
2339 break; | 2340 break; |
2340 case IceType_i8: | 2341 case IceType_i8: |
2341 T_edx = makeReg(IceType_i16, Traits::RegisterSet::Reg_ax); | 2342 T_edx = makeReg(IceType_i16, Traits::RegisterSet::Reg_ax); |
2342 _mov(T, Src0, Traits::RegisterSet::Reg_al); | 2343 _mov(T, Src0, Traits::RegisterSet::Reg_al); |
2343 break; | 2344 break; |
2344 } | 2345 } |
2345 _cbwdq(T_edx, T); | 2346 _cbwdq(T_edx, T); |
2346 _idiv(T, Src1, T_edx); | 2347 _idiv(T_edx, Src1, T); |
| 2348 _redefined(Context.insert<InstFakeDef>(T, T_edx)); |
2347 _mov(Dest, T); | 2349 _mov(Dest, T); |
2348 break; | 2350 break; |
2349 case InstArithmetic::Urem: { | 2351 case InstArithmetic::Urem: { |
2350 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); | 2352 Src1 = legalize(Src1, Legal_Reg | Legal_Mem); |
2351 RegNumT Eax; | 2353 RegNumT Eax; |
2352 RegNumT Edx; | 2354 RegNumT Edx; |
2353 switch (Ty) { | 2355 switch (Ty) { |
2354 default: | 2356 default: |
2355 llvm::report_fatal_error("Bad type for urem"); | 2357 llvm::report_fatal_error("Bad type for urem"); |
2356 case IceType_i64: | 2358 case IceType_i64: |
2357 Eax = Traits::getRaxOrDie(); | 2359 Eax = Traits::getRaxOrDie(); |
2358 Edx = Traits::getRdxOrDie(); | 2360 Edx = Traits::getRdxOrDie(); |
2359 break; | 2361 break; |
2360 case IceType_i32: | 2362 case IceType_i32: |
2361 Eax = Traits::RegisterSet::Reg_eax; | 2363 Eax = Traits::RegisterSet::Reg_eax; |
2362 Edx = Traits::RegisterSet::Reg_edx; | 2364 Edx = Traits::RegisterSet::Reg_edx; |
2363 break; | 2365 break; |
2364 case IceType_i16: | 2366 case IceType_i16: |
2365 Eax = Traits::RegisterSet::Reg_ax; | 2367 Eax = Traits::RegisterSet::Reg_ax; |
2366 Edx = Traits::RegisterSet::Reg_dx; | 2368 Edx = Traits::RegisterSet::Reg_dx; |
2367 break; | 2369 break; |
2368 case IceType_i8: | 2370 case IceType_i8: |
2369 Eax = Traits::RegisterSet::Reg_al; | 2371 Eax = Traits::RegisterSet::Reg_al; |
2370 Edx = Traits::RegisterSet::Reg_ah; | 2372 Edx = Traits::RegisterSet::Reg_ah; |
2371 break; | 2373 break; |
2372 } | 2374 } |
2373 T_edx = makeReg(Ty, Edx); | 2375 T_edx = makeReg(Ty, Edx); |
2374 _mov(T_edx, Ctx->getConstantZero(Ty)); | 2376 _mov(T_edx, Ctx->getConstantZero(Ty)); |
2375 _mov(T, Src0, Eax); | 2377 _mov(T, Src0, Eax); |
2376 _div(T_edx, Src1, T); | 2378 _div(T, Src1, T_edx); |
| 2379 _redefined(Context.insert<InstFakeDef>(T_edx, T)); |
2377 if (Ty == IceType_i8) { | 2380 if (Ty == IceType_i8) { |
2378 // Register ah must be moved into one of {al,bl,cl,dl} before it can be | 2381 // Register ah must be moved into one of {al,bl,cl,dl} before it can be |
2379 // moved into a general 8-bit register. | 2382 // moved into a general 8-bit register. |
2380 auto *T_AhRcvr = makeReg(Ty); | 2383 auto *T_AhRcvr = makeReg(Ty); |
2381 T_AhRcvr->setRegClass(RCX86_IsAhRcvr); | 2384 T_AhRcvr->setRegClass(RCX86_IsAhRcvr); |
2382 _mov(T_AhRcvr, T_edx); | 2385 _mov(T_AhRcvr, T_edx); |
2383 T_edx = T_AhRcvr; | 2386 T_edx = T_AhRcvr; |
2384 } | 2387 } |
2385 _mov(Dest, T_edx); | 2388 _mov(Dest, T_edx); |
2386 } break; | 2389 } break; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2443 Edx = Traits::RegisterSet::Reg_dx; | 2446 Edx = Traits::RegisterSet::Reg_dx; |
2444 break; | 2447 break; |
2445 case IceType_i8: | 2448 case IceType_i8: |
2446 Eax = Traits::RegisterSet::Reg_al; | 2449 Eax = Traits::RegisterSet::Reg_al; |
2447 Edx = Traits::RegisterSet::Reg_ah; | 2450 Edx = Traits::RegisterSet::Reg_ah; |
2448 break; | 2451 break; |
2449 } | 2452 } |
2450 T_edx = makeReg(Ty, Edx); | 2453 T_edx = makeReg(Ty, Edx); |
2451 _mov(T, Src0, Eax); | 2454 _mov(T, Src0, Eax); |
2452 _cbwdq(T_edx, T); | 2455 _cbwdq(T_edx, T); |
2453 _idiv(T_edx, Src1, T); | 2456 _idiv(T, Src1, T_edx); |
| 2457 _redefined(Context.insert<InstFakeDef>(T_edx, T)); |
2454 if (Ty == IceType_i8) { | 2458 if (Ty == IceType_i8) { |
2455 // Register ah must be moved into one of {al,bl,cl,dl} before it can be | 2459 // Register ah must be moved into one of {al,bl,cl,dl} before it can be |
2456 // moved into a general 8-bit register. | 2460 // moved into a general 8-bit register. |
2457 auto *T_AhRcvr = makeReg(Ty); | 2461 auto *T_AhRcvr = makeReg(Ty); |
2458 T_AhRcvr->setRegClass(RCX86_IsAhRcvr); | 2462 T_AhRcvr->setRegClass(RCX86_IsAhRcvr); |
2459 _mov(T_AhRcvr, T_edx); | 2463 _mov(T_AhRcvr, T_edx); |
2460 T_edx = T_AhRcvr; | 2464 T_edx = T_AhRcvr; |
2461 } | 2465 } |
2462 _mov(Dest, T_edx); | 2466 _mov(Dest, T_edx); |
2463 } break; | 2467 } break; |
(...skipping 5570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8034 emitGlobal(*Var, SectionSuffix); | 8038 emitGlobal(*Var, SectionSuffix); |
8035 } | 8039 } |
8036 } | 8040 } |
8037 } break; | 8041 } break; |
8038 } | 8042 } |
8039 } | 8043 } |
8040 } // end of namespace X86NAMESPACE | 8044 } // end of namespace X86NAMESPACE |
8041 } // end of namespace Ice | 8045 } // end of namespace Ice |
8042 | 8046 |
8043 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H | 8047 #endif // SUBZERO_SRC_ICETARGETLOWERINGX86BASEIMPL_H |
OLD | NEW |