From 713231f2639a39d44a9954e7f85b2c1b81f1cfa3 Mon Sep 17 00:00:00 2001
From: nkennedy <nkennedy@git.zephyr-software.com>
Date: Fri, 3 Jan 2014 18:10:55 +0000
Subject: [PATCH] Some x64 register support. Anh, please review if this needs
 changing. ok nkennedy@ ip:peasoup

Former-commit-id: 7b3cef9f9539b9114c52b07f1c94b34d76b3ecc6
---
 libMEDSannotation/include/MEDS_Register.hpp |   2 +-
 libtransform/src/transform.cpp              | 118 ++++++++++++++++----
 2 files changed, 97 insertions(+), 23 deletions(-)

diff --git a/libMEDSannotation/include/MEDS_Register.hpp b/libMEDSannotation/include/MEDS_Register.hpp
index 5452489f0..6e57372cd 100644
--- a/libMEDSannotation/include/MEDS_Register.hpp
+++ b/libMEDSannotation/include/MEDS_Register.hpp
@@ -8,7 +8,7 @@ namespace MEDS_Annotation
 
 class Register {
 public:
-  enum RegisterName { UNKNOWN, EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, AX, BX, CX, DX, BP, SP, SI, DI, AH, BH, CH, DH, AL, BL, CL, DL };
+  enum RegisterName { UNKNOWN, EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, AX, BX, CX, DX, BP, SP, SI, DI, AH, BH, CH, DH, AL, BL, CL, DL, RAX, RBX, RCX, RDX, RBP, RSP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15, R8D, R9D, R10D, R11D, R12D, R13D, R14D, R15D, R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W, SIL, DIL, BPL, SPL, R8B, R9B, R10B, R11B, R12B, R13B, R14B, R15B };
   static RegisterName getRegister(std::string);
   static RegisterName getRegister(char *str);
   static bool is32bit(RegisterName);
diff --git a/libtransform/src/transform.cpp b/libtransform/src/transform.cpp
index a744d63d7..f00cda0de 100644
--- a/libtransform/src/transform.cpp
+++ b/libtransform/src/transform.cpp
@@ -83,43 +83,80 @@ void Transform::addPushRegister(Instruction_t *p_instr, Register::RegisterName p
 	string dataBits;
 	dataBits.resize(1);
 
-	if (p_reg == Register::EAX)
+	if (p_reg == Register::EAX || p_reg == Register::RAX)
 	{
 		dataBits[0] = 0x50; 
 	} 
-	else if (p_reg == Register::EBX)
+	else if (p_reg == Register::EBX || p_reg == Register::RBX)
 	{
 		dataBits[0] = 0x53; 
 	} 
-	else if (p_reg == Register::ECX)
+	else if (p_reg == Register::ECX || p_reg == Register::RCX)
 	{
 		dataBits[0] = 0x51; 
 	}
-	else if (p_reg == Register::EDX)
+	else if (p_reg == Register::EDX || p_reg == Register::RDX)
 	{
 		dataBits[0] = 0x52; 
 	}
-	else if (p_reg == Register::ESI)
+	else if (p_reg == Register::ESI || p_reg == Register::RSI)
 	{
 		dataBits[0] = 0x56; 
 	}
-	else if (p_reg == Register::EDI)
+	else if (p_reg == Register::EDI || p_reg == Register::RDI)
 	{
 		dataBits[0] = 0x57; 
 	}
-	else if (p_reg == Register::EBP)
+	else if (p_reg == Register::EBP || p_reg == Register::RBP)
 	{
 		dataBits[0] = 0x55; 
 	}
-	else if (p_reg == Register::ESP)
+	else if (p_reg == Register::ESP || p_reg == Register::RSP)
 	{
 		dataBits[0] = 0x54; 
 	}
 	else
 	{
-		cerr << "Transform::addPushRegister: unhandled register: " << p_reg << endl;
-		assert(0);
-		return;
+		dataBits.resize(2);
+		dataBits[0] = 0x41;
+		if (p_reg == Register::R8)
+		{
+			dataBits[1] = 0x50;
+		} 
+		else if (p_reg == Register::R9)
+		{
+			dataBits[1] = 0x51;
+		} 
+		else if (p_reg == Register::R10)
+		{
+			dataBits[1] = 0x52;
+		} 
+		else if (p_reg == Register::R11)
+		{
+			dataBits[1] = 0x53;
+		} 
+		else if (p_reg == Register::R12)
+		{
+			dataBits[1] = 0x54;
+		} 
+		else if (p_reg == Register::R13)
+		{
+			dataBits[1] = 0x55;
+		} 
+		else if (p_reg == Register::R14)
+		{
+			dataBits[1] = 0x56;
+		} 
+		else if (p_reg == Register::R15)
+		{
+			dataBits[1] = 0x57;
+		}
+		else
+		{
+			cerr << "Transform::addPushRegister: unhandled register: " << p_reg << endl;
+			assert(0);
+			return;
+		}
 	}
 
 	addInstruction(p_instr, dataBits, p_fallThrough, NULL);
@@ -130,43 +167,80 @@ void Transform::addPopRegister(Instruction_t *p_instr, Register::RegisterName p_
 	string dataBits;
 	dataBits.resize(1);
 
-	if (p_reg == Register::EAX)
+	if (p_reg == Register::EAX || p_reg == Register::RAX)
 	{
 		dataBits[0] = 0x58; 
 	} 
-	else if (p_reg == Register::EBX)
+	else if (p_reg == Register::EBX || p_reg == Register::RBX)
 	{
 		dataBits[0] = 0x5b; 
 	} 
-	else if (p_reg == Register::ECX)
+	else if (p_reg == Register::ECX || p_reg == Register::RCX)
 	{
 		dataBits[0] = 0x59; 
 	}
-	else if (p_reg == Register::EDX)
+	else if (p_reg == Register::EDX || p_reg == Register::RDX)
 	{
 		dataBits[0] = 0x5a; 
 	}
-	else if (p_reg == Register::ESI)
+	else if (p_reg == Register::ESI || p_reg == Register::RSI)
 	{
 		dataBits[0] = 0x5e; 
 	}
-	else if (p_reg == Register::EDI)
+	else if (p_reg == Register::EDI || p_reg == Register::RDI)
 	{
 		dataBits[0] = 0x5f; 
 	}
-	else if (p_reg == Register::EBP)
+	else if (p_reg == Register::EBP || p_reg == Register::RBP)
 	{
 		dataBits[0] = 0x5d; 
 	}
-	else if (p_reg == Register::ESP)
+	else if (p_reg == Register::ESP || p_reg == Register::RSP)
 	{
 		dataBits[0] = 0x5c; 
 	}
 	else
 	{
-		cerr << "Transform::addPopRegister: unhandled register";
-		assert(0);
-		return;
+		dataBits.resize(2);
+		dataBits[0] = 0x41;
+		if (p_reg == Register::R8)
+		{
+			dataBits[1] = 0x58;
+		} 
+		else if (p_reg == Register::R9)
+		{
+			dataBits[1] = 0x59;
+		} 
+		else if (p_reg == Register::R10)
+		{
+			dataBits[1] = 0x5a;
+		} 
+		else if (p_reg == Register::R11)
+		{
+			dataBits[1] = 0x5b;
+		} 
+		else if (p_reg == Register::R12)
+		{
+			dataBits[1] = 0x5c;
+		} 
+		else if (p_reg == Register::R13)
+		{
+			dataBits[1] = 0x5d;
+		} 
+		else if (p_reg == Register::R14)
+		{
+			dataBits[1] = 0x5e;
+		} 
+		else if (p_reg == Register::R15)
+		{
+			dataBits[1] = 0x5f;
+		}
+		else
+		{
+			cerr << "Transform::addPopRegister: unhandled register";
+			assert(0);
+			return;
+		}
 	}
 
 	addInstruction(p_instr, dataBits, p_fallThrough, NULL);
-- 
GitLab