| 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
|
|
|
|
|