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

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2384433002: [Subzero][MIPS] Implement conditional branches with 64-bit integer compares (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Removed changes of issue 2376233004 which were added to this patch by mistake Created 4 years, 2 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
OLDNEW
1 // 1 //
2 // The Subzero Code Generator 2 // The Subzero Code Generator
3 // 3 //
4 // This file is distributed under the University of Illinois Open Source 4 // This file is distributed under the University of Illinois Open Source
5 // License. See LICENSE.TXT for details. 5 // License. See LICENSE.TXT for details.
6 // 6 //
7 //===----------------------------------------------------------------------===// 7 //===----------------------------------------------------------------------===//
8 /// 8 ///
9 /// \file 9 /// \file
10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost 10 /// \brief Implements the TargetLoweringMIPS32 class, which consists almost
(...skipping 2221 matching lines...) Expand 10 before | Expand all | Expand 10 after
2232 auto *BooleanR = legalizeToReg(Boolean); 2232 auto *BooleanR = legalizeToReg(Boolean);
2233 _br(TargetTrue, TargetFalse, BooleanR, CondMIPS32::Cond::EQZ); 2233 _br(TargetTrue, TargetFalse, BooleanR, CondMIPS32::Cond::EQZ);
2234 return; 2234 return;
2235 } 2235 }
2236 if (Producer->getKind() == Inst::Icmp) { 2236 if (Producer->getKind() == Inst::Icmp) {
2237 const InstIcmp *CompareInst = llvm::cast<InstIcmp>(Producer); 2237 const InstIcmp *CompareInst = llvm::cast<InstIcmp>(Producer);
2238 Operand *Src0 = CompareInst->getSrc(0); 2238 Operand *Src0 = CompareInst->getSrc(0);
2239 Operand *Src1 = CompareInst->getSrc(1); 2239 Operand *Src1 = CompareInst->getSrc(1);
2240 const Type Src0Ty = Src0->getType(); 2240 const Type Src0Ty = Src0->getType();
2241 assert(Src0Ty == Src1->getType()); 2241 assert(Src0Ty == Src1->getType());
2242
2243 Variable *Src0R = nullptr;
2244 Variable *Src1R = nullptr;
2245 Variable *Src0HiR = nullptr;
2246 Variable *Src1HiR = nullptr;
2242 if (Src0Ty == IceType_i64) { 2247 if (Src0Ty == IceType_i64) {
2243 UnimplementedLoweringError(this, Instr); 2248 Src0R = legalizeToReg(loOperand(Src0));
2244 return; 2249 Src1R = legalizeToReg(loOperand(Src1));
2245 } 2250 Src0HiR = legalizeToReg(hiOperand(Src0));
2246 auto *Src0R = legalizeToReg(Src0); 2251 Src1HiR = legalizeToReg(hiOperand(Src1));
2247 auto *Src1R = legalizeToReg(Src1); 2252 } else {
2248 auto *DestT = makeReg(Src0Ty); 2253 Src0R = legalizeToReg(Src0);
2254 Src1R = legalizeToReg(Src1);
2255 }
2256 auto *DestT = makeReg(IceType_i32);
2257
2249 switch (CompareInst->getCondition()) { 2258 switch (CompareInst->getCondition()) {
2250 default: 2259 default:
2251 break; 2260 llvm_unreachable("unexpected condition");
2261 return;
2252 case InstIcmp::Eq: { 2262 case InstIcmp::Eq: {
2253 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::NE); 2263 if (Src0Ty == IceType_i64) {
2254 break; 2264 auto *T1 = I32Reg();
2265 auto *T2 = I32Reg();
2266 auto *T3 = I32Reg();
2267 _xor(T1, Src0HiR, Src1HiR);
2268 _xor(T2, Src0R, Src1R);
2269 _or(T3, T1, T2);
2270 _mov(DestT, T3);
2271 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2272 } else {
2273 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::NE);
2274 }
2275 return;
2255 } 2276 }
2256 case InstIcmp::Ne: { 2277 case InstIcmp::Ne: {
2257 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::EQ); 2278 if (Src0Ty == IceType_i64) {
2258 break; 2279 auto *T1 = I32Reg();
2280 auto *T2 = I32Reg();
2281 auto *T3 = I32Reg();
2282 _xor(T1, Src0HiR, Src1HiR);
2283 _xor(T2, Src0R, Src1R);
2284 _or(T3, T1, T2);
2285 _mov(DestT, T3);
2286 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ);
2287 } else {
2288 _br(TargetTrue, TargetFalse, Src0R, Src1R, CondMIPS32::Cond::EQ);
2289 }
2290 return;
2259 } 2291 }
2260 case InstIcmp::Ugt: { 2292 case InstIcmp::Ugt: {
2261 _sltu(DestT, Src1R, Src0R); 2293 if (Src0Ty == IceType_i64) {
2262 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); 2294 auto *T1 = I32Reg();
2263 break; 2295 auto *T2 = I32Reg();
2296 auto *T3 = I32Reg();
2297 auto *T4 = I32Reg();
2298 auto *T5 = I32Reg();
2299 _xor(T1, Src0HiR, Src1HiR);
2300 _sltu(T2, Src1HiR, Src0HiR);
2301 _xori(T3, T2, 1);
2302 _sltu(T4, Src1R, Src0R);
2303 _xori(T5, T4, 1);
2304 _movz(T3, T5, T1);
2305 _mov(DestT, T3);
2306 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2307 } else {
2308 _sltu(DestT, Src1R, Src0R);
2309 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ);
2310 }
2311 return;
2264 } 2312 }
2265 case InstIcmp::Uge: { 2313 case InstIcmp::Uge: {
2266 _sltu(DestT, Src0R, Src1R); 2314 if (Src0Ty == IceType_i64) {
2267 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); 2315 auto *T1 = I32Reg();
2268 break; 2316 auto *T2 = I32Reg();
2317 auto *T3 = I32Reg();
2318 _xor(T1, Src0HiR, Src1HiR);
2319 _sltu(T2, Src0HiR, Src1HiR);
2320 _sltu(T3, Src0R, Src1R);
2321 _movz(T2, T3, T1);
2322 _mov(DestT, T2);
2323 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2324 } else {
2325 _sltu(DestT, Src0R, Src1R);
2326 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2327 }
2328 return;
2269 } 2329 }
2270 case InstIcmp::Ult: { 2330 case InstIcmp::Ult: {
2271 _sltu(DestT, Src0R, Src1R); 2331 if (Src0Ty == IceType_i64) {
2272 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); 2332 auto *T1 = I32Reg();
2273 break; 2333 auto *T2 = I32Reg();
2334 auto *T3 = I32Reg();
2335 auto *T4 = I32Reg();
2336 auto *T5 = I32Reg();
2337 _xor(T1, Src0HiR, Src1HiR);
2338 _sltu(T2, Src0HiR, Src1HiR);
2339 _xori(T3, T2, 1);
2340 _sltu(T4, Src0R, Src1R);
2341 _xori(T5, T4, 1);
2342 _movz(T3, T5, T1);
2343 _mov(DestT, T3);
2344 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2345 } else {
2346 _sltu(DestT, Src0R, Src1R);
2347 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ);
2348 }
2349 return;
2274 } 2350 }
2275 case InstIcmp::Ule: { 2351 case InstIcmp::Ule: {
2276 _sltu(DestT, Src1R, Src0R); 2352 if (Src0Ty == IceType_i64) {
2277 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); 2353 auto *T1 = I32Reg();
2278 break; 2354 auto *T2 = I32Reg();
2355 auto *T3 = I32Reg();
2356 _xor(T1, Src0HiR, Src1HiR);
2357 _sltu(T2, Src1HiR, Src0HiR);
2358 _sltu(T3, Src1R, Src0R);
2359 _movz(T2, T3, T1);
2360 _mov(DestT, T2);
2361 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2362 } else {
2363 _sltu(DestT, Src1R, Src0R);
2364 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2365 }
2366 return;
2279 } 2367 }
2280 case InstIcmp::Sgt: { 2368 case InstIcmp::Sgt: {
2281 _slt(DestT, Src1R, Src0R); 2369 if (Src0Ty == IceType_i64) {
2282 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); 2370 auto *T1 = I32Reg();
2283 break; 2371 auto *T2 = I32Reg();
2372 auto *T3 = I32Reg();
2373 auto *T4 = I32Reg();
2374 auto *T5 = I32Reg();
2375 _xor(T1, Src0HiR, Src1HiR);
2376 _slt(T2, Src1HiR, Src0HiR);
2377 _xori(T3, T2, 1);
2378 _sltu(T4, Src1R, Src0R);
2379 _xori(T5, T4, 1);
2380 _movz(T3, T5, T1);
2381 _mov(DestT, T3);
2382 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2383 } else {
2384 _slt(DestT, Src1R, Src0R);
2385 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ);
2386 }
2387 return;
2284 } 2388 }
2285 case InstIcmp::Sge: { 2389 case InstIcmp::Sge: {
2286 _slt(DestT, Src0R, Src1R); 2390 if (Src0Ty == IceType_i64) {
2287 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); 2391 auto *T1 = I32Reg();
2288 break; 2392 auto *T2 = I32Reg();
2393 auto *T3 = I32Reg();
2394 _xor(T1, Src0HiR, Src1HiR);
2395 _slt(T2, Src0HiR, Src1HiR);
2396 _sltu(T3, Src0R, Src1R);
2397 _movz(T2, T3, T1);
2398 _mov(DestT, T2);
2399 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2400 } else {
2401 _slt(DestT, Src0R, Src1R);
2402 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2403 }
2404 return;
2289 } 2405 }
2290 case InstIcmp::Slt: { 2406 case InstIcmp::Slt: {
2291 _slt(DestT, Src0R, Src1R); 2407 if (Src0Ty == IceType_i64) {
2292 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ); 2408 auto *T1 = I32Reg();
2293 break; 2409 auto *T2 = I32Reg();
2410 auto *T3 = I32Reg();
2411 auto *T4 = I32Reg();
2412 auto *T5 = I32Reg();
2413 _xor(T1, Src0HiR, Src1HiR);
2414 _slt(T2, Src0HiR, Src1HiR);
2415 _xori(T3, T2, 1);
2416 _sltu(T4, Src0R, Src1R);
2417 _xori(T5, T4, 1);
2418 _movz(T3, T5, T1);
2419 _mov(DestT, T3);
2420 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2421 } else {
2422 _slt(DestT, Src0R, Src1R);
2423 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::EQZ);
2424 }
2425 return;
2294 } 2426 }
2295 case InstIcmp::Sle: { 2427 case InstIcmp::Sle: {
2296 _slt(DestT, Src1R, Src0R); 2428 if (Src0Ty == IceType_i64) {
2297 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ); 2429 auto *T1 = I32Reg();
2298 break; 2430 auto *T2 = I32Reg();
2431 auto *T3 = I32Reg();
2432 _xor(T1, Src0HiR, Src1HiR);
2433 _slt(T2, Src1HiR, Src0HiR);
2434 _sltu(T3, Src1R, Src0R);
2435 _movz(T2, T3, T1);
2436 _mov(DestT, T2);
2437 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2438 } else {
2439 _slt(DestT, Src1R, Src0R);
2440 _br(TargetTrue, TargetFalse, DestT, CondMIPS32::Cond::NEZ);
2441 }
2442 return;
2299 } 2443 }
2300 } 2444 }
2301 } 2445 }
2302 } 2446 }
2303 2447
2304 void TargetMIPS32::lowerCall(const InstCall *Instr) { 2448 void TargetMIPS32::lowerCall(const InstCall *Instr) {
2305 NeedsStackAlignment = true; 2449 NeedsStackAlignment = true;
2306 2450
2307 // Assign arguments to registers and stack. Also reserve stack. 2451 // Assign arguments to registers and stack. Also reserve stack.
2308 TargetMIPS32::CallingConv CC; 2452 TargetMIPS32::CallingConv CC;
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
2906 InstIcmp::ICond Condition = Instr->getCondition(); 3050 InstIcmp::ICond Condition = Instr->getCondition();
2907 3051
2908 Variable *Src0LoR = legalizeToReg(loOperand(Src0)); 3052 Variable *Src0LoR = legalizeToReg(loOperand(Src0));
2909 Variable *Src0HiR = legalizeToReg(hiOperand(Src0)); 3053 Variable *Src0HiR = legalizeToReg(hiOperand(Src0));
2910 Variable *Src1LoR = legalizeToReg(loOperand(Src1)); 3054 Variable *Src1LoR = legalizeToReg(loOperand(Src1));
2911 Variable *Src1HiR = legalizeToReg(hiOperand(Src1)); 3055 Variable *Src1HiR = legalizeToReg(hiOperand(Src1));
2912 3056
2913 switch (Condition) { 3057 switch (Condition) {
2914 default: 3058 default:
2915 llvm_unreachable("unexpected condition"); 3059 llvm_unreachable("unexpected condition");
2916 break; 3060 return;
2917 case InstIcmp::Eq: { 3061 case InstIcmp::Eq: {
2918 auto *T1 = I32Reg(); 3062 auto *T1 = I32Reg();
2919 auto *T2 = I32Reg(); 3063 auto *T2 = I32Reg();
2920 auto *T3 = I32Reg(); 3064 auto *T3 = I32Reg();
2921 auto *T4 = I32Reg(); 3065 auto *T4 = I32Reg();
2922 _xor(T1, Src0HiR, Src1HiR); 3066 _xor(T1, Src0HiR, Src1HiR);
2923 _xor(T2, Src0LoR, Src1LoR); 3067 _xor(T2, Src0LoR, Src1LoR);
2924 _or(T3, T1, T2); 3068 _or(T3, T1, T2);
2925 _sltiu(T4, T3, 1); 3069 _sltiu(T4, T3, 1);
2926 _mov(Dest, T4); 3070 _mov(Dest, T4);
(...skipping 1362 matching lines...) Expand 10 before | Expand all | Expand 10 after
4289 Str << "\t.set\t" 4433 Str << "\t.set\t"
4290 << "nomips16\n"; 4434 << "nomips16\n";
4291 } 4435 }
4292 4436
4293 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; 4437 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM];
4294 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; 4438 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM];
4295 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; 4439 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM];
4296 4440
4297 } // end of namespace MIPS32 4441 } // end of namespace MIPS32
4298 } // end of namespace Ice 4442 } // end of namespace Ice
OLDNEW
« no previous file with comments | « no previous file | tests_lit/llvm2ice_tests/64bit.pnacl.ll » ('j') | tests_lit/llvm2ice_tests/64bit.pnacl.ll » ('J')

Powered by Google App Engine
This is Rietveld 408576698