arch-x86: implement POPCNT instruction.
[gem5.git] / src / arch / x86 / isa / microops / regop.isa
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);
+        '''
 }};