arch-x86: Add hsub instructions to x86
authorMahyar Samani <msamani@ucdavis.edu>
Tue, 3 Mar 2020 19:32:19 +0000 (19:32 +0000)
committerMahyar Samani <msamani@ucdavis.edu>
Thu, 23 Apr 2020 08:20:12 +0000 (08:20 +0000)
Implemented hsubpd and hsubps instructions from x86.

Issue-on: https://gem5.atlassian.net/browse/GEM5-181
Change-Id: I62919017d3c00119123bda89b2f99cb3bf0b55a8
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/26123
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/simd128/floating_point/arithmetic/horizontal_subtraction.py

index c7c62c25ba90c223340b96a099e645ee7464d346..28affdb342ce9967c6759085ccf441079e3e4945 100644 (file)
                 // operand size (0x66)
                 0x1: decode OPCODE_OP_BOTTOM3 {
                     0x4: HADDPD(Vo,Wo);
-                    0x5: WarnUnimpl::hsubpd_Vo_Wo();
+                    0x5: HSUBPD(Vo, Wo);
                     0x6: MOVD(Edp,Vd);
                     0x7: MOVDQA(Wo,Vo);
                     default: UD2();
                 // repne (0xF2)
                 0x8: decode OPCODE_OP_BOTTOM3 {
                     0x4: HADDPS(Vo,Wo);
-                    0x5: WarnUnimpl::hsubps_Vo_Wo();
+                    0x5: HSUBPS(Vo, Wo);
                     default: UD2();
                 }
                 default: UD2();
index a629ecda813f96bde4b90d13104f3124ab20d522..43523c1be54ec9941b79bec32ca645c4b0bd3a2e 100644 (file)
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 microcode = '''
-# HSUBPS
-# HSUBPD
+def macroop HSUBPS_XMM_XMM {
+    shuffle ufp1, xmml, xmmh, ext=((0 << 0) | (2 << 2)), size=4
+    shuffle ufp2, xmml, xmmh, ext=((1 << 0) | (3 << 2)), size=4
+    shuffle ufp3, xmmlm, xmmhm, ext=((0 << 0) | (2 << 2)), size=4
+    shuffle ufp4, xmmlm, xmmhm, ext=((1 << 0) | (3 << 2)), size=4
+    msubf xmml, ufp1, ufp2, size=4
+    msubf xmmh, ufp3, ufp4, size=4
+};
+def macroop HSUBPS_XMM_M {
+    ldfp ufp1, seg, sib, disp, dataSize=8
+    ldfp ufp2, seg, sib, "DISPLACEMENT+8", dataSize=8
+    shuffle ufp3, xmml, xmmh, ext=((0 << 0) | (2 << 2)), size=4
+    shuffle ufp4, xmml, xmmh, ext=((1 << 0) | (3 << 2)), size=4
+    shuffle ufp5, ufp1, ufp2, ext=((0 << 0) | (2 << 2)), size=4
+    shuffle ufp6, ufp1, ufp2, ext=((1 << 0) | (3 << 2)), size=4
+    msubf xmml, ufp3, ufp4, size=4
+    msubf xmmh, ufp5, ufp6, size=4
+};
+def macroop HSUBPS_XMM_P {
+    rdip t7
+    ldfp ufp1, seg, riprel, disp, dataSize=8
+    ldfp ufp2, seg, riprel, "DISPLACEMENT+8", dataSize=8
+    shuffle ufp3, xmml, xmmh, ext=((0 << 0) | (2 << 2)), size=4
+    shuffle ufp4, xmml, xmmh, ext=((1 << 0) | (3 << 2)), size=4
+    shuffle ufp5, ufp1, ufp2, ext=((0 << 0) | (2 << 2)), size=4
+    shuffle ufp6, ufp1, ufp2, ext=((1 << 0) | (3 << 2)), size=4
+    msubf xmml, ufp3, ufp4, size=4
+    msubf xmmh, ufp5, ufp6, size=4
+};
+def macroop HSUBPD_XMM_XMM {
+    msubf ufp1, xmmh , xmml, size=8, ext=Scalar
+    msubf xmmh, xmmlm, xmmhm, size=8, ext=Scalar
+    movfp xmml, ufp1
+};
+def macroop HSUBPD_XMM_M {
+    ldfp ufp1, seg, sib, disp, dataSize=8
+    ldfp ufp2, seg, sib, "DISPLACEMENT+8", dataSize=8
+    msubf xmml, xmml, xmmh, size=8, ext=Scalar
+    msubf xmmh, ufp1, ufp2, size=8, ext=Scalar
+};
+def macroop HSUBPD_XMM_P {
+    rdip t7
+    ldfp ufp1, seg, riprel, disp, dataSize=8
+    ldfp ufp2, seg, riprel, "DISPLACEMENT+8", dataSize=8
+    msubf xmml, xmml, xmmh, size=8, ext=Scalar
+    msubf xmmh, ufp1, ufp2, size=8, ext=Scalar
+};
 '''