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

Side by Side Diff: src/IceInstARM32.h

Issue 1152703006: Subzero ARM: lowerLoad and lowerStore. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: typo in comments Created 5 years, 6 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
« no previous file with comments | « no previous file | src/IceInstARM32.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceInstARM32.h - ARM32 machine instructions --*- C++ -*-===// 1 //===- subzero/src/IceInstARM32.h - ARM32 machine instructions --*- 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 // This file declares the InstARM32 and OperandARM32 classes and 10 // This file declares the InstARM32 and OperandARM32 classes and
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 }; 84 };
85 85
86 // Provide two constructors. 86 // Provide two constructors.
87 // NOTE: The Variable-typed operands have to be registers. 87 // NOTE: The Variable-typed operands have to be registers.
88 // 88 //
89 // (1) Reg + Imm. The Immediate actually has a limited number of bits 89 // (1) Reg + Imm. The Immediate actually has a limited number of bits
90 // for encoding, so check canHoldOffset first. It cannot handle 90 // for encoding, so check canHoldOffset first. It cannot handle
91 // general Constant operands like ConstantRelocatable, since a relocatable 91 // general Constant operands like ConstantRelocatable, since a relocatable
92 // can potentially take up too many bits. 92 // can potentially take up too many bits.
93 static OperandARM32Mem *create(Cfg *Func, Type Ty, Variable *Base, 93 static OperandARM32Mem *create(Cfg *Func, Type Ty, Variable *Base,
94 ConstantInteger32 *ImmOffset = nullptr, 94 ConstantInteger32 *ImmOffset,
95 AddrMode Mode = Offset) { 95 AddrMode Mode = Offset) {
96 return new (Func->allocate<OperandARM32Mem>()) 96 return new (Func->allocate<OperandARM32Mem>())
97 OperandARM32Mem(Func, Ty, Base, ImmOffset, Mode); 97 OperandARM32Mem(Func, Ty, Base, ImmOffset, Mode);
98 } 98 }
99 // (2) Reg +/- Reg with an optional shift of some kind and amount. 99 // (2) Reg +/- Reg with an optional shift of some kind and amount.
100 // Note that this mode is disallowed in the NaCl sandbox. 100 // Note that this mode is disallowed in the NaCl sandbox.
101 static OperandARM32Mem *create(Cfg *Func, Type Ty, Variable *Base, 101 static OperandARM32Mem *create(Cfg *Func, Type Ty, Variable *Base,
102 Variable *Index, ShiftKind ShiftOp = kNoShift, 102 Variable *Index, ShiftKind ShiftOp = kNoShift,
103 uint16_t ShiftAmt = 0, 103 uint16_t ShiftAmt = 0,
104 AddrMode Mode = Offset) { 104 AddrMode Mode = Offset) {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 Mov, 270 Mov,
271 Movt, 271 Movt,
272 Movw, 272 Movw,
273 Mul, 273 Mul,
274 Mvn, 274 Mvn,
275 Orr, 275 Orr,
276 Pop, 276 Pop,
277 Push, 277 Push,
278 Ret, 278 Ret,
279 Sbc, 279 Sbc,
280 Str,
280 Sub, 281 Sub,
281 Umull 282 Umull
282 }; 283 };
283 284
284 static const char *getWidthString(Type Ty); 285 static const char *getWidthString(Type Ty);
285 static CondARM32::Cond getOppositeCondition(CondARM32::Cond Cond); 286 static CondARM32::Cond getOppositeCondition(CondARM32::Cond Cond);
286 287
287 void dump(const Cfg *Func) const override; 288 void dump(const Cfg *Func) const override;
288 289
289 protected: 290 protected:
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 void emit(const Cfg *Func) const override; 757 void emit(const Cfg *Func) const override;
757 void emitIAS(const Cfg *Func) const override; 758 void emitIAS(const Cfg *Func) const override;
758 void dump(const Cfg *Func) const override; 759 void dump(const Cfg *Func) const override;
759 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); } 760 static bool classof(const Inst *Inst) { return isClassof(Inst, Ret); }
760 761
761 private: 762 private:
762 InstARM32Ret(Cfg *Func, Variable *LR, Variable *Source); 763 InstARM32Ret(Cfg *Func, Variable *LR, Variable *Source);
763 ~InstARM32Ret() override {} 764 ~InstARM32Ret() override {}
764 }; 765 };
765 766
767 // Store instruction. It's important for liveness that there is no Dest
768 // operand (OperandARM32Mem instead of Dest Variable).
769 class InstARM32Str : public InstARM32Pred {
770 InstARM32Str() = delete;
771 InstARM32Str(const InstARM32Str &) = delete;
772 InstARM32Str &operator=(const InstARM32Str &) = delete;
773
774 public:
775 // Value must be a register.
776 static InstARM32Str *create(Cfg *Func, Variable *Value, OperandARM32Mem *Mem,
777 CondARM32::Cond Predicate) {
778 return new (Func->allocate<InstARM32Str>())
779 InstARM32Str(Func, Value, Mem, Predicate);
780 }
781 void emit(const Cfg *Func) const override;
782 void emitIAS(const Cfg *Func) const override;
783 void dump(const Cfg *Func) const override;
784 static bool classof(const Inst *Inst) { return isClassof(Inst, Str); }
785
786 private:
787 InstARM32Str(Cfg *Func, Variable *Value, OperandARM32Mem *Mem,
788 CondARM32::Cond Predicate);
789 ~InstARM32Str() override {}
790 };
791
766 // Unsigned Multiply Long: d.lo, d.hi := x * y 792 // Unsigned Multiply Long: d.lo, d.hi := x * y
767 class InstARM32Umull : public InstARM32Pred { 793 class InstARM32Umull : public InstARM32Pred {
768 InstARM32Umull() = delete; 794 InstARM32Umull() = delete;
769 InstARM32Umull(const InstARM32Umull &) = delete; 795 InstARM32Umull(const InstARM32Umull &) = delete;
770 InstARM32Umull &operator=(const InstARM32Umull &) = delete; 796 InstARM32Umull &operator=(const InstARM32Umull &) = delete;
771 797
772 public: 798 public:
773 // Everything must be a register. 799 // Everything must be a register.
774 static InstARM32Umull *create(Cfg *Func, Variable *DestLo, Variable *DestHi, 800 static InstARM32Umull *create(Cfg *Func, Variable *DestLo, Variable *DestHi,
775 Variable *Src0, Variable *Src1, 801 Variable *Src0, Variable *Src1,
(...skipping 16 matching lines...) Expand all
792 // Declare partial template specializations of emit() methods that 818 // Declare partial template specializations of emit() methods that
793 // already have default implementations. Without this, there is the 819 // already have default implementations. Without this, there is the
794 // possibility of ODR violations and link errors. 820 // possibility of ODR violations and link errors.
795 821
796 template <> void InstARM32Movw::emit(const Cfg *Func) const; 822 template <> void InstARM32Movw::emit(const Cfg *Func) const;
797 template <> void InstARM32Movt::emit(const Cfg *Func) const; 823 template <> void InstARM32Movt::emit(const Cfg *Func) const;
798 824
799 } // end of namespace Ice 825 } // end of namespace Ice
800 826
801 #endif // SUBZERO_SRC_ICEINSTARM32_H 827 #endif // SUBZERO_SRC_ICEINSTARM32_H
OLDNEW
« no previous file with comments | « no previous file | src/IceInstARM32.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698