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

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: Use the _redefined() utility. 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 _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
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
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
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
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