OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |