aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore/ix86_64/ix86_3dnow.c
diff options
context:
space:
mode:
Diffstat (limited to 'libpcsxcore/ix86_64/ix86_3dnow.c')
-rw-r--r--libpcsxcore/ix86_64/ix86_3dnow.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/libpcsxcore/ix86_64/ix86_3dnow.c b/libpcsxcore/ix86_64/ix86_3dnow.c
new file mode 100644
index 0000000..8fd4233
--- /dev/null
+++ b/libpcsxcore/ix86_64/ix86_3dnow.c
@@ -0,0 +1,178 @@
+// stop compiling if NORECBUILD build (only for Visual Studio)
+#if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD))
+
+#include "ix86-64.h"
+
+/**********************/
+/* 3DNOW instructions */
+/**********************/
+
+/* femms */
+void FEMMS( void )
+{
+ write16( 0x0E0F );
+}
+
+void PFCMPEQMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0xB0 );
+}
+
+void PFCMPGTMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0xA0 );
+}
+
+void PFCMPGEMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0x90 );
+}
+
+void PFADDMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0x9E );
+}
+
+void PFADDRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0x9E );
+}
+
+void PFSUBMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0x9A );
+}
+
+void PFSUBRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0x9A );
+}
+
+void PFMULMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0xB4 );
+}
+
+void PFMULRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0xB4 );
+}
+
+void PFRCPMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0x96 );
+}
+
+void PFRCPRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0x96 );
+}
+
+void PFRCPIT1RtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0xA6 );
+}
+
+void PFRCPIT2RtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0xB6 );
+}
+
+void PFRSQRTRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0x97 );
+}
+
+void PFRSQIT1RtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0xA7 );
+}
+
+void PF2IDMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0x1D );
+}
+
+void PF2IDRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0x1D );
+}
+
+void PI2FDMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0x0D );
+}
+
+void PI2FDRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0x0D );
+}
+
+void PFMAXMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0xA4 );
+}
+
+void PFMAXRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0xA4 );
+}
+
+void PFMINMtoR( x86IntRegType to, uptr from )
+{
+ MEMADDR_OP(0, VAROP2(0x0F, 0x0F), true, to, from, 1);
+ write8( 0x94 );
+}
+
+void PFMINRtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, to, from);
+ write16( 0x0F0F );
+ ModRM( 3, to, from );
+ write8( 0x94 );
+}
+
+#endif