From 20b7938bf4ec0c74cfc85873d724e8ae7dc2bb72 Mon Sep 17 00:00:00 2001
From: an7s <an7s@git.zephyr-software.com>
Date: Fri, 23 Mar 2018 14:04:05 +0000
Subject: [PATCH] Add Zmm to Capstone operand class

Former-commit-id: c306dd10714825c1a8a1c9d95f1756005f580dd4
---
 libIRDB/include/core/operand_cs.hpp |  1 +
 libIRDB/src/core/operand_cs.cpp     | 18 ++++++++++++++++++
 libIRDB/src/util/params.cpp         |  2 +-
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/libIRDB/include/core/operand_cs.hpp b/libIRDB/include/core/operand_cs.hpp
index 78c278159..0d4e5e78b 100644
--- a/libIRDB/include/core/operand_cs.hpp
+++ b/libIRDB/include/core/operand_cs.hpp
@@ -26,6 +26,7 @@ class DecodedOperandCapstone_t
 		bool isFpuRegister() const;
 		bool isSseRegister() const;
 		bool isAvxRegister() const;
+		bool isZmmRegister() const;
 		bool isSpecialRegister() const;
 		bool isSegmentRegister() const;
 		uint32_t getRegNumber() const;
diff --git a/libIRDB/src/core/operand_cs.cpp b/libIRDB/src/core/operand_cs.cpp
index 6d824ca66..a7621475d 100644
--- a/libIRDB/src/core/operand_cs.cpp
+++ b/libIRDB/src/core/operand_cs.cpp
@@ -312,6 +312,22 @@ bool DecodedOperandCapstone_t::isAvxRegister() const
 	return isRegister() &&  regs.find(op.reg)!=end(regs);
 }
 
+bool DecodedOperandCapstone_t::isZmmRegister() const
+{
+	const auto regs=set<x86_reg>({
+		X86_REG_ZMM0, X86_REG_ZMM1, X86_REG_ZMM2,
+		X86_REG_ZMM3, X86_REG_ZMM4, X86_REG_ZMM5, X86_REG_ZMM6, X86_REG_ZMM7,
+		X86_REG_ZMM8, X86_REG_ZMM9, X86_REG_ZMM10, X86_REG_ZMM11, X86_REG_ZMM12,
+		X86_REG_ZMM13, X86_REG_ZMM14, X86_REG_ZMM15, X86_REG_ZMM16, X86_REG_ZMM17,
+		X86_REG_ZMM18, X86_REG_ZMM19, X86_REG_ZMM20, X86_REG_ZMM21, X86_REG_ZMM22,
+		X86_REG_ZMM23, X86_REG_ZMM24, X86_REG_ZMM25, X86_REG_ZMM26, X86_REG_ZMM27,
+		X86_REG_ZMM28, X86_REG_ZMM29, X86_REG_ZMM30, X86_REG_ZMM31,
+		});
+        const auto the_insn=static_cast<cs_insn*>(my_insn.get());
+        const auto &op = (the_insn->detail->x86.operands[op_num]);
+	return isRegister() &&  regs.find(op.reg)!=end(regs);
+}
+
 bool DecodedOperandCapstone_t::isSpecialRegister() const
 {
 	const auto regs=set<x86_reg>({
@@ -357,6 +373,8 @@ uint32_t DecodedOperandCapstone_t::getRegNumber() const
 		return op.reg-X86_REG_XMM0;
 	else if(isAvxRegister())
 		return op.reg-X86_REG_YMM0;
+	else if(isZmmRegister())
+		return op.reg-X86_REG_ZMM0;
 	else if(isSegmentRegister())
 		return to_seg_reg_number(op.reg);
 	else
diff --git a/libIRDB/src/util/params.cpp b/libIRDB/src/util/params.cpp
index de1f604b9..2d3448949 100644
--- a/libIRDB/src/util/params.cpp
+++ b/libIRDB/src/util/params.cpp
@@ -44,7 +44,7 @@ bool libIRDB::IsParameterWrite(const FileIR_t *firp, Instruction_t* insn, string
 	{
 		// if it's a register
 //		if((d.Argument1.ArgType&REGISTER_TYPE)==REGISTER_TYPE)
-		if(d.getOperand(0).isRegister())
+		if(d.getOperand(0).isGeneralPurposeRegister())
 		{
 //			int regno=(d.Argument1.ArgType)&0xFFFF;
 			int regno=d.getOperand(0).getRegNumber();
-- 
GitLab