arch-x86: implement POPCNT instruction.
authorTong Shen <endlessroad@google.com>
Mon, 25 Jan 2021 19:25:38 +0000 (11:25 -0800)
committerTong Shen <endlessroad@google.com>
Wed, 27 Jan 2021 16:06:53 +0000 (16:06 +0000)
Change-Id: Id6ddc1245c81a17720885f9038d55d0811ef7f4d
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/39615
Reviewed-by: Gabe Black <gabe.black@gmail.com>
Maintainer: Gabe Black <gabe.black@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/x86/decoder_tables.cc
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/general_purpose/compare_and_test/bit_scan.py
src/arch/x86/isa/microops/regop.isa

index 7ee5e0185aee7a0392dc81b40acdc5e69b9444ab..db749cf93b8d462be1b66d1e960a0400a156717b 100644 (file)
@@ -115,7 +115,7 @@ namespace X86ISA
 /*  8 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
 /*  9 */ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1,
 /*  A */ 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1,
-/*  B */ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1,
+/*  B */ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1 , 1 , 1 , 1 , 1 , 1,
 /*  C */ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
 /*  D */ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1,
 /*  E */ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1,
@@ -234,7 +234,7 @@ namespace X86ISA
 /*  8 */ ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW, ZW,
 /*  9 */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
 /*  A */ 0 , 0 , 0 , 0 , BY, 0 , 0 , 0 , 0 , 0 , 0 , 0 , BY, 0 , 0 , 0 ,
-/*  B */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , ZW, 0 , BY, 0 , 0 , 0 , 0 , 0 ,
+/*  B */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , , 0 , BY, 0 , 0 , 0 , 0 , 0 ,
 /*  C */ 0 , 0 , BY, 0 , BY, BY, BY, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
 /*  D */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
 /*  E */ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
index f70e7bd1d659faefc0f51d86536c062915cbf801..fe8a2bcdd7809d10afa460b828e0f708b0f0d70f 100644 (file)
             }
             0x17: decode OPCODE_OP_BOTTOM3 {
                 0x0: decode LEGACY_REP {
-                    0x0: WarnUnimpl::jmpe_Jz();
-                    0x1: WarnUnimpl::popcnt_Gv_Ev();
+                    0x1: POPCNT(Gv,Ev);
                 }
                 //0x1: group10_UD2();
                 0x1: UD2();
index a755d2551bb00d10b9acefe94664063e148d81a7..05bd3c4cf6ea0bbdceafcda2626c3ca6d06f57b9 100644 (file)
@@ -350,4 +350,19 @@ def macroop BSF_R_P {
 end:
     fault "NoFault"
 };
+
+def macroop POPCNT_R_R {
+    popcnt reg, regm, reg, dataSize=8
+};
+
+def macroop POPCNT_R_M {
+    ld t1, seg, sib, disp
+    popcnt reg, t1, reg, dataSize=8
+};
+
+def macroop POPCNT_R_P {
+    rdip t7
+    ld t1, seg, riprel, disp
+    popcnt reg, t1, reg, dataSize=8
+};
 '''
index c465dccd7d12ab9679a28d4b86d16ede002e1b0f..570c0847f2446de9978002a7866ac0552a115a81 100644 (file)
@@ -1764,4 +1764,17 @@ let {{
         code = '''
             DestReg = X86ISA::convX87TagsToXTags(FTW);
         '''
+
+    class Popcnt(RegOp):
+        code = '''
+            DestReg =
+                merge(DestReg, __builtin_popcountl(psrc1), dataSize);
+        '''
+        flag_code = '''
+            ccFlagBits = ccFlagBits & ~(SFBit | AFBit | ZFBit | PFBit);
+            if (findZero(dataSize * 8, SrcReg1)) {
+                ccFlagBits = ccFlagBits | ZFBit;
+            }
+            cfofBits = cfofBits & ~(OFBit | CFBit);
+        '''
 }};