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

Side by Side Diff: src/IceTargetLoweringMIPS32.cpp

Issue 2478113003: [SubZero] Utilize instructions with immediate operands (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addressed review comments Created 4 years, 1 month 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 | tests_lit/assembler/mips32/encoding_test_arith.ll » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2535 matching lines...) Expand 10 before | Expand all | Expand 10 after
2546 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1); 2546 lowerInt64Arithmetic(Instr, Instr->getDest(), Src0, Src1);
2547 return; 2547 return;
2548 } 2548 }
2549 if (isVectorType(Dest->getType())) { 2549 if (isVectorType(Dest->getType())) {
2550 llvm::report_fatal_error("Arithmetic: Destination type is vector"); 2550 llvm::report_fatal_error("Arithmetic: Destination type is vector");
2551 return; 2551 return;
2552 } 2552 }
2553 2553
2554 Variable *T = makeReg(Dest->getType()); 2554 Variable *T = makeReg(Dest->getType());
2555 Variable *Src0R = legalizeToReg(Src0); 2555 Variable *Src0R = legalizeToReg(Src0);
2556 Variable *Src1R = legalizeToReg(Src1); 2556 Variable *Src1R = nullptr;
2557 uint32_t Value = 0;
2558 bool IsSrc1Imm16 = false;
2559
2560 switch (Instr->getOp()) {
2561 case InstArithmetic::Add:
2562 case InstArithmetic::And:
2563 case InstArithmetic::Or:
2564 case InstArithmetic::Xor:
2565 case InstArithmetic::Sub:
2566 case InstArithmetic::Shl:
2567 case InstArithmetic::Lshr:
2568 case InstArithmetic::Ashr: {
2569 auto *Const32 = llvm::dyn_cast<ConstantInteger32>(Src1);
2570 if (Const32 != nullptr && isInt<16>(int32_t(Const32->getValue()))) {
2571 IsSrc1Imm16 = true;
2572 Value = Const32->getValue();
2573 } else {
2574 Src1R = legalizeToReg(Src1);
2575 }
2576 break;
2577 }
2578 default:
2579 Src1R = legalizeToReg(Src1);
2580 break;
2581 }
2557 constexpr uint32_t DivideByZeroTrapCode = 7; 2582 constexpr uint32_t DivideByZeroTrapCode = 7;
2558 2583
2559 switch (Instr->getOp()) { 2584 switch (Instr->getOp()) {
2560 case InstArithmetic::_num: 2585 case InstArithmetic::_num:
2561 break; 2586 break;
2562 case InstArithmetic::Add: 2587 case InstArithmetic::Add:
2563 _addu(T, Src0R, Src1R); 2588 if (IsSrc1Imm16) {
2589 _addiu(T, Src0R, Value);
2590 } else {
2591 _addu(T, Src0R, Src1R);
2592 }
2564 _mov(Dest, T); 2593 _mov(Dest, T);
2565 return; 2594 return;
2566 case InstArithmetic::And: 2595 case InstArithmetic::And:
2567 _and(T, Src0R, Src1R); 2596 if (IsSrc1Imm16) {
2597 _andi(T, Src0R, Value);
2598 } else {
2599 _and(T, Src0R, Src1R);
2600 }
2568 _mov(Dest, T); 2601 _mov(Dest, T);
2569 return; 2602 return;
2570 case InstArithmetic::Or: 2603 case InstArithmetic::Or:
2571 _or(T, Src0R, Src1R); 2604 if (IsSrc1Imm16) {
2605 _ori(T, Src0R, Value);
2606 } else {
2607 _or(T, Src0R, Src1R);
2608 }
2572 _mov(Dest, T); 2609 _mov(Dest, T);
2573 return; 2610 return;
2574 case InstArithmetic::Xor: 2611 case InstArithmetic::Xor:
2575 _xor(T, Src0R, Src1R); 2612 if (IsSrc1Imm16) {
2613 _xori(T, Src0R, Value);
2614 } else {
2615 _xor(T, Src0R, Src1R);
2616 }
2576 _mov(Dest, T); 2617 _mov(Dest, T);
2577 return; 2618 return;
2578 case InstArithmetic::Sub: 2619 case InstArithmetic::Sub:
2579 _subu(T, Src0R, Src1R); 2620 if (IsSrc1Imm16) {
2621 _addiu(T, Src0R, -Value);
2622 } else {
2623 _subu(T, Src0R, Src1R);
2624 }
2580 _mov(Dest, T); 2625 _mov(Dest, T);
2581 return; 2626 return;
2582 case InstArithmetic::Mul: { 2627 case InstArithmetic::Mul: {
2583 _mul(T, Src0R, Src1R); 2628 _mul(T, Src0R, Src1R);
2584 _mov(Dest, T); 2629 _mov(Dest, T);
2585 return; 2630 return;
2586 } 2631 }
2587 case InstArithmetic::Shl: { 2632 case InstArithmetic::Shl: {
2588 _sllv(T, Src0R, Src1R); 2633 if (IsSrc1Imm16) {
2634 _sll(T, Src0R, Value);
2635 } else {
2636 _sllv(T, Src0R, Src1R);
2637 }
2589 _mov(Dest, T); 2638 _mov(Dest, T);
2590 return; 2639 return;
2591 } 2640 }
2592 case InstArithmetic::Lshr: { 2641 case InstArithmetic::Lshr: {
2593 auto *T0R = Src0R; 2642 auto *T0R = Src0R;
2594 auto *T1R = Src1R; 2643 auto *T1R = Src1R;
2595 if (Dest->getType() != IceType_i32) { 2644 if (Dest->getType() != IceType_i32) {
2596 T0R = makeReg(IceType_i32); 2645 T0R = makeReg(IceType_i32);
2597 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R)); 2646 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R));
2598 T1R = makeReg(IceType_i32); 2647 if (!IsSrc1Imm16) {
2599 lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R)); 2648 T1R = makeReg(IceType_i32);
2649 lowerCast(InstCast::create(Func, InstCast::Zext, T1R, Src1R));
2650 }
2600 } 2651 }
2601 _srlv(T, T0R, T1R); 2652 if (IsSrc1Imm16) {
2653 _srl(T, T0R, Value);
2654 } else {
2655 _srlv(T, T0R, T1R);
2656 }
2602 _mov(Dest, T); 2657 _mov(Dest, T);
2603 return; 2658 return;
2604 } 2659 }
2605 case InstArithmetic::Ashr: { 2660 case InstArithmetic::Ashr: {
2606 _srav(T, Src0R, Src1R); 2661 if (IsSrc1Imm16) {
2662 _sra(T, Src0R, Value);
2663 } else {
2664 _srav(T, Src0R, Src1R);
2665 }
2607 _mov(Dest, T); 2666 _mov(Dest, T);
2608 return; 2667 return;
2609 } 2668 }
2610 case InstArithmetic::Udiv: { 2669 case InstArithmetic::Udiv: {
2611 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO); 2670 auto *T_Zero = I32Reg(RegMIPS32::Reg_ZERO);
2612 auto *T0R = Src0R; 2671 auto *T0R = Src0R;
2613 auto *T1R = Src1R; 2672 auto *T1R = Src1R;
2614 if (Dest->getType() != IceType_i32) { 2673 if (Dest->getType() != IceType_i32) {
2615 T0R = makeReg(IceType_i32); 2674 T0R = makeReg(IceType_i32);
2616 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R)); 2675 lowerCast(InstCast::create(Func, InstCast::Zext, T0R, Src0R));
(...skipping 2752 matching lines...) Expand 10 before | Expand all | Expand 10 after
5369 Str << "\t.set\t" 5428 Str << "\t.set\t"
5370 << "noat\n"; 5429 << "noat\n";
5371 } 5430 }
5372 5431
5373 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM]; 5432 SmallBitVector TargetMIPS32::TypeToRegisterSet[RCMIPS32_NUM];
5374 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM]; 5433 SmallBitVector TargetMIPS32::TypeToRegisterSetUnfiltered[RCMIPS32_NUM];
5375 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM]; 5434 SmallBitVector TargetMIPS32::RegisterAliases[RegMIPS32::Reg_NUM];
5376 5435
5377 } // end of namespace MIPS32 5436 } // end of namespace MIPS32
5378 } // end of namespace Ice 5437 } // end of namespace Ice
OLDNEW
« no previous file with comments | « no previous file | tests_lit/assembler/mips32/encoding_test_arith.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698