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

Side by Side Diff: src/IceTargetLoweringX86BaseImpl.h

Issue 2158213002: Subzero: Fix lowering for x86 div/rem instructions. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 years, 5 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 | « no previous file | no next file » | 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/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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698