Index: src/IceInstARM32.h |
diff --git a/src/IceInstARM32.h b/src/IceInstARM32.h |
index c196d72cc3161232637dd3276b9944d4d1d1ba35..c8be52bba907307d4778dc172d17bab40944612a 100644 |
--- a/src/IceInstARM32.h |
+++ b/src/IceInstARM32.h |
@@ -320,12 +320,11 @@ public: |
Udiv, |
Umull, |
Uxt, |
+ Vabs, |
Vadd, |
Vcmp, |
Vcvt, |
Vdiv, |
- Vldr, |
- Vmov, |
Vmrs, |
Vmul, |
Vsqrt, |
@@ -780,13 +779,6 @@ using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>; |
using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>; |
using InstARM32Vsub = InstARM32ThreeAddrFP<InstARM32::Vsub>; |
using InstARM32Ldr = InstARM32Movlike<InstARM32::Ldr>; |
-/// Move instruction (variable <- flex). This is more of a pseudo-inst. If var |
-/// is a register, then we use "mov". If var is stack, then we use "str" to |
-/// store to the stack. |
-using InstARM32Mov = InstARM32Movlike<InstARM32::Mov>; |
-/// Represents various vector mov instruction forms (simple single source, |
-/// single dest forms only, not the 2 GPR <-> 1 D reg forms, etc.). |
-using InstARM32Vldr = InstARM32Movlike<InstARM32::Vldr>; |
/// MovT leaves the bottom bits alone so dest is also a source. This helps |
/// indicate that a previous MovW setting dest is not dead code. |
using InstARM32Movt = InstARM32TwoAddrGPR<InstARM32::Movt>; |
@@ -1120,90 +1112,47 @@ private: |
}; |
/// Handles (some of) vmov's various formats. |
-class InstARM32Vmov final : public InstARM32Pred { |
- InstARM32Vmov() = delete; |
- InstARM32Vmov(const InstARM32Vmov &) = delete; |
- InstARM32Vmov &operator=(const InstARM32Vmov &) = delete; |
+class InstARM32Mov final : public InstARM32Pred { |
+ InstARM32Mov() = delete; |
+ InstARM32Mov(const InstARM32Mov &) = delete; |
+ InstARM32Mov &operator=(const InstARM32Mov &) = delete; |
public: |
- /// RegisterPair is used to group registers in |
- /// |
- /// vmov D, (R, R) |
- /// |
- /// and |
- /// |
- /// vmov (R, R), D |
- struct RegisterPair { |
- explicit RegisterPair(Variable *V0, Variable *V1) : _0(V0), _1(V1) { |
- assert(V0->getType() == IceType_i32); |
- assert(V1->getType() == IceType_i32); |
- } |
- Variable *_0; |
- Variable *_1; |
- }; |
- |
- static InstARM32Vmov *create(Cfg *Func, Variable *Dest, Operand *Src, |
- CondARM32::Cond Predicate) { |
- return new (Func->allocate<InstARM32Vmov>()) |
- InstARM32Vmov(Func, Dest, Src, Predicate); |
- } |
- static InstARM32Vmov *create(Cfg *Func, const RegisterPair &Dests, |
- Variable *Src, CondARM32::Cond Predicate) { |
- return new (Func->allocate<InstARM32Vmov>()) |
- InstARM32Vmov(Func, Dests, Src, Predicate); |
- } |
- static InstARM32Vmov *create(Cfg *Func, Variable *Dest, |
- const RegisterPair &Srcs, |
- CondARM32::Cond Predicate) { |
- return new (Func->allocate<InstARM32Vmov>()) |
- InstARM32Vmov(Func, Dest, Srcs, Predicate); |
+ static InstARM32Mov *create(Cfg *Func, Variable *Dest, Operand *Src, |
+ CondARM32::Cond Predicate) { |
+ return new (Func->allocate<InstARM32Mov>()) |
+ InstARM32Mov(Func, Dest, Src, Predicate); |
} |
bool isRedundantAssign() const override { |
- return Dest1 == nullptr && getSrcSize() == 1 && |
+ return !isMultiDest() && !isMultiSource() && |
checkForRedundantAssign(getDest(), getSrc(0)); |
} |
bool isSimpleAssign() const override { return true; } |
void emit(const Cfg *Func) const override; |
void emitIAS(const Cfg *Func) const override; |
void dump(const Cfg *Func) const override; |
- static bool classof(const Inst *Inst) { return isClassof(Inst, Vmov); } |
- |
-private: |
- InstARM32Vmov(Cfg *Func, Variable *Dest, Operand *Src, |
- CondARM32::Cond Predicate) |
- : InstARM32Pred(Func, InstARM32::Vmov, 1, Dest, Predicate) { |
- addSource(Src); |
- } |
- |
- InstARM32Vmov(Cfg *Func, const RegisterPair &Dests, Variable *Src, |
- CondARM32::Cond Predicate) |
- : InstARM32Pred(Func, InstARM32::Vmov, 1, Dests._0, Predicate), |
- Dest1(Dests._1) { |
- addSource(Src); |
- } |
- |
- InstARM32Vmov(Cfg *Func, Variable *Dest, const RegisterPair &Srcs, |
- CondARM32::Cond Predicate) |
- : InstARM32Pred(Func, InstARM32::Vmov, 2, Dest, Predicate) { |
- addSource(Srcs._0); |
- addSource(Srcs._1); |
- } |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Mov); } |
bool isMultiDest() const { |
assert(getDest() != nullptr); |
- return Dest1 != nullptr; |
+ return llvm::isa<Variable64On32>(getDest()); |
} |
bool isMultiSource() const { |
- assert(getSrcSize() >= 1); |
- return getSrcSize() > 1; |
+ assert(getSrcSize() == 1); |
+ return llvm::isa<Variable64On32>(getSrc(0)); |
+ } |
+ |
+private: |
+ InstARM32Mov(Cfg *Func, Variable *Dest, Operand *Src, |
+ CondARM32::Cond Predicate) |
+ : InstARM32Pred(Func, InstARM32::Mov, 1, Dest, Predicate) { |
+ addSource(Src); |
} |
void emitMultiDestSingleSource(const Cfg *Func) const; |
void emitSingleDestMultiSource(const Cfg *Func) const; |
void emitSingleDestSingleSource(const Cfg *Func) const; |
- |
- Variable *Dest1 = nullptr; |
}; |
class InstARM32Vcmp final : public InstARM32Pred { |
@@ -1246,15 +1195,33 @@ private: |
InstARM32Vmrs(Cfg *Func, CondARM32::Cond Predicate); |
}; |
+class InstARM32Vabs final : public InstARM32Pred { |
+ InstARM32Vabs() = delete; |
+ InstARM32Vabs(const InstARM32Vabs &) = delete; |
+ InstARM32Vabs &operator=(const InstARM32Vabs &) = delete; |
+ |
+public: |
+ static InstARM32Vabs *create(Cfg *Func, Variable *Dest, Variable *Src, |
+ CondARM32::Cond Predicate) { |
+ return new (Func->allocate<InstARM32Vabs>()) |
+ InstARM32Vabs(Func, Dest, Src, Predicate); |
+ } |
+ void emit(const Cfg *Func) const override; |
+ void emitIAS(const Cfg *Func) const override; |
+ void dump(const Cfg *Func) const override; |
+ static bool classof(const Inst *Inst) { return isClassof(Inst, Vabs); } |
+ |
+private: |
+ InstARM32Vabs(Cfg *Func, Variable *Dest, Variable *Src, |
+ CondARM32::Cond Predicate); |
+}; |
// Declare partial template specializations of emit() methods that already have |
// default implementations. Without this, there is the possibility of ODR |
// violations and link errors. |
template <> void InstARM32Ldr::emit(const Cfg *Func) const; |
-template <> void InstARM32Mov::emit(const Cfg *Func) const; |
template <> void InstARM32Movw::emit(const Cfg *Func) const; |
template <> void InstARM32Movt::emit(const Cfg *Func) const; |
-template <> void InstARM32Vldr::emit(const Cfg *Func) const; |
} // end of namespace Ice |