Chromium Code Reviews| Index: src/IceInstARM32.h |
| diff --git a/src/IceInstARM32.h b/src/IceInstARM32.h |
| index 4a052c4aa65fb7aeac90b6283b30c37472192bb8..b0ca794b0f13bc8cc6a6522eb9b375126ca246b8 100644 |
| --- a/src/IceInstARM32.h |
| +++ b/src/IceInstARM32.h |
| @@ -429,6 +429,9 @@ public: |
| Vand, |
| Vbsl, |
| Vcmp, |
| + Vceq, |
|
Jim Stichnoth
2016/04/18 17:34:29
sort?
John
2016/04/18 17:48:03
Done.
|
| + Vcge, |
| + Vcgt, |
| Vcvt, |
| Vdiv, |
| Veor, |
| @@ -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>; |