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