| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringARM32.h - ARM32 lowering ----*- C++ -*-===// | 1 //===- subzero/src/IceTargetLoweringARM32.h - ARM32 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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 | 135 |
| 136 void postLower() override; | 136 void postLower() override; |
| 137 | 137 |
| 138 enum SafeBoolChain { | 138 enum SafeBoolChain { |
| 139 SBC_No, | 139 SBC_No, |
| 140 SBC_Yes, | 140 SBC_Yes, |
| 141 }; | 141 }; |
| 142 | 142 |
| 143 void lowerAlloca(const InstAlloca *Inst) override; | 143 void lowerAlloca(const InstAlloca *Inst) override; |
| 144 SafeBoolChain lowerInt1Arithmetic(const InstArithmetic *Inst); | 144 SafeBoolChain lowerInt1Arithmetic(const InstArithmetic *Inst); |
| 145 void lowerInt64Arithmetic(InstArithmetic::OpKind Op, Variable *Dest, |
| 146 Operand *Src0, Operand *Src1); |
| 145 void lowerArithmetic(const InstArithmetic *Inst) override; | 147 void lowerArithmetic(const InstArithmetic *Inst) override; |
| 146 void lowerAssign(const InstAssign *Inst) override; | 148 void lowerAssign(const InstAssign *Inst) override; |
| 147 void lowerBr(const InstBr *Inst) override; | 149 void lowerBr(const InstBr *Inst) override; |
| 148 void lowerCall(const InstCall *Inst) override; | 150 void lowerCall(const InstCall *Inst) override; |
| 149 void lowerCast(const InstCast *Inst) override; | 151 void lowerCast(const InstCast *Inst) override; |
| 150 void lowerExtractElement(const InstExtractElement *Inst) override; | 152 void lowerExtractElement(const InstExtractElement *Inst) override; |
| 151 | 153 |
| 152 /// CondWhenTrue is a helper type returned by every method in the lowering | 154 /// CondWhenTrue is a helper type returned by every method in the lowering |
| 153 /// that emits code to set the condition codes. | 155 /// that emits code to set the condition codes. |
| 154 class CondWhenTrue { | 156 class CondWhenTrue { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 173 case CondARM32::AL: | 175 case CondARM32::AL: |
| 174 return CondWhenTrue(CondARM32::kNone); | 176 return CondWhenTrue(CondARM32::kNone); |
| 175 case CondARM32::kNone: | 177 case CondARM32::kNone: |
| 176 return CondWhenTrue(CondARM32::AL); | 178 return CondWhenTrue(CondARM32::AL); |
| 177 } | 179 } |
| 178 } | 180 } |
| 179 }; | 181 }; |
| 180 | 182 |
| 181 CondWhenTrue lowerFcmpCond(const InstFcmp *Instr); | 183 CondWhenTrue lowerFcmpCond(const InstFcmp *Instr); |
| 182 void lowerFcmp(const InstFcmp *Instr) override; | 184 void lowerFcmp(const InstFcmp *Instr) override; |
| 185 CondWhenTrue lowerInt64IcmpCond(InstIcmp::ICond Condition, Operand *Src0, |
| 186 Operand *Src1); |
| 183 CondWhenTrue lowerIcmpCond(const InstIcmp *Instr); | 187 CondWhenTrue lowerIcmpCond(const InstIcmp *Instr); |
| 184 void lowerIcmp(const InstIcmp *Instr) override; | 188 void lowerIcmp(const InstIcmp *Instr) override; |
| 185 void lowerAtomicRMW(Variable *Dest, uint32_t Operation, Operand *Ptr, | 189 void lowerAtomicRMW(Variable *Dest, uint32_t Operation, Operand *Ptr, |
| 186 Operand *Val); | 190 Operand *Val); |
| 187 void lowerIntrinsicCall(const InstIntrinsicCall *Inst) override; | 191 void lowerIntrinsicCall(const InstIntrinsicCall *Inst) override; |
| 188 void lowerInsertElement(const InstInsertElement *Inst) override; | 192 void lowerInsertElement(const InstInsertElement *Inst) override; |
| 189 void lowerLoad(const InstLoad *Inst) override; | 193 void lowerLoad(const InstLoad *Inst) override; |
| 190 void lowerPhi(const InstPhi *Inst) override; | 194 void lowerPhi(const InstPhi *Inst) override; |
| 191 void lowerRet(const InstRet *Inst) override; | 195 void lowerRet(const InstRet *Inst) override; |
| 192 void lowerSelect(const InstSelect *Inst) override; | 196 void lowerSelect(const InstSelect *Inst) override; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 Context.insert(InstARM32Ldrex::create(Func, Dest, Addr, Pred)); | 317 Context.insert(InstARM32Ldrex::create(Func, Dest, Addr, Pred)); |
| 314 if (auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest)) { | 318 if (auto *Dest64 = llvm::dyn_cast<Variable64On32>(Dest)) { |
| 315 Context.insert(InstFakeDef::create(Func, Dest64->getLo(), Dest)); | 319 Context.insert(InstFakeDef::create(Func, Dest64->getLo(), Dest)); |
| 316 Context.insert(InstFakeDef::create(Func, Dest64->getHi(), Dest)); | 320 Context.insert(InstFakeDef::create(Func, Dest64->getHi(), Dest)); |
| 317 } | 321 } |
| 318 } | 322 } |
| 319 void _lsl(Variable *Dest, Variable *Src0, Operand *Src1, | 323 void _lsl(Variable *Dest, Variable *Src0, Operand *Src1, |
| 320 CondARM32::Cond Pred = CondARM32::AL) { | 324 CondARM32::Cond Pred = CondARM32::AL) { |
| 321 Context.insert(InstARM32Lsl::create(Func, Dest, Src0, Src1, Pred)); | 325 Context.insert(InstARM32Lsl::create(Func, Dest, Src0, Src1, Pred)); |
| 322 } | 326 } |
| 327 void _lsls(Variable *Dest, Variable *Src0, Operand *Src1, |
| 328 CondARM32::Cond Pred = CondARM32::AL) { |
| 329 constexpr bool SetFlags = true; |
| 330 Context.insert( |
| 331 InstARM32Lsl::create(Func, Dest, Src0, Src1, Pred, SetFlags)); |
| 332 } |
| 323 void _lsr(Variable *Dest, Variable *Src0, Operand *Src1, | 333 void _lsr(Variable *Dest, Variable *Src0, Operand *Src1, |
| 324 CondARM32::Cond Pred = CondARM32::AL) { | 334 CondARM32::Cond Pred = CondARM32::AL) { |
| 325 Context.insert(InstARM32Lsr::create(Func, Dest, Src0, Src1, Pred)); | 335 Context.insert(InstARM32Lsr::create(Func, Dest, Src0, Src1, Pred)); |
| 326 } | 336 } |
| 327 void _mla(Variable *Dest, Variable *Src0, Variable *Src1, Variable *Acc, | 337 void _mla(Variable *Dest, Variable *Src0, Variable *Src1, Variable *Acc, |
| 328 CondARM32::Cond Pred = CondARM32::AL) { | 338 CondARM32::Cond Pred = CondARM32::AL) { |
| 329 Context.insert(InstARM32Mla::create(Func, Dest, Src0, Src1, Acc, Pred)); | 339 Context.insert(InstARM32Mla::create(Func, Dest, Src0, Src1, Acc, Pred)); |
| 330 } | 340 } |
| 331 void _mls(Variable *Dest, Variable *Src0, Variable *Src1, Variable *Acc, | 341 void _mls(Variable *Dest, Variable *Src0, Variable *Src1, Variable *Acc, |
| 332 CondARM32::Cond Pred = CondARM32::AL) { | 342 CondARM32::Cond Pred = CondARM32::AL) { |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 CondARM32::Cond Pred = CondARM32::AL) { | 645 CondARM32::Cond Pred = CondARM32::AL) { |
| 636 Context.insert(InstARM32Rbit::create(Func, Dest, Src0, Pred)); | 646 Context.insert(InstARM32Rbit::create(Func, Dest, Src0, Pred)); |
| 637 } | 647 } |
| 638 void _rev(Variable *Dest, Variable *Src0, | 648 void _rev(Variable *Dest, Variable *Src0, |
| 639 CondARM32::Cond Pred = CondARM32::AL) { | 649 CondARM32::Cond Pred = CondARM32::AL) { |
| 640 Context.insert(InstARM32Rev::create(Func, Dest, Src0, Pred)); | 650 Context.insert(InstARM32Rev::create(Func, Dest, Src0, Pred)); |
| 641 } | 651 } |
| 642 void _ret(Variable *LR, Variable *Src0 = nullptr) { | 652 void _ret(Variable *LR, Variable *Src0 = nullptr) { |
| 643 Context.insert(InstARM32Ret::create(Func, LR, Src0)); | 653 Context.insert(InstARM32Ret::create(Func, LR, Src0)); |
| 644 } | 654 } |
| 655 void _rscs(Variable *Dest, Variable *Src0, Operand *Src1, |
| 656 CondARM32::Cond Pred = CondARM32::AL) { |
| 657 constexpr bool SetFlags = true; |
| 658 Context.insert( |
| 659 InstARM32Rsc::create(Func, Dest, Src0, Src1, Pred, SetFlags)); |
| 660 } |
| 661 void _rsbs(Variable *Dest, Variable *Src0, Operand *Src1, |
| 662 CondARM32::Cond Pred = CondARM32::AL) { |
| 663 constexpr bool SetFlags = true; |
| 664 Context.insert( |
| 665 InstARM32Rsb::create(Func, Dest, Src0, Src1, Pred, SetFlags)); |
| 666 } |
| 645 void _rsb(Variable *Dest, Variable *Src0, Operand *Src1, | 667 void _rsb(Variable *Dest, Variable *Src0, Operand *Src1, |
| 646 CondARM32::Cond Pred = CondARM32::AL) { | 668 CondARM32::Cond Pred = CondARM32::AL) { |
| 647 Context.insert(InstARM32Rsb::create(Func, Dest, Src0, Src1, Pred)); | 669 Context.insert(InstARM32Rsb::create(Func, Dest, Src0, Src1, Pred)); |
| 648 } | 670 } |
| 649 void _sbc(Variable *Dest, Variable *Src0, Operand *Src1, | 671 void _sbc(Variable *Dest, Variable *Src0, Operand *Src1, |
| 650 CondARM32::Cond Pred = CondARM32::AL) { | 672 CondARM32::Cond Pred = CondARM32::AL) { |
| 651 Context.insert(InstARM32Sbc::create(Func, Dest, Src0, Src1, Pred)); | 673 Context.insert(InstARM32Sbc::create(Func, Dest, Src0, Src1, Pred)); |
| 652 } | 674 } |
| 653 void _sbcs(Variable *Dest, Variable *Src0, Operand *Src1, | 675 void _sbcs(Variable *Dest, Variable *Src0, Operand *Src1, |
| 654 CondARM32::Cond Pred = CondARM32::AL) { | 676 CondARM32::Cond Pred = CondARM32::AL) { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 CondARM32::Cond Pred = CondARM32::AL) { | 748 CondARM32::Cond Pred = CondARM32::AL) { |
| 727 Context.insert(InstARM32Vcvt::create(Func, Dest, Src, Variant, Pred)); | 749 Context.insert(InstARM32Vcvt::create(Func, Dest, Src, Variant, Pred)); |
| 728 } | 750 } |
| 729 void _vdiv(Variable *Dest, Variable *Src0, Variable *Src1) { | 751 void _vdiv(Variable *Dest, Variable *Src0, Variable *Src1) { |
| 730 Context.insert(InstARM32Vdiv::create(Func, Dest, Src0, Src1)); | 752 Context.insert(InstARM32Vdiv::create(Func, Dest, Src0, Src1)); |
| 731 } | 753 } |
| 732 void _vcmp(Variable *Src0, Variable *Src1, | 754 void _vcmp(Variable *Src0, Variable *Src1, |
| 733 CondARM32::Cond Pred = CondARM32::AL) { | 755 CondARM32::Cond Pred = CondARM32::AL) { |
| 734 Context.insert(InstARM32Vcmp::create(Func, Src0, Src1, Pred)); | 756 Context.insert(InstARM32Vcmp::create(Func, Src0, Src1, Pred)); |
| 735 } | 757 } |
| 758 void _vcmp(Variable *Src0, OperandARM32FlexFpZero *FpZero, |
| 759 CondARM32::Cond Pred = CondARM32::AL) { |
| 760 Context.insert(InstARM32Vcmp::create(Func, Src0, FpZero, Pred)); |
| 761 } |
| 736 void _vmrs(CondARM32::Cond Pred = CondARM32::AL) { | 762 void _vmrs(CondARM32::Cond Pred = CondARM32::AL) { |
| 737 Context.insert(InstARM32Vmrs::create(Func, Pred)); | 763 Context.insert(InstARM32Vmrs::create(Func, Pred)); |
| 738 } | 764 } |
| 739 void _vmul(Variable *Dest, Variable *Src0, Variable *Src1) { | 765 void _vmul(Variable *Dest, Variable *Src0, Variable *Src1) { |
| 740 Context.insert(InstARM32Vmul::create(Func, Dest, Src0, Src1)); | 766 Context.insert(InstARM32Vmul::create(Func, Dest, Src0, Src1)); |
| 741 } | 767 } |
| 742 void _vsqrt(Variable *Dest, Variable *Src, | 768 void _vsqrt(Variable *Dest, Variable *Src, |
| 743 CondARM32::Cond Pred = CondARM32::AL) { | 769 CondARM32::Cond Pred = CondARM32::AL) { |
| 744 Context.insert(InstARM32Vsqrt::create(Func, Dest, Src, Pred)); | 770 Context.insert(InstARM32Vsqrt::create(Func, Dest, Src, Pred)); |
| 745 } | 771 } |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 932 | 958 |
| 933 private: | 959 private: |
| 934 ~TargetHeaderARM32() = default; | 960 ~TargetHeaderARM32() = default; |
| 935 | 961 |
| 936 TargetARM32Features CPUFeatures; | 962 TargetARM32Features CPUFeatures; |
| 937 }; | 963 }; |
| 938 | 964 |
| 939 } // end of namespace Ice | 965 } // end of namespace Ice |
| 940 | 966 |
| 941 #endif // SUBZERO_SRC_ICETARGETLOWERINGARM32_H | 967 #endif // SUBZERO_SRC_ICETARGETLOWERINGARM32_H |
| OLD | NEW |