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

Unified Diff: src/IceAssemblerX86BaseImpl.h

Issue 1497033002: Fuse icmp/fcmp with select (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Code review changes. Created 5 years 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 side-by-side diff with in-line comments
Download patch
Index: src/IceAssemblerX86BaseImpl.h
diff --git a/src/IceAssemblerX86BaseImpl.h b/src/IceAssemblerX86BaseImpl.h
index 9fd1de53e0154c7a5009015d6399082e8b83cc66..46654b1f9bfe11ba107ac50bd49c29e822a75e66 100644
--- a/src/IceAssemblerX86BaseImpl.h
+++ b/src/IceAssemblerX86BaseImpl.h
@@ -1161,9 +1161,34 @@ void AssemblerX86Base<Machine>::mulps(Type /* Ty */,
}
template <class Machine>
-void AssemblerX86Base<Machine>::minps(typename Traits::XmmRegister dst,
+void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst,
typename Traits::XmmRegister src) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
+ emitRexRB(RexTypeIrrelevant, dst, src);
+ emitUint8(0x0F);
+ emitUint8(0x5D);
+ emitXmmRegisterOperand(dst, src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::minps(Type Ty, typename Traits::XmmRegister dst,
+ const typename Traits::Address &src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
+ emitRex(RexTypeIrrelevant, src, dst);
+ emitUint8(0x0F);
+ emitUint8(0x5D);
+ emitOperand(gprEncoding(dst), src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst,
+ typename Traits::XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
emitRexRB(RexTypeIrrelevant, dst, src);
emitUint8(0x0F);
emitUint8(0x5D);
@@ -1171,9 +1196,45 @@ void AssemblerX86Base<Machine>::minps(typename Traits::XmmRegister dst,
}
template <class Machine>
-void AssemblerX86Base<Machine>::maxps(typename Traits::XmmRegister dst,
+void AssemblerX86Base<Machine>::minss(Type Ty, typename Traits::XmmRegister dst,
+ const typename Traits::Address &src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
+ emitRex(RexTypeIrrelevant, src, dst);
+ emitUint8(0x0F);
+ emitUint8(0x5D);
+ emitOperand(gprEncoding(dst), src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst,
+ typename Traits::XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
+ emitRexRB(RexTypeIrrelevant, dst, src);
+ emitUint8(0x0F);
+ emitUint8(0x5F);
+ emitXmmRegisterOperand(dst, src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::maxps(Type Ty, typename Traits::XmmRegister dst,
+ const typename Traits::Address &src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
+ emitRex(RexTypeIrrelevant, src, dst);
+ emitUint8(0x0F);
+ emitUint8(0x5F);
+ emitOperand(gprEncoding(dst), src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst,
typename Traits::XmmRegister src) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
emitRexRB(RexTypeIrrelevant, dst, src);
emitUint8(0x0F);
emitUint8(0x5F);
@@ -1181,9 +1242,48 @@ void AssemblerX86Base<Machine>::maxps(typename Traits::XmmRegister dst,
}
template <class Machine>
-void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
+void AssemblerX86Base<Machine>::maxss(Type Ty, typename Traits::XmmRegister dst,
+ const typename Traits::Address &src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ emitUint8(isFloat32Asserting32Or64(Ty) ? 0xF3 : 0xF2);
+ emitRex(RexTypeIrrelevant, src, dst);
+ emitUint8(0x0F);
+ emitUint8(0x5F);
+ emitOperand(gprEncoding(dst), src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::andnps(Type Ty,
+ typename Traits::XmmRegister dst,
+ typename Traits::XmmRegister src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
+ emitRexRB(RexTypeIrrelevant, dst, src);
+ emitUint8(0x0F);
+ emitUint8(0x55);
+ emitXmmRegisterOperand(dst, src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::andnps(Type Ty,
+ typename Traits::XmmRegister dst,
+ const typename Traits::Address &src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
+ emitRex(RexTypeIrrelevant, src, dst);
+ emitUint8(0x0F);
+ emitUint8(0x55);
+ emitOperand(gprEncoding(dst), src);
+}
+
+template <class Machine>
+void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst,
typename Traits::XmmRegister src) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
emitRexRB(RexTypeIrrelevant, dst, src);
emitUint8(0x0F);
emitUint8(0x54);
@@ -1191,9 +1291,11 @@ void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
}
template <class Machine>
-void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
+void AssemblerX86Base<Machine>::andps(Type Ty, typename Traits::XmmRegister dst,
const typename Traits::Address &src) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
emitRex(RexTypeIrrelevant, src, dst);
emitUint8(0x0F);
emitUint8(0x54);
@@ -1201,9 +1303,11 @@ void AssemblerX86Base<Machine>::andps(typename Traits::XmmRegister dst,
}
template <class Machine>
-void AssemblerX86Base<Machine>::orps(typename Traits::XmmRegister dst,
+void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst,
typename Traits::XmmRegister src) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
emitRexRB(RexTypeIrrelevant, dst, src);
emitUint8(0x0F);
emitUint8(0x56);
@@ -1211,6 +1315,18 @@ void AssemblerX86Base<Machine>::orps(typename Traits::XmmRegister dst,
}
template <class Machine>
+void AssemblerX86Base<Machine>::orps(Type Ty, typename Traits::XmmRegister dst,
+ const typename Traits::Address &src) {
+ AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
+ emitRex(RexTypeIrrelevant, src, dst);
+ emitUint8(0x0F);
+ emitUint8(0x56);
+ emitOperand(gprEncoding(dst), src);
+}
+
+template <class Machine>
void AssemblerX86Base<Machine>::blendvps(Type /* Ty */,
typename Traits::XmmRegister dst,
typename Traits::XmmRegister src) {
@@ -1264,9 +1380,11 @@ void AssemblerX86Base<Machine>::pblendvb(Type /* Ty */,
template <class Machine>
void AssemblerX86Base<Machine>::cmpps(
- typename Traits::XmmRegister dst, typename Traits::XmmRegister src,
+ Type Ty, typename Traits::XmmRegister dst, typename Traits::XmmRegister src,
typename Traits::Cond::CmppsCond CmpCondition) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (Ty == IceType_f64)
+ emitUint8(0x66);
emitRexRB(RexTypeIrrelevant, dst, src);
emitUint8(0x0F);
emitUint8(0xC2);
@@ -1276,9 +1394,12 @@ void AssemblerX86Base<Machine>::cmpps(
template <class Machine>
void AssemblerX86Base<Machine>::cmpps(
- typename Traits::XmmRegister dst, const typename Traits::Address &src,
+ Type Ty, typename Traits::XmmRegister dst,
+ const typename Traits::Address &src,
typename Traits::Cond::CmppsCond CmpCondition) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (Ty == IceType_f64)
+ emitUint8(0x66);
emitRex(RexTypeIrrelevant, src, dst);
emitUint8(0x0F);
emitUint8(0xC2);
@@ -1446,28 +1567,6 @@ void AssemblerX86Base<Machine>::shufps(Type /* Ty */,
}
template <class Machine>
-void AssemblerX86Base<Machine>::minpd(typename Traits::XmmRegister dst,
- typename Traits::XmmRegister src) {
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- emitUint8(0x66);
- emitRexRB(RexTypeIrrelevant, dst, src);
- emitUint8(0x0F);
- emitUint8(0x5D);
- emitXmmRegisterOperand(dst, src);
-}
-
-template <class Machine>
-void AssemblerX86Base<Machine>::maxpd(typename Traits::XmmRegister dst,
- typename Traits::XmmRegister src) {
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- emitUint8(0x66);
- emitRexRB(RexTypeIrrelevant, dst, src);
- emitUint8(0x0F);
- emitUint8(0x5F);
- emitXmmRegisterOperand(dst, src);
-}
-
-template <class Machine>
void AssemblerX86Base<Machine>::sqrtpd(typename Traits::XmmRegister dst) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
emitUint8(0x66);
@@ -1670,42 +1769,11 @@ void AssemblerX86Base<Machine>::sqrtss(Type Ty,
}
template <class Machine>
-void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst,
- const typename Traits::Address &src) {
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- emitUint8(0x66);
- emitRex(RexTypeIrrelevant, src, dst);
- emitUint8(0x0F);
- emitUint8(0x57);
- emitOperand(gprEncoding(dst), src);
-}
-
-template <class Machine>
-void AssemblerX86Base<Machine>::xorpd(typename Traits::XmmRegister dst,
- typename Traits::XmmRegister src) {
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- emitUint8(0x66);
- emitRexRB(RexTypeIrrelevant, dst, src);
- emitUint8(0x0F);
- emitUint8(0x57);
- emitXmmRegisterOperand(dst, src);
-}
-
-template <class Machine>
-void AssemblerX86Base<Machine>::orpd(typename Traits::XmmRegister dst,
- typename Traits::XmmRegister src) {
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- emitUint8(0x66);
- emitRexRB(RexTypeIrrelevant, dst, src);
- emitUint8(0x0F);
- emitUint8(0x56);
- emitXmmRegisterOperand(dst, src);
-}
-
-template <class Machine>
-void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
+void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst,
const typename Traits::Address &src) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
emitRex(RexTypeIrrelevant, src, dst);
emitUint8(0x0F);
emitUint8(0x57);
@@ -1713,9 +1781,11 @@ void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
}
template <class Machine>
-void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
+void AssemblerX86Base<Machine>::xorps(Type Ty, typename Traits::XmmRegister dst,
typename Traits::XmmRegister src) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
+ if (!isFloat32Asserting32Or64(Ty))
+ emitUint8(0x66);
emitRexRB(RexTypeIrrelevant, dst, src);
emitUint8(0x0F);
emitUint8(0x57);
@@ -1723,28 +1793,6 @@ void AssemblerX86Base<Machine>::xorps(typename Traits::XmmRegister dst,
}
template <class Machine>
-void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst,
- const typename Traits::Address &src) {
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- emitUint8(0x66);
- emitRex(RexTypeIrrelevant, src, dst);
- emitUint8(0x0F);
- emitUint8(0x54);
- emitOperand(gprEncoding(dst), src);
-}
-
-template <class Machine>
-void AssemblerX86Base<Machine>::andpd(typename Traits::XmmRegister dst,
- typename Traits::XmmRegister src) {
- AssemblerBuffer::EnsureCapacity ensured(&Buffer);
- emitUint8(0x66);
- emitRexRB(RexTypeIrrelevant, dst, src);
- emitUint8(0x0F);
- emitUint8(0x54);
- emitXmmRegisterOperand(dst, src);
-}
-
-template <class Machine>
void AssemblerX86Base<Machine>::insertps(Type Ty,
typename Traits::XmmRegister dst,
typename Traits::XmmRegister src,
« no previous file with comments | « src/IceAssemblerX86Base.h ('k') | src/IceInstX8632.cpp » ('j') | src/IceInstX86BaseImpl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698