| Index: src/IceInstARM32.h
|
| diff --git a/src/IceInstARM32.h b/src/IceInstARM32.h
|
| index 4a052c4aa65fb7aeac90b6283b30c37472192bb8..89f894dae75b3ef211fe3e1a8d49cfbada26d59b 100644
|
| --- a/src/IceInstARM32.h
|
| +++ b/src/IceInstARM32.h
|
| @@ -428,6 +428,9 @@ public:
|
| Vadd,
|
| Vand,
|
| Vbsl,
|
| + Vceq,
|
| + Vcge,
|
| + Vcgt,
|
| Vcmp,
|
| Vcvt,
|
| Vdiv,
|
| @@ -436,6 +439,7 @@ public:
|
| Vmls,
|
| Vmrs,
|
| Vmul,
|
| + Vmvn,
|
| Vneg,
|
| Vorr,
|
| Vshl,
|
| @@ -464,7 +468,8 @@ public:
|
| /// Shared emit routines for common forms of instructions.
|
| /// @{
|
| static void emitThreeAddrFP(const char *Opcode, FPSign Sign,
|
| - const InstARM32 *Instr, const Cfg *Func);
|
| + const InstARM32 *Instr, const Cfg *Func,
|
| + Type OpType);
|
| static void emitFourAddrFP(const char *Opcode, FPSign Sign,
|
| const InstARM32 *Instr, const Cfg *Func);
|
| /// @}
|
| @@ -782,7 +787,8 @@ public:
|
| void emit(const Cfg *Func) const override {
|
| if (!BuildDefs::dump())
|
| return;
|
| - emitThreeAddrFP(Opcode, Sign, this, Func);
|
| + const Type OpType = (isVectorCompare() ? getSrc(0) : getDest())->getType();
|
| + emitThreeAddrFP(Opcode, Sign, this, Func, OpType);
|
| }
|
| void emitIAS(const Cfg *Func) const override;
|
| void dump(const Cfg *Func) const override {
|
| @@ -790,8 +796,8 @@ public:
|
| return;
|
| Ostream &Str = Func->getContext()->getStrDump();
|
| dumpDest(Func);
|
| - Str << " = ";
|
| - Str << Opcode << "." << getDest()->getType() << " ";
|
| + const Type OpType = (isVectorCompare() ? getSrc(0) : getDest())->getType();
|
| + Str << " = " << Opcode << "." << OpType << " ";
|
| dumpSources(Func);
|
| }
|
| static bool classof(const Inst *Instr) { return isClassof(Instr, K); }
|
| @@ -806,6 +812,11 @@ protected:
|
| }
|
|
|
| static const char *Opcode;
|
| +
|
| +private:
|
| + static constexpr bool isVectorCompare() {
|
| + return K == InstARM32::Vceq || K == InstARM32::Vcgt || K == InstARM32::Vcge;
|
| + }
|
| };
|
|
|
| template <InstARM32::InstKindARM32 K>
|
| @@ -994,11 +1005,15 @@ using InstARM32Udiv = InstARM32ThreeAddrGPR<InstARM32::Udiv>;
|
| using InstARM32Vadd = InstARM32ThreeAddrFP<InstARM32::Vadd>;
|
| using InstARM32Vand = InstARM32ThreeAddrFP<InstARM32::Vand>;
|
| using InstARM32Vbsl = InstARM32ThreeAddrFP<InstARM32::Vbsl>;
|
| +using InstARM32Vceq = InstARM32ThreeAddrFP<InstARM32::Vceq>;
|
| +using InstARM32Vcge = InstARM32ThreeAddrSignAwareFP<InstARM32::Vcge>;
|
| +using InstARM32Vcgt = InstARM32ThreeAddrSignAwareFP<InstARM32::Vcgt>;
|
| using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>;
|
| using InstARM32Veor = InstARM32ThreeAddrFP<InstARM32::Veor>;
|
| using InstARM32Vmla = InstARM32FourAddrFP<InstARM32::Vmla>;
|
| using InstARM32Vmls = InstARM32FourAddrFP<InstARM32::Vmls>;
|
| using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>;
|
| +using InstARM32Vmvn = InstARM32UnaryopFP<InstARM32::Vmvn>;
|
| using InstARM32Vneg = InstARM32UnaryopSignAwareFP<InstARM32::Vneg>;
|
| using InstARM32Vorr = InstARM32ThreeAddrFP<InstARM32::Vorr>;
|
| using InstARM32Vshl = InstARM32ThreeAddrSignAwareFP<InstARM32::Vshl>;
|
|
|