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

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2357143002: [SubZero] Fix floating-point comparison for MIPS (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 years, 3 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 2450 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 if (isVectorType(Dest->getType())) { 2461 if (isVectorType(Dest->getType())) {
2462 UnimplementedLoweringError(this, Instr); 2462 UnimplementedLoweringError(this, Instr);
2463 return; 2463 return;
2464 } 2464 }
2465 2465
2466 auto *Src0 = Instr->getSrc(0); 2466 auto *Src0 = Instr->getSrc(0);
2467 auto *Src1 = Instr->getSrc(1); 2467 auto *Src1 = Instr->getSrc(1);
2468 auto *Zero = getZero(); 2468 auto *Zero = getZero();
2469 2469
2470 InstFcmp::FCond Cond = Instr->getCondition(); 2470 InstFcmp::FCond Cond = Instr->getCondition();
2471 auto *DestR = legalizeToReg(Dest); 2471 auto *DestR = makeReg(Dest->getType());
2472 auto *Src0R = legalizeToReg(Src0); 2472 auto *Src0R = legalizeToReg(Src0);
2473 auto *Src1R = legalizeToReg(Src1); 2473 auto *Src1R = legalizeToReg(Src1);
2474 const Type Src0Ty = Src0->getType(); 2474 const Type Src0Ty = Src0->getType();
2475 2475
2476 Operand *FCC0 = OperandMIPS32FCC::create(getFunc(), OperandMIPS32FCC::FCC0); 2476 Operand *FCC0 = OperandMIPS32FCC::create(getFunc(), OperandMIPS32FCC::FCC0);
2477 2477
2478 switch (Cond) { 2478 switch (Cond) {
2479 default: { 2479 default: {
2480 UnimplementedLoweringError(this, Instr); 2480 UnimplementedLoweringError(this, Instr);
2481 return; 2481 return;
2482 } 2482 }
2483 case InstFcmp::False: { 2483 case InstFcmp::False: {
2484 Context.insert<InstFakeUse>(Src0R); 2484 Context.insert<InstFakeUse>(Src0R);
2485 Context.insert<InstFakeUse>(Src1R); 2485 Context.insert<InstFakeUse>(Src1R);
2486 _addiu(DestR, Zero, 0); 2486 _addiu(DestR, Zero, 0);
2487 _mov(Dest, DestR); 2487 _mov(Dest, DestR);
2488 break; 2488 break;
2489 } 2489 }
2490 case InstFcmp::Oeq: { 2490 case InstFcmp::Oeq: {
2491 if (Src0Ty == IceType_f32) { 2491 if (Src0Ty == IceType_f32) {
2492 _c_eq_s(Src0R, Src1R); 2492 _c_eq_s(Src0R, Src1R);
2493 } else { 2493 } else {
2494 _c_eq_d(Src0R, Src1R); 2494 _c_eq_d(Src0R, Src1R);
2495 } 2495 }
2496 _addiu(DestR, Zero, 1);
2496 _movf(DestR, Zero, FCC0); 2497 _movf(DestR, Zero, FCC0);
2497 _mov(Dest, DestR); 2498 _mov(Dest, DestR);
2498 break; 2499 break;
2499 } 2500 }
2500 case InstFcmp::Ogt: { 2501 case InstFcmp::Ogt: {
2501 if (Src0Ty == IceType_f32) { 2502 if (Src0Ty == IceType_f32) {
2502 _c_ule_s(Src0R, Src1R); 2503 _c_ule_s(Src0R, Src1R);
2503 } else { 2504 } else {
2504 _c_ule_d(Src0R, Src1R); 2505 _c_ule_d(Src0R, Src1R);
2505 } 2506 }
2507 _addiu(DestR, Zero, 1);
2506 _movt(DestR, Zero, FCC0); 2508 _movt(DestR, Zero, FCC0);
2507 _mov(Dest, DestR); 2509 _mov(Dest, DestR);
2508 break; 2510 break;
2509 } 2511 }
2510 case InstFcmp::Oge: { 2512 case InstFcmp::Oge: {
2511 if (Src0Ty == IceType_f32) { 2513 if (Src0Ty == IceType_f32) {
2512 _c_ult_s(Src0R, Src1R); 2514 _c_ult_s(Src0R, Src1R);
2513 } else { 2515 } else {
2514 _c_ult_d(Src0R, Src1R); 2516 _c_ult_d(Src0R, Src1R);
2515 } 2517 }
2518 _addiu(DestR, Zero, 1);
2516 _movt(DestR, Zero, FCC0); 2519 _movt(DestR, Zero, FCC0);
2517 _mov(Dest, DestR); 2520 _mov(Dest, DestR);
2518 break; 2521 break;
2519 } 2522 }
2520 case InstFcmp::Olt: { 2523 case InstFcmp::Olt: {
2521 if (Src0Ty == IceType_f32) { 2524 if (Src0Ty == IceType_f32) {
2522 _c_olt_s(Src0R, Src1R); 2525 _c_olt_s(Src0R, Src1R);
2523 } else { 2526 } else {
2524 _c_olt_d(Src0R, Src1R); 2527 _c_olt_d(Src0R, Src1R);
2525 } 2528 }
2529 _addiu(DestR, Zero, 1);
2526 _movf(DestR, Zero, FCC0); 2530 _movf(DestR, Zero, FCC0);
2527 _mov(Dest, DestR); 2531 _mov(Dest, DestR);
2528 break; 2532 break;
2529 } 2533 }
2530 case InstFcmp::Ole: { 2534 case InstFcmp::Ole: {
2531 if (Src0Ty == IceType_f32) { 2535 if (Src0Ty == IceType_f32) {
2532 _c_ole_s(Src0R, Src1R); 2536 _c_ole_s(Src0R, Src1R);
2533 } else { 2537 } else {
2534 _c_ole_d(Src0R, Src1R); 2538 _c_ole_d(Src0R, Src1R);
2535 } 2539 }
2540 _addiu(DestR, Zero, 1);
2536 _movf(DestR, Zero, FCC0); 2541 _movf(DestR, Zero, FCC0);
2537 _mov(Dest, DestR); 2542 _mov(Dest, DestR);
2538 break; 2543 break;
2539 } 2544 }
2540 case InstFcmp::One: { 2545 case InstFcmp::One: {
2541 if (Src0Ty == IceType_f32) { 2546 if (Src0Ty == IceType_f32) {
2542 _c_ueq_s(Src0R, Src1R); 2547 _c_ueq_s(Src0R, Src1R);
2543 } else { 2548 } else {
2544 _c_ueq_d(Src0R, Src1R); 2549 _c_ueq_d(Src0R, Src1R);
2545 } 2550 }
2551 _addiu(DestR, Zero, 1);
2546 _movt(DestR, Zero, FCC0); 2552 _movt(DestR, Zero, FCC0);
2547 _mov(Dest, DestR); 2553 _mov(Dest, DestR);
2548 break; 2554 break;
2549 } 2555 }
2550 case InstFcmp::Ord: { 2556 case InstFcmp::Ord: {
2551 if (Src0Ty == IceType_f32) { 2557 if (Src0Ty == IceType_f32) {
2552 _c_un_s(Src0R, Src1R); 2558 _c_un_s(Src0R, Src1R);
2553 } else { 2559 } else {
2554 _c_un_d(Src0R, Src1R); 2560 _c_un_d(Src0R, Src1R);
2555 } 2561 }
2562 _addiu(DestR, Zero, 1);
2556 _movt(DestR, Zero, FCC0); 2563 _movt(DestR, Zero, FCC0);
2557 _mov(Dest, DestR); 2564 _mov(Dest, DestR);
2558 break; 2565 break;
2559 } 2566 }
2560 case InstFcmp::Ueq: { 2567 case InstFcmp::Ueq: {
2561 if (Src0Ty == IceType_f32) { 2568 if (Src0Ty == IceType_f32) {
2562 _c_ueq_s(Src0R, Src1R); 2569 _c_ueq_s(Src0R, Src1R);
2563 } else { 2570 } else {
2564 _c_ueq_d(Src0R, Src1R); 2571 _c_ueq_d(Src0R, Src1R);
2565 } 2572 }
2573 _addiu(DestR, Zero, 1);
2566 _movf(DestR, Zero, FCC0); 2574 _movf(DestR, Zero, FCC0);
2567 _mov(Dest, DestR); 2575 _mov(Dest, DestR);
2568 break; 2576 break;
2569 } 2577 }
2570 case InstFcmp::Ugt: { 2578 case InstFcmp::Ugt: {
2571 if (Src0Ty == IceType_f32) { 2579 if (Src0Ty == IceType_f32) {
2572 _c_ole_s(Src0R, Src1R); 2580 _c_ole_s(Src0R, Src1R);
2573 } else { 2581 } else {
2574 _c_ole_d(Src0R, Src1R); 2582 _c_ole_d(Src0R, Src1R);
2575 } 2583 }
2584 _addiu(DestR, Zero, 1);
2576 _movt(DestR, Zero, FCC0); 2585 _movt(DestR, Zero, FCC0);
2577 _mov(Dest, DestR); 2586 _mov(Dest, DestR);
2578 break; 2587 break;
2579 } 2588 }
2580 case InstFcmp::Uge: { 2589 case InstFcmp::Uge: {
2581 if (Src0Ty == IceType_f32) { 2590 if (Src0Ty == IceType_f32) {
2582 _c_olt_s(Src0R, Src1R); 2591 _c_olt_s(Src0R, Src1R);
2583 } else { 2592 } else {
2584 _c_olt_d(Src0R, Src1R); 2593 _c_olt_d(Src0R, Src1R);
2585 } 2594 }
2595 _addiu(DestR, Zero, 1);
2586 _movt(DestR, Zero, FCC0); 2596 _movt(DestR, Zero, FCC0);
2587 _mov(Dest, DestR); 2597 _mov(Dest, DestR);
2588 break; 2598 break;
2589 } 2599 }
2590 case InstFcmp::Ult: { 2600 case InstFcmp::Ult: {
2591 if (Src0Ty == IceType_f32) { 2601 if (Src0Ty == IceType_f32) {
2592 _c_ult_s(Src0R, Src1R); 2602 _c_ult_s(Src0R, Src1R);
2593 } else { 2603 } else {
2594 _c_ult_d(Src0R, Src1R); 2604 _c_ult_d(Src0R, Src1R);
2595 } 2605 }
2606 _addiu(DestR, Zero, 1);
2596 _movf(DestR, Zero, FCC0); 2607 _movf(DestR, Zero, FCC0);
2597 _mov(Dest, DestR); 2608 _mov(Dest, DestR);
2598 break; 2609 break;
2599 } 2610 }
2600 case InstFcmp::Ule: { 2611 case InstFcmp::Ule: {
2601 if (Src0Ty == IceType_f32) { 2612 if (Src0Ty == IceType_f32) {
2602 _c_ule_s(Src0R, Src1R); 2613 _c_ule_s(Src0R, Src1R);
2603 } else { 2614 } else {
2604 _c_ule_d(Src0R, Src1R); 2615 _c_ule_d(Src0R, Src1R);
2605 } 2616 }
2617 _addiu(DestR, Zero, 1);
2606 _movf(DestR, Zero, FCC0); 2618 _movf(DestR, Zero, FCC0);
2607 _mov(Dest, DestR); 2619 _mov(Dest, DestR);
2608 break; 2620 break;
2609 } 2621 }
2610 case InstFcmp::Une: { 2622 case InstFcmp::Une: {
2611 if (Src0Ty == IceType_f32) { 2623 if (Src0Ty == IceType_f32) {
2612 _c_eq_s(Src0R, Src1R); 2624 _c_eq_s(Src0R, Src1R);
2613 } else { 2625 } else {
2614 _c_eq_d(Src0R, Src1R); 2626 _c_eq_d(Src0R, Src1R);
2615 } 2627 }
2628 _addiu(DestR, Zero, 1);
2616 _movt(DestR, Zero, FCC0); 2629 _movt(DestR, Zero, FCC0);
2617 _mov(Dest, DestR); 2630 _mov(Dest, DestR);
2618 break; 2631 break;
2619 } 2632 }
2620 case InstFcmp::Uno: { 2633 case InstFcmp::Uno: {
2621 if (Src0Ty == IceType_f32) { 2634 if (Src0Ty == IceType_f32) {
2622 _c_un_s(Src0R, Src1R); 2635 _c_un_s(Src0R, Src1R);
2623 } else { 2636 } else {
2624 _c_un_d(Src0R, Src1R); 2637 _c_un_d(Src0R, Src1R);
2625 } 2638 }
2639 _addiu(DestR, Zero, 1);
2626 _movf(DestR, Zero, FCC0); 2640 _movf(DestR, Zero, FCC0);
2627 _mov(Dest, DestR); 2641 _mov(Dest, DestR);
2628 break; 2642 break;
2629 } 2643 }
2630 case InstFcmp::True: { 2644 case InstFcmp::True: {
2631 Context.insert<InstFakeUse>(Src0R); 2645 Context.insert<InstFakeUse>(Src0R);
2632 Context.insert<InstFakeUse>(Src1R); 2646 Context.insert<InstFakeUse>(Src1R);
2633 _addiu(DestR, Zero, 1); 2647 _addiu(DestR, Zero, 1);
2634 _mov(Dest, DestR); 2648 _mov(Dest, DestR);
2635 break; 2649 break;
(...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after
3716 Str << "\t.set\t" 3730 Str << "\t.set\t"
3717 << "nomips16\n"; 3731 << "nomips16\n";
3718 } 3732 }
3719 3733
3720 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; 3734 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM];
3721 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; 3735 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM];
3722 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; 3736 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM];
3723 3737
3724 } // end of namespace MIPS32 3738 } // end of namespace MIPS32
3725 } // end of namespace Ice 3739 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698